java - 通过Socket发送连续数据

时间:2013-07-27 10:05:33

标签: java sockets

我正在编写Java客户端/服务器应用程序。它应该允许客户端将文本数据发送到服务器。使用相同的连接,这种通信应该可重复多次。

我这样写:

// On a server:
ServerSocket serverSocket = new ServerSocket(port);
Socket socket = serverSocket.accept();
socket.setKeepAlive(true);
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
if (reader.ready()) {
    for (String line = reader.readLine(); line != null; line = reader.readLine()) {
        // do something with line
    }
}

// On a client:
Socket socket = new Socket(host, port);
socket.setKeepAlive(true);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.write("Some data from client to server");
writer.flush();

问题是:在关闭客户端上的OutputStream之前,我无法在服务器上读取。或者,如果已经关闭,我无法再次在客户端上打开OutputStream。如何连续发送和读取数据?

3 个答案:

答案 0 :(得分:2)

两端需要两个线程,一个用于读取数据,另一个用于写入数据。

答案 1 :(得分:1)

  

问题是:在关闭客户端上的OutputStream之前,我无法在服务器上读取。

是的,你可以。你无法达到readLine()返回null的情况。这不是一回事。

  

或者我无法再次在客户端上打开OutputStream,如果它已经关闭。

当然不是。你必须创建一个新的Socket。

  

如何连续发送和接收数据?

我不明白这个问题。您发布的代码不会尝试。

答案 2 :(得分:1)

如果您的目标是通过同一套接字连接发送许多消息,则这些消息必须由应用程序级协议分隔。换句话说,您将无法依赖reader.ready()reader.readLine() == null等任何系统调用来检测服务器上的消息结束。

实现此目的的一种方法是以字符长度开始每条消息。然后,服务器将准确读取该数量的字符,然后停止并等待新消息。另一种方法是定义一个特殊的字符序列,用于汇总每条消息。服务器将通过结束当前消息的读取并返回到“等待新消息”状态来响应读取该特定序列。您必须确保此序列永远不会出现在邮件本身中。