【问题标题】:Java - Socket not reading until client disconnects?Java - 直到客户端断开连接才读取套接字?
【发布时间】:2011-09-28 21:51:00
【问题描述】:

所以我用 Java 制作了一个带有套接字的服务器和客户端。我试图让服务器从套接字读取/写入,但它只在客户端断开连接时读取:

        System.out.println("Server initialized");
        clientSocket = server.accept();
        System.out.println("Client connected");

        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

        for(int loop = 0;loop<5;loop++){
            out.write("Hello");
            System.out.println(in.readLine());
        }   //end for

问题是,一旦客户端连接,它会显示“客户端已连接”,但它不会通过 for 循环运行。但是,一旦客户端断开连接,服务器就会执行 for 循环并返回

null
null
null
null
null

我在这里缺少什么?这是我的完整服务器代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public ServerSocket server;

    public Server(int port){
        try {
            server = new ServerSocket(port);
        } catch (IOException e) {
            System.out.println("Cannot bind to port: "+ port);
            System.exit(-1);
        }

    }   //end constructor

    public void WaitForClient() throws IOException{
        Socket clientSocket = null;

        try {
            System.out.println("Server initialized");
            clientSocket = server.accept();
            System.out.println("Client connected");

            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

            for(int loop = 0;loop<5;loop++){
                out.write("Hello");
                System.out.println(in.readLine());
            }   //end for

        }   //end try
        catch (IOException e) {
            System.out.println("Accept failed");
            System.exit(-1);
        }   //end catch

        clientSocket.close();
        server.close();

    }   //end method

}   //end class

(我的主要方法是从另一个类调用的。)

【问题讨论】:

    标签: java sockets client


    【解决方案1】:

    如果您想立即看到结果,您必须刷新服务器上的流。流在close() 上自动刷新,这就是您看到输出的原因。

    【讨论】:

    • 我应该在哪里添加冲洗?在我的 for 循环中?
    • 没关系-它返回null,因为客户端没有写任何东西xD
    【解决方案2】:

    乍一看,您对 in.readLine() 的调用似乎被阻塞了,因为它还没有遇到换行符。

    因此,它会一直阻塞,直到您的连接断开。

    试试BufferedReader的读取方法:

    public int read(char[] cbuf,
           int off,
           int len)
    

    并传入一个固定长度的数组如:

    char[] cbuf = new char[1024];
    

    使用读取调用的返回值查看上次读取的字节数(0-1024) 如果您阅读 1024,则可能会阅读更多内容。如果你读到 0,那么很可能没有更多的读物了。

    【讨论】:

      【解决方案3】:

      你在读行,但不是在写。 write() 不会写入换行符,readLine() 会阻塞直到收到换行符。

      【讨论】:

        【解决方案4】:

        这是从客户端接受字符串的服务器端代码,但根据我的代码,您将使用 DataInputStream 和 DataOutputStream 而不是 PrintWriter 和 BufferedReader。

        此代码完全适用于一对一客户..

        在代码中“jta”是 JTextArea ..

        soc = server.accept();

        当(真)

        {

                String data="";
                    try
                    {                   
                        dis = new DataInputStream(soc.getInputStream());
                        dos = new DataOutputStream(soc.getOutputStream());
                        data = dis.readUTF();
                    }
                    catch(Exception e)
                    { }
                    jta.append(data + "\n");
                }
        

        【讨论】:

        • 他没有使用这些流。这是一个替代解决方案。
        猜你喜欢
        • 2013-09-20
        • 1970-01-01
        • 1970-01-01
        • 2010-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        相关资源
        最近更新 更多