Java消息不会发送到服务器,除非之前的客户端实例已关闭
我正在创建一个程序,其中服务器可以接收来自多个客户端的消息。客户端将创建连接,然后单击按钮发送信息,然后关闭连接(不是来回的实时聊天程序) 我现在遇到的问题是,我运行服务器程序类,然后运行两次客户端程序(以模拟两个用户连接)。但是,当我发送关于第二个创建的客户机类的信息时,在第一个客户机关闭之前,它不会通过或被处理 这也是我第一次使用套接字和线程,所以如果您对我的错误有任何建议,我们将不胜感激 我现在只是通过静态调用这些方法Java消息不会发送到服务器,除非之前的客户端实例已关闭,java,sockets,server,client,chat,Java,Sockets,Server,Client,Chat,我正在创建一个程序,其中服务器可以接收来自多个客户端的消息。客户端将创建连接,然后单击按钮发送信息,然后关闭连接(不是来回的实时聊天程序) 我现在遇到的问题是,我运行服务器程序类,然后运行两次客户端程序(以模拟两个用户连接)。但是,当我发送关于第二个创建的客户机类的信息时,在第一个客户机关闭之前,它不会通过或被处理 这也是我第一次使用套接字和线程,所以如果您对我的错误有任何建议,我们将不胜感激 我现在只是通过静态调用这些方法 new Server().runServer(); publ
new Server().runServer();
public void runServer() throws SocketException, IOException{
serverSocket = new ServerSocket(PORT);
System.out.println("Server up");
while(true){
Socket socket = serverSocket.accept();
new ServerThread(socket).run();
}
}
public class ServerThread extends Thread{ //
Socket socket;
ServerThread(Socket socket){
this.socket = socket;
}
@Override
public void run(){
try {
String message = null;
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while ((message = bufferedReader.readLine()) != null){
Server.addToQueue(message);
}
} catch (IOException ex) {
} finally{
try {
if (socket != null)
socket.close();
} catch (IOException ex) {
}
}
}
}
}
客户端代码如下所示:
public class Client {
public static void main(String[]args){
sendToServer();
}
public static void sendToServer(){
String readerInput;
Socket socket = null;
PrintWriter printWriter = null;
try {
socket = new Socket("localhost", 4444);
printWriter = new PrintWriter(socket.getOutputStream(), true);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
readerInput = bufferedReader.readLine();
printWriter.println(readerInput);
} catch (IOException ex) {
} finally{
try {
socket.close();
} catch (IOException ex) {
}
}
}
}你把问题说错了。消息已正常发送,但未收到,因为服务器中存在错误:
new ServerThread(socket).run();
这应该是:
new ServerThread(socket).start();
目前,您的服务器不是多线程的,因此一次只能处理一个客户端。调用
新服务器线程(socket)。run()
不会启动单独的线程,而是在当前线程中执行run方法。这就是为什么在第一个客户端断开连接之前,无法与第二个客户端进行通信的原因。为了创建单独的线程,您必须使用start()
而不是run()
谢谢,伙计:)这一改变奏效了,我想我需要更多地查找线程,而不是遵循教程。我想这是我在youtube上观看的几个随机java socket实时聊天示例的组合。然而,我认为他们可能使用了可运行的实现,而不是扩展线程,这就是为什么我可能会将run与start混淆的原因,我会感到惊讶Runnable
vs.Thread
对于是否应该使用start()
没有区别。当有官方教程可用时,不要使用YouTube。谢谢,伙计:)这项更改奏效了,我想我需要更多地查找线程,而不是遵循教程