Java - 在客户端断开连接之前不会读取套接字?

时间:2011-09-27 12:38:55

标签: java sockets client

所以我用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

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

尝试BufferedReader的读取方法:

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

并传入固定长度的数组,例如:

char[] cbuf = new char[1024];

使用读取调用的返回值来查看上次读取的字节数(0-1024) 如果您阅读1024,则可能会阅读更多内容。如果您读为0,则可能无法阅读。

答案 2 :(得分:1)

你正在读行,但你没有写它们。 write()不会写一个换行符,readLine()会阻塞,直到收到换行符。

答案 3 :(得分:-1)

它是服务器端用于接受来自客户端的字符串的代码,但根据我的代码,您将使用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");
        }