Java 多次连接到插座
好的,当我第一次连接时,一切正常。但当我再次连接时(不停止服务器程序),它会显示“连接被拒绝:连接”。我认为这是因为我只接受了一次连接,所以我使用了一个swing计时器,每10毫秒触发一次操作事件,每次操作事件触发时,它都会将clientSocket设置为serverSocket.accept()(clientSocket=serverSocket.accept();)因此代码如下:Java 多次连接到插座,java,sockets,serversocket,reconnect,Java,Sockets,Serversocket,Reconnect,好的,当我第一次连接时,一切正常。但当我再次连接时(不停止服务器程序),它会显示“连接被拒绝:连接”。我认为这是因为我只接受了一次连接,所以我使用了一个swing计时器,每10毫秒触发一次操作事件,每次操作事件触发时,它都会将clientSocket设置为serverSocket.accept()(clientSocket=serverSocket.accept();)因此代码如下: package org.code; import java.net.*; import java.io.*;
package org.code;
import java.net.*;
import java.io.*;
public class MainClass {
public static void main(String[] args) {
new MainClass();
}
Socket server = null;
PrintWriter out = null;
public MainClass() {
try {
server = new Socket("192.168.0.104", 4444);
out = new PrintWriter(server.getOutputStream(), true);
out.println("start");
out.close();
server.close();
} catch(Exception ex) {ex.printStackTrace();}
}
}
以及:
是的,当前实现的问题是它只等待第一个客户端,然后服务器停止。选中最后一项“支持多个客户端”。通常,支持多个客户端的模式如下:
while (true) {
accept a connection;
create a thread to deal with the client;
}
您的服务器程序(顺便说一句,它与客户端程序具有完全相同的类名,这不是很明智),只接受一个连接
一旦它完成了与第一个客户机的对话,它就结束了。您认为它仍在侦听,因为帧仍然可见,但主方法已结束
如果要接受多个连续连接,则应该有一个循环。如果需要多个并行连接,则应该生成线程 每次请求后,代码都会关闭服务器套接字(并停止) 这更有可能奏效。(我没有测试它,但通过它,您可以得到场景)
问题就在这里。现在关闭服务器套接字没有任何意义,因为您已经完成了一个客户端。这里的问题到底是什么?谢谢!这是一个懒惰的错误lol。我将经历另一个程序的麻烦,该程序将检查服务器是否打开,如果没有,打开它。
while (true) {
accept a connection;
create a thread to deal with the client;
}
// in your main
serverSocket = new ServerSocket(4444);
try {
while (true) {
clientSocket = serverSocket.accept();
Thread t = new ClientSocketThread(clientSocket);
t.start();
}
} finally {
serverSocket.close();
}
class ClientSocketThread extends Thread {
final Socket clientSocket;
ClientSocketThread(Socket clientSocket) {
this.clientSocket = clientSocket;
}
public void run() {
InputStream in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
try
String inputLine;
while((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
if(inputLine.equals("start")) {
System.out.println("Good");
}
if(inputLine.equals("stop")) {
System.out.println("Bad");
}
}
} finally {
in.close()
clientSocket.close();
}
}
}
clientSocket.close();
serverSocket.close();