-2

こんにちは、私は c# の初心者で、tcp/ip ソケット接続を介してテキスト ファイルを共有するためのサーバーとクライアントを実行しています。BinaryReader / BinaryWriter を使用してクライアントからサーバーにアップロードしましたが、サーバーからクライアントにスタックしました: クライアントからサーバーへ:

Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                var stream = new MemoryStream();
                var writer = new BinaryWriter(stream);
                writer.Write(fileName);
                writer.Write(authorName);
                writer.Write(fileContent);
                var data = stream.ToArray();  // send this data array to server
                clientSock.Connect("192.168.7.48", 9050); // targets machine ip add and port num
                clientSock.Send(data);
                writer.Dispose();
                stream.Dispose();
                clientSock.Close();

サーバー内:

public void ReadCallBack(IAsyncResult ar) {

    String content = String.Empty;
    StateObject state = (StateObject)ar.AsyncState;
    Socket handler = state.workSocket;
    bytesRead = handler.EndReceive(ar);
    System.Diagnostics.Debug.WriteLine("Error asshole-0");
   if (bytesRead > 0)
   {
       if (flag == 0)
       {
           var stream = new MemoryStream(state.buffer);
           var reader = new BinaryReader(stream);
           fileName = reader.ReadString();
           authorName = reader.ReadString();
           fileContent = reader.ReadString();
           reader.Dispose();
           stream.Dispose();
           flag++;
           Console.Write(fileName + authorName);
           Console.Write(fileContent);
       }
       string path = @"C:\"+fileName;

       StreamWriter sw = new StreamWriter(path);
       sw.Write(fileContent);
       sw.Close();
       sw.Dispose();
       SqlCmd();
   }
   else
   {
       Invoke(new MyDelegate(LabelWrite));
   }

}

stream.Dispose();

今、サーバーからクライアントまで同じ方法を使用しようとしましたが、エラーが発生しました

var stream = new MemoryStream(state.buffer);
var reader = new BinaryReader(stream);

stateObject はエラーですか?

4

2 に答える 2

3

問題: ソケットがバッファ内のデータを受信するため、データ全体を一度に読み取れない可能性があります。 解決策 : が呼び出されたときの byteread の使用について考えてみてください。handler.EndReceive(ar)読み取られたデータについて通知しますが、データ全体を受信したかどうかを確認し、受信した場合は引き続き文字列に変換する必要があることを意味します。

    Public Class State
    Public CLient As Net.Sockets.Socket
    Public Const BufferConst As Integer = 100
    Public TmpBuffer(BufferConst) As Byte
    Public sb As New System.Text.StringBuilder
End Class

Public Sub SendText(txt As String, socket As Net.Sockets.Socket)
    socket.Send(System.Text.Encoding.UTF32.GetBytes(txt + "•"))
End Sub

Public Sub ReadData(ar As IAsyncResult)
    Dim state As State = ar.AsyncState
    Try
        Dim read As Integer = state.CLient.EndReceive(ar)
        If read > 0 Then
            state.sb.Append(System.Text.Encoding.UTF32.GetChars(state.TmpBuffer))
            If state.sb.ToString.IndexOf("•") > 0 Then
                'All data have been recived
                Console.WriteLine(state.sb.ToString())
            Else
                ' Not Complete Start it again
                state.CLient.BeginReceive(state.TmpBuffer, 0, state.BufferConst, Net.Sockets.SocketFlags.None, New AsyncCallback(AddressOf ReadData), state)
            End If
        End If
    Catch ex As Exception
        Console.Write("Read Error")
    End Try
End Sub
于 2012-11-14T15:24:33.703 に答える
1

Flushあなたがそれらを書いた後、そしてストリームを覚えておいてください。これまでに共有したスニペットからは、フラッシュがあるようには見えません。

ストリームフラッシュのドキュメントをご覧ください

于 2012-08-10T15:01:43.250 に答える