1

クライアントからサーバーにデータを送信したい。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();

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);
}

上記のコードが機能していないことはわかっています。自分のデザインをスケッチしたいだけです。誰かがコード例を送ってくれますか。クライアントキューをサーバーキューに送信する方法..

ありがとう..

4

2 に答える 2

4
  1. を使用している場合は、サーバー側とクライアント側の両方でキューを使用BlockingCollectionする必要があります。以前のバージョンでは、と.net 4.0を組み合わせて使用​​します。これを確認してください。QueueAutoResetEvent

  2. サーバー側では、非同期メソッドを使用するか、新しいスレッドをインスタンス化して新しいクライアントを処理し、そのスレッドでデータを読み取る必要があります。お気に入り:

    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
    }
    

編集:コメントで次のように述べました:

キュー全体をサーバー側に送信するようにプログラムを変更する方法がわかりません

配列またはキュー自体はオブジェクトです。

//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);
于 2011-07-23T07:58:56.010 に答える
2

Ok。最後に、いくつかの調査/テストを行って、質問に対する答えを見つけました。他の人のためにここに投稿します.. :)

クライアント側では、最初にサーバーに送信するバイト数を送信する必要があります。そして、そのデータを送信します..このように..

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();
}
于 2011-07-23T16:43:05.730 に答える