【问题标题】:Java message not sending to server unless prior client instance is closed除非先前的客户端实例关闭,否则 Java 消息不会发送到服务器
【发布时间】:2017-07-06 05:20:13
【问题描述】:

我正在创建一个程序,其中服务器可以接收来自多个客户端的消息。客户端将创建连接并在单击按钮后发送信息,然后关闭连接(不是来回实时聊天程序)。

我现在遇到的问题是我运行服务器程序类,然后运行两个客户端程序两次(模拟两个用户连接)。但是,当我发送有关第二个创建的客户端类的信息时,直到第一个客户端关闭后,它才会通过或处理。

这也是我第一次使用套接字和线程,所以任何关于我做错了什么的建议都将不胜感激

我现在只是通过 static void mains 调用方法

    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) {
        }
    }
}

}

【问题讨论】:

    标签: java sockets server client chat


    【解决方案1】:

    您错误地陈述了问题。消息发送正常,但没有接收,因为您的服务器中存在错误:

    new ServerThread(socket).run();
    

    应该是:

    new ServerThread(socket).start();
    

    目前您的服务器不是多线程的,因此一次只能处理一个客户端。

    【讨论】:

    • 谢谢队友 :) 这个改变有效,我想我需要更多地查找线程而不是跟随教程
    • 我认为这是我在 youtube 上观看的一些随机 Java 套接字实时聊天示例的组合。但是我认为他们可能使用了实现 Runnable 而不是扩展 Thread 这就是为什么我可能对 start ¬_¬ 感到困惑
    • 我会很惊讶。 RunnableThread 对您是否应该使用 start() 没有区别。有官方教程可用时,请勿使用 YouTube。
    【解决方案2】:

    调用new ServerThread(socket).run() 不会启动单独的线程,而是在当前线程中执行运行方法。这就是为什么在第一个客户端断开连接之前没有与第二个客户端进行通信的原因。为了创建单独的线程,您必须使用 start() 而不是 run()

    【讨论】:

    • 谢谢队友 :) 这个改变有效,我想我需要更多地查找线程而不是跟随教程
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 2014-10-17
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多