2016-10-24 10 views
0

Ich möchte String Json über Netzwerkstream senden. Code auf Client-Seitesenden Byte [] Daten über Netzwerk Stream-Socket. C#

using (var ns = new NetworkStream(socket)) 
{ 
string json = JsonConvert.SerializeObject(listCfile, Formatting.Indented); 
byte[] jsonbytes = Encoding.UTF8.GetBytes(json); 
byte[] jsonLength = BitConverter.GetBytes(jsonbytes.Length); 
ns.Write(jsonLength, 0, jsonLength.Length); 
ns.Write(jsonbytes, 0, jsonbytes.Length); 
} 

jsonbytes war byte [988324]

Auf Server-Seite

using (var ns = new NetworkStream(socket)) 
{ 
byte[] byDataLength = new byte[4]; 
ns.Read(byDataLength, 0, 4); 
int jsonLength = BitConverter.ToInt32(byDataLength, 0); 
byte[] byData = new byte[jsonLength]; 
ns.Read(byData, 0, jsonLength); 
File.WriteAllBytes("E:\\json.txt",byData); 
} 

byData wurde byte [988324]

Aber byData ich nicht denselben empfangen wird, wie jsonbytes habe ich gesendet.

Ich brauche ein paar Hilfen.

Aktualisierung! Manchmal funktioniert es. ByData empfangen ist das gleiche wie jsonbytes ich gesendet Manchmal funktioniert es nicht :(

+0

"es einige Daten verlieren" ist keine hilfreiche Beschreibung des Problems. Bitte erläutern. –

+0

Von der Client-Seite wird JsonLength vor den eigentlichen Daten gesendet, um einen Puffer auf der Serverseite zu bauen, um die JSON-Daten zu erhalten? – nura

+0

@nura ich denke das gleiche wie du, aber ich bin Anfänger in C# und Codierung, so können Sie mir ein paar Beispiele geben, vielen Dank. – vmphuong

Antwort

0

Sie können versuchen, Raw-Sockets zu senden und zu empfangen sowie die Verwendung eines Speicher-Stream und Paket-Mechanismus für unbekannte Datenlängen Verwendung von raw Sockets und Pufferung in einem Speicher-Stream ist.

im Folgenden ein Ausschnitt von Methoden zeigen bis End-of-Paket erkannt wird.

protected const int SIZE_RECEIVE_BUFFER = 1024; /// Receive buffer size 
    protected const string EOF = "!#~*|"; /// End of packet string 
    MemoryStream _msPacket = new MemoryStream(); /// Memory stream holding buffered data packets 
    int _delmtPtr = 0; /// Ranking pointer to check for EOF 
    Socket _baseSocket; 
    public event EventHandler OnReceived; 

    // TODO: - 
    // Add methods to connect or accept connections. 
    // When data is send to receiver, send with the same EOF defined above. 
    // 
    // 
    public void RegisterToReceive() 
    { 
     byte[] ReceiveBuffer = new byte[SIZE_RECEIVE_BUFFER]; 
     _baseSocket.BeginReceive 
     (
      ReceiveBuffer, 
      0, 
      ReceiveBuffer.Length, 
      SocketFlags.None, 
      new AsyncCallback(onReceiveData), 
      ReceiveBuffer 
     ); 
    } 
    private void onReceiveData(IAsyncResult async) 
    { 
     try 
     { 
      byte[] buffer = (byte[])async.AsyncState; 
      int bytesCtr = 0; 
      try 
      { 
       if (_baseSocket != null) 
        bytesCtr = _baseSocket.EndReceive(async); 
      } 
      catch { } 
      if (bytesCtr > 0) 
       processReceivedData(buffer, bytesCtr); 
      RegisterToReceive(); 
     } 
     catch{ } 
    } 

    private void processReceivedData(byte[] buffer, int bufferLength) 
    { 
     byte[] eof = Encoding.UTF8.GetBytes(EOF); 
     int packetStart = 0; 
     for (int i = 0; i < bufferLength; i++) 
     { 
      if (buffer[i].Equals(eof[_delmtPtr])) 
      { 
       _delmtPtr++; 
       if (_delmtPtr == eof.Length) 
       { 
        var lenToWrite = i - packetStart - (_delmtPtr - 1); 
        byte[] packet = new byte[lenToWrite + (int)_msPacket.Position]; 

        if (lenToWrite > 0) 
         _msPacket.Write(buffer, packetStart, lenToWrite); 

        packetStart = i + 1; 
        _msPacket.Position = 0; 
        _msPacket.Read(packet, 0, packet.Length); 

        try 
        { 
         if (OnReceived != null) 
          OnReceived(packet, EventArgs.Empty); 
        } 
        catch { } 
        _msPacket.Position = 0; 
        _delmtPtr = 0; 
       } 
      } 
      else 
      { _delmtPtr = 0; } 
     } 
     if (packetStart < bufferLength) 
      _msPacket.Write(buffer, packetStart, bufferLength - packetStart); 
     if (_msPacket.Position == 0) 
      _msPacket.SetLength(0); 
    } 

Diese große Länge von Daten empfangen kann und unabhängig von Länge durch den Absender

Die obigen Methoden zeigen, wie man nur Daten empfängt, also müssen andere Methoden für das Verbinden, Akzeptieren, Senden von Daten usw. in rohen Sockets enthalten sein.

+0

Vielen Dank, aber es ist so kompliziert für mich. Es gibt andere Möglichkeiten, dies zu tun. Meine Datenlänge ist nicht unbekannt. – vmphuong

Verwandte Themen