当前位置: 首页 > 知识库问答 >
问题:

Java不能同时读取和写入套接字

暴骏奇
2023-03-14

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

您可以同时写入套接字输入和输出流吗?

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

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

    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

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

共有1个答案

束阳旭
2023-03-14

好吧,我想好了,我会回答我自己的问题,以防有人犯同样的错误。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

 类似资料:
  • 我正在尝试用套接字从客户端向服务器写入一个结构。 结构是: 这两个程序(服务器、客户机)的结构是相同的,并且这两个程序的结构是相同的。 客户端程序: 结构R*r; 马洛克.. ...(用数据填充结构) write(socket_fd,(void*)r,size of(R)); 服务器程序: 结构R*r; 马洛克.. read(client_fd,(R*)r,size of(R)); 这不是将结构从

  • 在我的客户端/服务器应用程序中,我的客户端wiil与服务器通信有两个功能:客户端要么向服务器请求数据,要么发送数据,以便服务器保存。我对这两种方法都使用一个套接字,要使用的方法由发送的第一个字节定义。如果第一个字节是“1”,它将请求数据。如果是“2”,它将发送数据(数据字节在“2”字节之后发送)。它非常适合发送数据。但是当我请求数据时,只要我不读取客户端中的套接字流,它就可以工作。这就像如果我在发

  • 是否可以同时从套接字读取和写入?我有一个连续读取套接字的线程。由于只有一个线程从套接字读取,因此读取操作是线程安全的。现在我有很多线程(比如 100 个)写入套接字。因此,很明显,我必须通过做这样的事情来使写入操作线程安全, 现在我有一个线程不断调用readMessage()函数(在while循环中)。据我所知,如果套接字上没有要读取的消息,语句< code > inputstream . rea

  • 如何写这个问题?老实说,我不明白这个问题的意思。A) 编写读者和作者优先于读者的解决方案,并评论每个信号量的功能。(记住变量和信号量的定义和初始化)B)读卡器的优先级意味着什么?当一个作家在写作时,到达的读者会发生什么?当编写器结束其操作时会发生什么?

  • 问题内容: 我试图呼吁一个非常繁重的过程。平均工作时间估计为9-10分钟。 当我执行该过程时,我为一个巨大的数字设置了超时时间:99999999。 2分钟后,出现以下错误: java.net.SocketTimeoutException:读取超时 我尝试对其进行更多处理,并将超时设置为3000,并且在预期的3秒钟后出现了相同的错误。 您对为什么将其设置为最大120000 有任何想法吗? 问题答案:

  • 我有一个小问题与Android和IOS之间实现套接字连接。当我使用我的应用程序连接两个Android运行设备时,一切正常。但是当我必须从Iphone应用程序接收一些数据时,我的readStream函数被阻塞,我可以在另一个部分关闭套接字后接收所有数据,这样我就不能返回任何响应。以下是我用来听的: 这里是我用来将转换为的函数: Iphone/Android应用程序的工作原理如下: 首先,它创建Soc