2013-07-27 54 views
0

我正在编写Java客户端/服务器应用程序。它应该允许客户端将文本数据发送到服务器。这种通信应该使用相同的连接重复多次。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。我怎样才能连续发送和读取数据?

+2

摆脱ready()测试。除了一个bug之外,它什么也没有加 – EJP

回答

2

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

+2

这里的通信是单向的。为什么你需要一个额外的线程? – Joni

1

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

是的,你可以。你不能去readLine()返回null的情况。这不是一回事。

或者我不能再次打开客户端上的OutputStream,如果它已经关闭。

当然不是。你必须创建一个新的套接字。

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

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

1

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

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