【问题标题】:Send client side data Queue to server side through Tcp/IP通过 Tcp/IP 将客户端数据队列发送到服务器端
【发布时间】:2011-07-23 07:32:31
【问题描述】:

我想将数据从客户端发送到服务器。有两个队列。在客户端和服务器端。我希望我的客户端连接到服务器并将客户端队列中的所有数据发送到服务器。在服务器端,我想接受所有客户端并获取所有对象并添加到服务器端队列

客户端代码:

Queue<Person> clientQueue;   // This is the client side queue

IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 15884);
var client = new TcpClient();

while(!clientQueue.IsEmpty)
{
    Person personObj = clientQueue.Dequeue();

    client.Connect(serverEndPoint);
    NetworkStream clientStream = client.GetStream();
    BinaryFormatter bf = new BinaryFormatter();
    bf.Serialize(clientStream, personObj);
    clientStream.Flush();
}

服务器端:

Queue<Person> serverQueue;   // This is the server side queue

IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 15884);
TcpListener tcpListener = new TcpListener(ipEndPoint);


while(true)
{
    TcpClient client = tcpListener.AcceptTcpClient();
    NetworkStream clientStream = tcpClient.GetStream();
    BinaryFormatter bf = new BinaryFormatter();
    Person person = (Person)bf.Deserialize(clientStream);
    tcpClient.Close();

    serverQueue.Enqueue(person);
}

我知道上面的代码不起作用。我只是想画出我的设计。有人可以把代码示例发给我吗。如何将客户端队列发送到服务器队列..

谢谢..

【问题讨论】:

  • “上面的代码不起作用”不是很具有描述性。尝试后会发生什么?
  • 你使用的.net框架是什么?
  • @Jon :我已经开发了这个,连接到服务器 -> 只发送一个对象 -> 处理客户端。现在我需要更改我的程序以将数据队列发送到服务器端。我不知道如何更改我的程序以将整个队列发送到服务器端。这就是为什么我在这里只放一个粗略的代码。 :)
  • @Kushan:除了你的服务器假设每个连接只有一个人,但你试图从客户端下推多个对象之外,它应该可以按照你的方式工作。它不会很有效,但它会是一个起点。先做一些简单的工作,然后再继续。
  • @Jon。是的,乔恩。服务器已经假设每个连接一个人。但是现在我需要更改我的程序以从每个客户那里获取多个人员(人员队列)。在这里我不知道如何开发它..

标签: c# sockets tcp client-server binary-serialization


【解决方案1】:
    1234563检查this
  1. 在服务器端,您应该使用异步方法或只是实例化一个新线程来处理每个新客户端,然后在该线程读取数据。喜欢:

    TcpClient client = tcpListener.AcceptTcpClient();
    ThreadPool.QueueUserWorkItem(new WaitHandle(HandleCleint), client);
    
    private void HandleClient(object clientObject)
    {
        TcpClient client = (TcpClient)clientObject;
        NetworkStream clientStream = client.GetStream();
        //handle the data here
    }
    

编辑:您在评论中说:

我不知道如何更改我的程序以将整个队列发送到服务器端

Array 或 Queue 本身就是一个对象:

//at your client side:
bf.Serialize(clientStream, persons);//assume persons is Queue<Person>

//at your server side:
Queue<Person> persons = (Queue<Person>)bf.Deserialize(clientStream);

【讨论】:

  • 我把“整个”词放在这里的借口。我想要的是将 Person 对象一个一个地发送到服务器端。不是队列。顺便说一句,队列是可序列化的吗?
  • @Kushan:是的,Queue 是可序列化的,如果你想一个接一个地发送一个 Person 对象,那么在服务器端你可以在获取 clientStream 后在HandleClient,而不是处理一次做while (true) { Queue&lt;Person&gt; persons = (Queue&lt;Person&gt;)formatter.Deserialize(stream); /*and then wait for a new data you can do something like: */ while (!stream.DataAvailable) { Thread.Sleep(100);}}
【解决方案2】:

好的。最后,我通过一些调查/测试找到了我的问题的答案。我会在这里为其他人发布它.. :)

首先在我的客户端,我必须发送我要发送到服务器的字节数。然后发送该数据..像这样..

Queue<Person> clientQueue;   // This is the client side queue

IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 15884);
var client = new TcpClient();

NetworkStream clientStream = client.GetStream()

while (disconnectClient)
{
    if (clientQueue.Count > 0)
    {
         Person person = clientQueue.Dequeue();
         using (MemoryStream memoryStrem = new MemoryStream())
         {
              var bf = new BinaryFormatter();
              bf.Serialize(memoryStrem, person);

              byte[] writeData = memoryStrem.ToArray();


              byte[] writeDataLen = BitConverter.GetBytes((Int32)writeData.Length);
              clientStream.Write(writeDataLen, 0, 4);
              clientStream.Write(writeData, 0, writeData.Length);
         }
    }
}
clientStream.Dispose();
client.Dispose();

在服务器端:

Queue<Person> serverQueue;   // This is the server side queue

IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 15884);
TcpListener tcpListener = new TcpListener(ipEndPoint);
tcpListener.Start();

while(true)
{
    TcpClient tcpClient = tcpListener.AcceptTcpClient();
    NetworkStream clientStream = tcpClient.GetStream();

    while (client.Connected)
    {
        if (client.Available >= 4)
        {
            try
            {
                 byte[] readDataLen = new byte[4];
                 clientStream.Read(readDataLen, 0, 4);

                 Int32 dataLen = BitConverter.ToInt32(readDataLen, 0);
                 byte[] readData = new byte[dataLen];

                 clientStream.Read(readData, 0, dataLen);

                 using (var memoryStream = new MemoryStream())
                 {
                      memoryStream.Write(readData, 0, readData.Length);
                      memoryStream.Position = 0;    /// This is very important. It took 4 hrs to identify an error because of this :)

                      BinaryFormatter bf = new BinaryFormatter();
                      Person person = (Person)bf.Deserialize(memoryStream);

                      serverQueue.Enqueue(person);
                 }
            }
            catch { }
        }
    }
    tcpClient.Close();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 2019-06-29
    • 2012-06-29
    相关资源
    最近更新 更多