C# TCP套接字:流在异步操作中发送/接收两次

C# TCP套接字:流在异步操作中发送/接收两次,c#,asynchronous,C#,Asynchronous,我目前正在处理异步TCP程序,但有以下问题: -当服务器发送一些流时,客户机首先接收一个空缓冲区,然后接收流 -在第一个流发送之后,如果我正在发送另一个流,客户端的缓冲区将包含第一个发送的流和当前的流 小溪 -如果我正在发送另一个流,缓冲区将包含我之前发送的流和当前流,以此类推 这真的很烦人,我不知道问题出在哪里。 这是我的客户代码: Socket CLIENT; byte[] _buffer; private void button1_Click(object sender, Event

我目前正在处理异步TCP程序,但有以下问题:

  • -当服务器发送一些流时,客户机首先接收一个空缓冲区,然后接收流
  • -在第一个流发送之后,如果我正在发送另一个流,客户端的缓冲区将包含第一个发送的流和当前的流 小溪
  • -如果我正在发送另一个流,缓冲区将包含我之前发送的流和当前流,以此类推
这真的很烦人,我不知道问题出在哪里。 这是我的客户代码:

Socket CLIENT;
byte[] _buffer;

private void button1_Click(object sender, EventArgs e)
{
    Start();
}
void Start()
{
    CLIENT = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    CLIENT.BeginConnect(IPAddress.Parse("the IPaddress"), 1234, new AsyncCallback(ConnectionCallBack), null);
}
private void ConnectionCallBack(IAsyncResult ar)
{
    try
    {
         CLIENT.EndConnect(ar);
         _buffer = new byte[CLIENT.ReceiveBufferSize];
         CLIENT.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), null);
    }
    catch (Exception Er)
    {
        MessageBox.Show("[[[[ERROR:1]]]]=>" + Er.Message);
    }

}
private void ReceiveCallBack(IAsyncResult ar)
{
    try
    {
        int lenght = CLIENT.EndReceive(ar);
        if (lenght == 0)  { return; }
        Array.Resize(ref _buffer, lenght);
        string stream = ASCIIEncoding.ASCII.GetString(_buffer);
        Array.Resize(ref _buffer, CLIENT.ReceiveBufferSize);

        CLIENT.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), null);

    }
    catch (Exception ex) { MessageBox.Show("[[[[hoERROR:2]]]]=>" + ex.Message); }
}
这是服务器:

private void button2_Click(object sender, EventArgs e)
        { 
            try
            {
                Socket socket = (Socket)listW.SelectedItems[0].Tag; //contains the socket
                socket.BeginSend(_buffer,0,_buffer.Length,SocketFlags.None,new AsyncCallback(SendingCallBack),socket);
                ServerSocket.BeginAccept(new AsyncCallback(AcceptCallBack),null);
            }
            catch (Exception er) { MessageBox.Show("[[[[ERROR:]]]]=>" + er.ToString()); }
        }
        private void SendingCallBack(IAsyncResult ar)
        {
            try
            {
                Socket socket = (Socket)ar.AsyncState;
                _buffer = ASCIIEncoding.ASCII.GetBytes(tx1.Text);
                socket.BeginSend(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(FinalCallBack),socket);
            }
            catch (Exception er) { MessageBox.Show("[[[[ERROR:3]]]]=>" + er.ToString()); }
        }
        private void Final(IAsyncResult ar)
        {
            Socket client = ar.AsyncState as Socket;
            client.EndSend(ar);
        }

我想你有一些问题。其中一个似乎是
ReceiveCallback
中的
流。从缓冲区中获取一个字符串,然后对其不做任何处理。降低缓冲区的大小,然后如果恢复到原始大小,则调整缓冲区的大小似乎是一种浪费。最好是复制数据,然后调用
GetString
,这样就可以不使用缓冲区了


在服务器中,调用
BeginSend
发送缓冲区,完成后,在
SendingCallback
中再次调用
BeginSend
,二进制表示形式为
tx1.Text
,但不调用
EndSend
,完成后,您可以在2号呼叫
EndSend
;但是仍然没有第一次调用它。

我在github上有一个项目可能会帮助您:谢谢,但我需要了解我的代码中有什么错误。错误在哪里?我删除了您较新的问题并取消了此问题,因为删除某人花时间回答的问题是相当不礼貌的,只是为了让你可以转载它以获得更多的关注。请不要这样做。我不明白,我应该如何为每次发送调用end send,因为正如我所看到的,在服务器中它已经完成了?(如果你是这么说的。)@leo在
SendingCallback
中,你需要调用
EndSend
传递
ar
,就像你在
Final
中做的那样。我不知道丢失的
EndSend
会带来什么后果——可能不太好