C# - 多线程服务器中的客户端流

时间:2013-04-29 07:10:08

标签: c# multithreading client-server networkstream

我已经实现了发送消息客户端 - >服务器并实际连接多个客户端。但我想要做的是连接2个客户端并让他们自己聊天。如果第三个客户端连接 - 那么他就开始与其他客户聊天。

到目前为止,我正处于与另一个c-> s-> c分开聊天客户 - >服务器 - >客户端的阶段。会发生什么 - 我运行client1,一切正常。然后我运行client2并且使用它一切正常,但第一个客户端停止工作,然后我在第二个客户端上获取的第一条消息是我从client1发送的最后一条消息(但实际上并没有从服务器接收到它)。  所以我认为流有问题 - 两个客户端以某种方式获取彼此的流。  以下是服务器的某些部分(相关部分):TheServer

HandleClientComm(对象客户端)正在处理接收发送操作。

这是客户端代码部分,它处理接收 - 发送操作:TheClient

我明白了 An unhandled exception of type 'System.OutOfMemoryException' occurred... in  在服务器上 Byte[] bData = new Byte[BitConverter.ToInt32(bSize, 0)];

sooo ...是的,溪流有问题(我认为)。但我真的不知道服务器如何正确区分客户端的线程。

我愿意接受任何建议。

P.S。我不是直接在这里发布代码,因为它会花太长时间。

1 个答案:

答案 0 :(得分:1)

这是HandleClientComm()的第一部分:

private void HandleClientComm(object client)
{
    TcpClient tcpClient = (TcpClient)client;
    NetworkStream stm = clientList[n].GetStream();
    msg = new TheMessage();

您拥有tcpClient,这是您作为参数发送的客户端,但NetworkStream不是 客户端,而是clientList[n]n是一个全班变量。稍后在该方法中,在while循环中,您使用:

    stm = clientList[n].GetStream();

一旦增加n,所有运行HandleClientComm()的线程都将从/向最后一个客户端接收和发送消息。

NetworkStream中使用的HandleClientComm()应该是从tpcClient创建的,因此每个运行HandleClientComm()的线程都会为自己的客户端提供服务:

    stm = theClient.GetStream();