在不同时间仅使用一个套接字发送消息

时间:2014-10-24 21:41:22

标签: java sockets

我正在开发一个包含服务器和客户端的简单聊天应用程序。我想在运行时只使用一个套接字对象。示例(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()

我在哪里失败?

4 个答案:

答案 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方法会在关闭基础流之前刷新编写器。