繁体   English   中英

客户端不能接收从服务器发送的数据,而只能发送数据?

[英]Client cannot recieve data sent from server but can send data only?

我有一个Winform服务器和一个客户端程序。 两者都已连接,客户端可以将数据发送到服务器,服务器可以接收。 但是当服务器发送数据时,客户端无法接收。

这是客户端接收数据的代码:

//RECIEVE PART
 private Socket _clientSocket; // We will only accept one socket

    private byte[] _buffer;

    public Form1()
    {
        InitializeComponent();
        StartRecieve();
    }


    #region Receiving Data
    private void StartRecieve()
    {
        try
        {
            _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
           // _serverSocket.Bind(new IPEndPoint(IPAddress.Any, 3333));
            _serverSocket.Listen(10);
            _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    private void AcceptCallback(IAsyncResult AR)
    {
        try
        {
            _clientSocket = _serverSocket.EndAccept(AR);
            _buffer = new byte[_clientSocket.ReceiveBufferSize];
            _clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    private void ReceiveCallback(IAsyncResult AR)
    {
        try
        {
            int received = _clientSocket.EndReceive(AR);
            Array.Resize(ref _buffer, received); // Shrink buffer to trim null characters
            string text = Encoding.ASCII.GetString(_buffer);
            Array.Resize(ref _buffer, _clientSocket.ReceiveBufferSize); // Regrow buffer
            //AppendToTextBox(text);
            MessageBox.Show(text);
            // Start receiving data again
            _clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    #endregion

    #region Display
    /// <summary>
    /// Provides a thread safe way to append text to the textbox
    /// </summary>
    private void AppendToTextBox(string text)
    {
        MethodInvoker invoker = new MethodInvoker(delegate
        {
            // Add two new lines afterwards
            TboxDisp.Text += text + "\r\n" + "\r\n";
        });

        this.Invoke(invoker);
    }

    #endregion
//Connection Part
 private void BtnConnect_Click(object sender, EventArgs e)
    {
        try
        {
            string ip = TboxIP.Text;
            int port = int.Parse(TboxPort.Text);
            _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            // Connect to the  host
            _clientSocket.BeginConnect(new IPEndPoint(IPAddress.Parse(ip), port),
                                            new AsyncCallback(ConnectCallback), null);

            if (SocketConnected(_clientSocket) == true)
            {
                lblstatus.Text = "Establishing Connection to " + ip;
                lblstatus2.Text = "Connection Established";
            }

           // Connect1(ip, port);

        }
        catch (SystemException ex)
        {
            MessageBox.Show(ex.Message);
        }


    }

    //ends bending requests
    private void ConnectCallback(IAsyncResult AR)
    {
        try
        {
            _clientSocket.EndConnect(AR);
            EnableSearchButton();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    //Enables the button search
    private void EnableSearchButton()
    {
        MethodInvoker invoker = new MethodInvoker(delegate
        {
            BtnSearch.Enabled = true;
        });

        this.Invoke(invoker);
    }

    #endregion

    private void BtnSearch_Click(object sender, EventArgs e)
    {
        try
        {
            // Serialize the textBoxes text before sending
           // byte[] buffer = Encoding.ASCII.GetBytes(textBox.Text);
            string command = "HELOTAGP/1.1\n";
            byte[] buffer = Encoding.ASCII.GetBytes(command);
            _clientSocket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendCallback), null);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    //Ends pending asynchronous send
    private void SendCallback(IAsyncResult AR)
    {
        try
        {
            _clientSocket.EndSend(AR);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

完整的服务器代码(接收+发送)为:

 public partial class ServerForm : Form
{
    private Socket _serverSocket;
    private Socket _clientSocket; // We will only accept one socket
    private byte[] _buffer;

    public ServerForm()
    {

        InitializeComponent();
        StartServer();
    }


    private void StartServer()
    {
        try
        {
            _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            _serverSocket.Bind(new IPEndPoint(IPAddress.Any, 3333));
            _serverSocket.Listen(10);
            _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    private void AcceptCallback(IAsyncResult AR)
    {
        try
        {
            _clientSocket = _serverSocket.EndAccept(AR);
            _buffer = new byte[_clientSocket.ReceiveBufferSize];
            _clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    private void ReceiveCallback(IAsyncResult AR)
    {
        try
        {
            int received = _clientSocket.EndReceive(AR);
            Array.Resize(ref _buffer, received); // Shrink buffer to trim null characters
            string text = Encoding.ASCII.GetString(_buffer);
            Array.Resize(ref _buffer, _clientSocket.ReceiveBufferSize); // Regrow buffer


            AppendToTextBox(text);
            // Start receiving data again
            _clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    /// <summary>
    /// Provides a thread safe way to append text to the textbox
    /// </summary>
    private void AppendToTextBox(string text)
    {
        MethodInvoker invoker = new MethodInvoker(delegate
            {
                // Add two new lines afterwards
                textBox.Text += text + "\r\n" + "\r\n";
            });

        this.Invoke(invoker);
    }


    //sending data


    private void BtnSend_Click(object sender, EventArgs e)
    {
        try
        {
            // Serialize the textBoxes text before sending
            string command = "Test";
            byte[] buffer = Encoding.ASCII.GetBytes(command);
            _clientSocket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendCallback), null);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    private void SendCallback(IAsyncResult AR)
    {
        try
        {
            _clientSocket.EndSend(AR);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}

服务器正确接收数据,但是我不知道为什么客户端无法从服务器接收数据。 是服务器发送错误的方式吗? 还是客户接收方式错误? 我必须为客户端设置IP地址吗?

任何帮助表示赞赏。

您误解了套接字的使用。 套接字同时具有读取通道和写入通道。 两个通道相互隔离。 查看您的客户端代码,使用“ serverSocket”侦听传入的数据,而使用“ clientSocket”将数据发送到服务器。 相反,您应该使用一个插座和同一插座的读取和写入通道。

作为澄清:连接了TCP套接字。 这意味着对于每个插座,必须先进行连接,然后才能使用该插座。 在套接字上侦听意味着您希望连接到该套接字。 在您的客户端中,“ clientSocket”正在连接到服务器,但是“ serverSocket”从不连接到服务器,服务器也从未连接到客户端(不应该)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM