2017-02-17 50 views
1

我剛開始學習套接字編程,現在我試圖從客戶端向服務器發送列表<>。如何使用Tcp NetworkStream發送和接收列表C#

我讀過我需要使用BinaryFormatter進行序列化和反序列化,但我只是沒有知道如何使用NetworkStream將其發送到服務器。

請幫助和任何解釋將非常感激。先進的非常感謝。

下面是我的客戶端代碼

private void btnSendDataToServer_Click(object sender, EventArgs e) 
    { 
     int noOfMessage = Convert.ToInt32(tbMessageNo.Text); 
     try 
     { 
      serverStream = clientSocket.GetStream(); 
      for (int i = 0; i < noOfMessage; i++) 
      { 
       clientList.Add(tbSendDataToServer.Text); 
      } 

      //send data to server 
      byte[] outStream = System.Text.Encoding.ASCII.GetBytes(?); 
      serverStream.Write(outStream, 0, outStream.Length); 
      serverStream.Flush(); 

      //receive data from server 
      byte[] inStream = new byte[102400]; 
      serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize); 
      string returndata = System.Text.Encoding.ASCII.GetString(inStream); 
      msg("Data from Server : " + returndata); 
     } 
     catch(SocketException ex) 
     { } 
    } 

下面是我的服務器

byte[] bytesFrom = new byte[102400]; 

NetworkStream networkStream = clientSocket.GetStream(); 
       networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize); 
       dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom); 

        f.testQS.Enqueue(dataFromClient); 
        AppendText(f.testQS.Count().ToString() + " >> " + "From client-" + ClientNo + "--" + dataFromClient); 

        //send data to client 
        rCount = Convert.ToString(requestCount); 
        serverResponse = "Server to Client(" + ClientNo + ") " + rCount; 
        sendBytes = Encoding.ASCII.GetBytes(serverResponse); 
        networkStream.Write(sendBytes, 0, sendBytes.Length); 
        networkStream.Flush(); 

附:代碼如果它是一個單一的字符串,我沒有問題。但我想基於用戶noOfMessage循環第一個字符串,並將其放入List中。然後我將發送列表到服務器。然後,服務器將讀取收到的列表並顯示列表的數據。謝謝。

+0

相反Encoding.ASCII.GetBytes的'()接收',發送由串行器返回的字節數組。你也犯了忽略'Read()'返回的字節數的經典錯誤。你需要一個消息框架協議。你爲什麼使用這樣的套接字? – CodeCaster

+0

@CodeCaster我做了很多錯事嗎? var bin = new BinaryFormatter(); bin.Serialize(serverStream,clientList);這是正確的使用Serialize()?我該如何繼續? –

回答

1

要發送數據

BinaryFormatter bf = new BinaryFormatter(); 
bf.Serialize(serverStream, clientList); 
serverStream.Close(); 

要在服務器

BinaryFormatter formatter = new BinaryFormatter(); 
clientList = (List<string>) formatter.Deserialize(networkStream); 
+0

非常感謝! –