【问题标题】:Java cannot read and write to socket at the same timeJava不能同时读写socket
【发布时间】:2017-06-02 18:06:50
【问题描述】:

我正在尝试使用 java 套接字构建一个简单的多客户端聊天应用程序。我这样做的方法是让一个客户端类连接到一个等待客户端连接并创建一个新线程来处理该客户端的服务器类(读取和写入套接字连接的位置)。客户端还读取和写入到该线程的套接字连接。但是,当客户端写入套接字的输出流时,服务器不会响应。这里发布了一个类似的问题:

Can you write to a sockets input and output stream at the same time?

这里的一个答案说,只要在单独的线程上从套接字读取,您就可以同时读取和写入套接字。

这是我的客户端应用程序:

    public class Client {

    Socket socket;

    public static void main(String[] args) {
        new Client();
    }

    public Client() {
        try {
            socket = new Socket("localhost", 4444);

            new Thread() {

                @Override
                public void run() { //read from the input stream

                    try(
                        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    ) {
                        String line;
                        while( (line = in.readLine()) != null ) {
                            System.out.println("Server said: " + line);
                        }
                    } catch(IOException e) {

                    }

                }

            }.start();

            //write to output stream
            try(
                PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
                Scanner userInput = new Scanner(System.in);
            ){
                System.out.println("Enter Something: ");
                if(userInput.hasNextLine()) {
                    out.println(userInput.nextLine());
                }
            } catch (IOException e) {

            }

        } catch(IOException e) {

        }


    }
}

还有我的服务器应用程序:

public class Server {
    ServerSocket ss;


    public static void main(String[] args) {
        new Server();
    }

    public Server() {
        System.out.println("Server Running...");
        try {
            ss = new ServerSocket(4444);

            while(true) {


                Socket socket = ss.accept();
                new Thread() { //create new thread connection to client
                    @Override
                    public void run() {

                        new Thread() { //thread that reads inputstream
                            @Override
                            public void run() {

                                try(
                                    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                                ) {
                                    String line;
                                    while( (line = in.readLine()) != null ) {
                                        System.out.println("Client said: " + line);
                                        //The problem seems to lie here.
                                    }
                                } catch(IOException e) {

                                }

                            }
                        }.start();

                        //write to outputstream
                        try (
                            PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
                        ) {
                            String sendToClient = "Hey, my name is Server007 B)";

                            out.println(sendToClient);

                        } catch(IOException e) {

                        }
                    }
                }.start();

            }


        } catch (IOException e) {}
    }
}

我将运行服务器,然后运行客户端,在客户端输出是

Server said: Hey, my name is Server007
Enter something: 
Hello! <- enter anything

但服务器没有打印“客户说:你好!”就像我预期的那样。我希望我把我的问题说清楚了,谢谢。

【问题讨论】:

    标签: java multithreading sockets


    【解决方案1】:

    好的,所以我想通了,我会回答我自己的问题,以防有人犯同样的错误。 PrintWriter 构造函数应该是这样的:

    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
    

    不是这个:

    PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
    

    或者,我可以这样做:

    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    

    我一定是对 BufferedWriter 和 PrintWriter 感到困惑:P

    【讨论】:

      猜你喜欢
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多