Java 添加一个线程,每次仅处理1个套接字
如何在代码中添加一个线程,使其每次只允许1个连接。。。当它结束时。关闭();再次打开等待另一个?我尝试了很多其他的事情,比如WHILE、if和其他变量,但未能阻止.accept();连接打开时;/,而且我不知道如何使它成为一个线程Java 添加一个线程,每次仅处理1个套接字,java,multithreading,sockets,Java,Multithreading,Sockets,如何在代码中添加一个线程,使其每次只允许1个连接。。。当它结束时。关闭();再次打开等待另一个?我尝试了很多其他的事情,比如WHILE、if和其他变量,但未能阻止.accept();连接打开时;/,而且我不知道如何使它成为一个线程 import java.awt.Desktop; import java.io.*; import java.lang.reflect.Array; import java.net.*; import java.util.ArrayList; import java
import java.awt.Desktop;
import java.io.*;
import java.lang.reflect.Array;
import java.net.*;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
public class Provider {
ServerSocket providerSocket;
Socket connection = null;
ObjectOutputStream out;
String ocupado = "0";
ObjectInputStream in;
String caminhodoarquivo;
Provider(){}
void run()
{
try{
providerSocket = new ServerSocket(2004, 1);
System.out.println("---------------Aguardando por certidões----------------");
connection = providerSocket.accept();
out = new ObjectOutputStream(this.connection.getOutputStream());
out.flush();
sendMessage(ocupado);
in = new ObjectInputStream(connection.getInputStream());
System.out.println("Certidão de: " + connection.getInetAddress().getHostName());
String ocupado = "1";
try{
caminhodoarquivo = (String)in.readObject();
System.out.println("Certidão: " + caminhodoarquivo);
JTextField paginainicial = new JTextField();
JTextField paginafinal = new JTextField();
Object[] message = {
"Número da Primeira Folha: ", paginainicial,
"Número Última Folha: ", paginafinal,
};
int option = JOptionPane.showConfirmDialog(null, message, "Dados da Certidão", JOptionPane.OK_CANCEL_OPTION);
ocupado = "1";
if (option == JOptionPane.OK_OPTION) {
String primeirafolha = paginainicial.getText();
String ultimafolha = paginafinal.getText();
metodos metodosBD = new metodos();
metodosBD.atualizafolha(primeirafolha, ultimafolha, caminhodoarquivo);
System.out.println("Dados inseridos.");
Desktop.getDesktop().print(new File(caminhodoarquivo));
ocupado = "0";
} else {
System.out.println("Certidão Cancelada.");
}
}
catch(ClassNotFoundException classnot){
System.err.println("Data received in unknown format");
out.close();
in.close();
providerSocket.close();
}
}
catch(IOException ioException){
ioException.printStackTrace();
}
finally{
//4: Closing connection
try{
in.close();
out.close();
providerSocket.close();
}
catch(IOException ioException){
ioException.printStackTrace();
}
}
}
void sendMessage(String msg)
{
try{
out.writeObject(msg);
out.flush();
}
catch(IOException ioException){
ioException.printStackTrace();
}
}
public static void main(String args[])
{
Provider server = new Provider();
while(true){
server.run();
}
}
}
编辑用户251414的答案
1) 服务器运行正常,完美地接收到第一个连接,并在我关闭confirmdialog时完成它,我可以打开另一个完美的=ok
2) 当我连接client1时,保持confirmdialog打开,并尝试连接第二个客户端。我在CLIENT2中收到此错误:
java.net.SocketException: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.io.ObjectInputStream$PeekInputStream.read(Unknown Source)
at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Sour
ce)
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at certidoesOrganizado.PrimeiroPDF$Requester.run(PrimeiroPDF.java:151)
at certidoesOrganizado.PrimeiroPDF.enviacaminho(PrimeiroPDF.java:132)
at certidoesOrganizado.PrimeiroPDF.geracertidao(PrimeiroPDF.java:466)
at certidoesOrganizado.PrimeiroPDF.pegadados(PrimeiroPDF.java:302)
at certidoesOrganizado.gui$6.actionPerformed(gui.java:204)
客户端2没有收到“服务器正忙”消息
3) 当client1 ConfirmDialog仍然打开时,在Client2失败后,我尝试CLIENT3,它成功连接,我以2 Joption.ShowConfirmDialog打开结束…:(
然后一切又开始了,我在客户端使用这个来进行连接:
在调用连接的方法中:
Requester client = new Requester();
client.run();
类请求者:
}
class Requester{
Socket requestSock
et;
ObjectOutputStream out;
ObjectInputStream in;
String message;
Requester(){}
void run()
{
try{
requestSocket = new Socket("localhost", 2004);
System.out.println("Tentando Conexão");
out = new ObjectOutputStream(requestSocket.getOutputStream());
out.flush();
System.out.println("out.flush");
in = new ObjectInputStream(requestSocket.getInputStream());
try {
message = (String)in.readObject();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
do{
message = "oi";
sendMessage(arquivonomecompleto);
}while(message.equals("bye"));
}
catch(UnknownHostException unknownHost){
System.err.println("You are trying to connect to an unknown host!");
}
catch(IOException ioException){
ioException.printStackTrace();
}
finally{
//4: Closing connection
try{
in.close();
out.close();
requestSocket.close();
}
catch(IOException ioException){
ioException.printStackTrace();
}
}
}
void sendMessage(String msg)
{
try{
out.writeObject(msg);
out.flush();
//System.out.println("client>" + msg);
}
catch(IOException ioException){
ioException.printStackTrace();
}
}
}
我看到你的代码是单线程的,没有其他线程的迹象,一切都是由主线程运行的,其次我对某些部分有点困惑,首先你在得到输出后刷新它,我的意思是你除了刷新它之外不发送任何东西
out = new ObjectOutputStream(this.connection.getOutputStream());
out.flush();
那么,您如何看待应用程序并行运行
关于在另一个线程(和单个线程)中运行连接进程,这不是一项非常困难的工作,首先实现Runnable接口,让run方法处理连接处理
public class Provider implements Runnable {
...
public void run(){//manages the connection but ONE at a time.
while(true){
server.run();
}
}
public static void main(String[] arg){
Provider server = new Provider();
new Thread(this).start();//start the connection processing with another thread.
}
...
}
你也会有一个简单的。
有一个好的并行程序,伙计:)
更新:对于在第一个过程中拒绝第二个过程(带有一些消息),因此这也不是一项困难的工作,但第一件事是使过程并行,为此,我将主方法放入(剪切)另一个类中,让提供者类处理请求,同时保留ServerSocket(端口)OEPN
注意:当服务器忙时,这一个响应“Error->Server is busy”作为一个字符串,所以客户端需要检查服务器是否响应单个字符串“Error->Server is busy”,这意味着服务器没有响应任何其他内容
class Server implements Runnable{
private final String serverBusyMessage="Error -> Server is busy";
private ServerSocket ss;
private static volatile boolean busy=false;
public static void setFree(){busy=false;}
public void run(){
while(true){
try{Socket s=ss.accept();
if(busy){//if there is one connection processing.
ObjectOutputStream out=new ObjectOutputStream(s.getOutputStream());
out.writeObject(serverBusyMessage);
out.flush();
s.close();continue;
}
System.out.println("---------------Aguardando por certidões----------------");
new Thread(new Provider(s)).start();
busy=true;
}catch(Exception e){}
}
}
private Server(){try{ss=new ServerSocket(2004);}catch(Exception ex){}}
public static void main(String[] arg){
Server server = new Server();
new Thread(server).start();
}
}
flush是previsoly,我最后使用了sendmages,但是我删除了它,我忘记了删除out;对不起!!非常感谢这一课:)好的,好的,我明白了,你知道应用程序工作正常,因为客户端会连接,但没有响应,所以现在你想用一些消息拒绝第二个,对吗?!好的,我会更新我的答案。我很高兴(如果)我能帮忙,我会再次更新答案(在最后一个命令后1分钟,所以请刷新页面,因为你可能会得到旧的):@user2582318我更新了,我只是忘记了一个关键字,请重新检查,希望这次能奏效。@user2582318我真的很高兴我能帮忙,有一个好的套接字应用程序伙伴:)
import java.awt.Desktop;
import java.io.*;
import java.lang.reflect.Array;
import java.net.*;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
public class Provider implements Runnable {
// ServerSocket providerSocket;
Socket connection = null;
ObjectOutputStream out;
String ocupado = "0";
ObjectInputStream in;
String caminhodoarquivo;
Provider(Socket s){this.connection=s;}
@Override
public void run()
{
try{
out = new ObjectOutputStream(this.connection.getOutputStream());
//out.flush();
sendMessage(ocupado);
in = new ObjectInputStream(connection.getInputStream());
System.out.println("Certidão de: " + connection.getInetAddress().getHostName());
String ocupado = "1";
try{
caminhodoarquivo = (String)in.readObject();
System.out.println("Certidão: " + caminhodoarquivo);
JTextField paginainicial = new JTextField();
JTextField paginafinal = new JTextField();
Object[] message = {
"Número da Primeira Folha: ", paginainicial,
"Número Última Folha: ", paginafinal,
};
int option = JOptionPane.showConfirmDialog(null, message, "Dados da Certidão", JOptionPane.OK_CANCEL_OPTION);
ocupado = "1";
if (option == JOptionPane.OK_OPTION) {
String primeirafolha = paginainicial.getText();
String ultimafolha = paginafinal.getText();
metodos metodosBD = new metodos();
metodosBD.atualizafolha(primeirafolha, ultimafolha, caminhodoarquivo);
System.out.println("Dados inseridos.");
Desktop.getDesktop().print(new File(caminhodoarquivo));
ocupado = "0";
}else {System.out.println("Certidão Cancelada.");}
}catch(ClassNotFoundException classnot){
System.err.println("Data received in unknown format");
out.close();
in.close();
connection.close();
}
}
catch(IOException ioException){ioException.printStackTrace();}
finally{
Server.setFree();//Tells server the system is ready for new connection.
//4: Closing connection
try{
in.close();
out.close();
connection.close();
}
catch(IOException ioException){
ioException.printStackTrace();
}
}
}
void sendMessage(String msg)
{
try{
out.writeObject(msg);
out.flush();
}
catch(IOException ioException){
ioException.printStackTrace();
}
}
// public static void main(String args[])
// {
// Provider server = new Provider();
// while(true){
// server.run();
// }
// }
}
class Server implements Runnable{
private final String serverBusyMessage="Error -> Server is busy";
private ServerSocket ss;
private static volatile boolean busy=false;
public static void setFree(){busy=false;}
public void run(){
while(true){
try{Socket s=ss.accept();
if(busy){//if there is one connection processing.
ObjectOutputStream out=new ObjectOutputStream(s.getOutputStream());
out.writeObject(serverBusyMessage);
out.flush();
s.close();continue;
}
System.out.println("---------------Aguardando por certidões----------------");
new Thread(new Provider(s)).start();
busy=true;
}catch(Exception e){}
}
}
private Server(){try{ss=new ServerSocket(2004);}catch(Exception ex){}}
public static void main(String[] arg){
Server server = new Server();
new Thread(server).start();
}
}