我正在开发一个包含服务器和客户端的简单聊天应用程序。我想在运行时只使用一个套接字对象。示例(Java客户端):
class POClient
{
Socket socket;
BufferedWriter out;
POClient()
{
socket = new Socket("192.168.1.3", 4445);
OutputStreamWriter osw = new OutputStreamWriter( socket.getOutputStream());
out = new BufferedWriter(osw);
}
void SendMessage()
{
out.write("Hello");
out.flush();//edit
// On this line, I need to use out.close() but if I close it, also
// socket will be closed. I don't wanna this. I wanna use only one instance.
}
}
C#服务器:
TcpClient client = listener.AcceptTcpClient(); //if a connection exists, the server will accept it
StreamWriter writer = new StreamWriter(client.GetStream());
StreamReader reader = new System.IO.StreamReader(client.GetStream());
try
{
string line = "";
while (true)
{
line = reader.ReadToEnd();
}
}
如果我不使用out.close(),'读者'等到out.close()
我在哪里失败?
答案 0 :(得分:1)
我认为ReadToEnd
需要关闭连接。您必须使用其他方法,例如Read()
。
在这种情况下,你必须创建一个简单的协议,最简单的形式是:
| 4字节的数据Len | ----数据----- |
然后你会知道阅读多少,然后阅读它。在这种情况下,您不必关闭连接。
在将长度转换为字节数组并返回时,请务必考虑endien问题(如果有的话)。
答案 1 :(得分:0)
尝试使用StreamReader.ReadLine()
代替StreamReader.ReadToEnd()
,然后out.flush()
添加out.newLine()
。这应该在新行中写入每条消息并按行读取。
答案 2 :(得分:-1)
我认为你必须冲洗你的作家。这样做:
out.flush();
答案 3 :(得分:-1)
我认为您需要致电out.flush()
。
BufferedWriter
的意思是它将数据写入内存缓冲区,并且只在缓冲区已满或调用flush()
时才将其发送到实际的套接字。这是出于性能原因,例如,进行一系列调用以将少量数据放入BufferedWriter
,然后对套接字上的send
进行一次调用以实际发送它会更有效率在网络上。请注意,它在您调用out.close()
时有效,因为close
方法会在关闭基础流之前刷新编写器。