c# -服务器套接字不检索数据

本文关键字:检索 数据 套接字 服务器 | 更新日期: 2023-09-27 18:13:44

我的问题是当我的客户端发送数据时,我的服务器只接收第一个发送的消息。服务器没有接收到以下所有客户机消息。如果我调试客户端,它不会抛出任何异常,所以我认为问题是与服务器的接受。

有人能告诉如何修复我的代码,我的客户端能够多次发送到服务器而不创建一个新的套接字(在客户端)为每条消息?

服务器:

        static Socket connection;
        static IPEndPoint endpoint;
        const int BUFFER_SIZE = 1024;
        static byte[] buffer;
        static void Main(string[] args)
        {
            connection = new Socket(SocketType.Stream, ProtocolType.Tcp);
            endpoint = new IPEndPoint(IPAddress.Any, 1337);
            connection.Bind(endpoint);
            connection.Listen(10);
            buffer = new byte[BUFFER_SIZE];
            connection.BeginAccept(new AsyncCallback(AsyncAccept),null);
            Console.ReadLine();
        }
        private static void AsyncAccept(IAsyncResult ar)
        {
            Socket s = connection.EndAccept(ar);
            s.BeginReceive(buffer,0,BUFFER_SIZE, SocketFlags.None, new AsyncCallback(AsyncReceive),s);
            connection.BeginAccept(new AsyncCallback(AsyncAccept), null);
        }
        static void AsyncReceive(IAsyncResult ar)
        {
            Socket s = (Socket)ar.AsyncState;
            int received = s.EndReceive(ar); //END
            byte[] data = new byte[received];
            Array.Copy(buffer, data, received);
            string text = Encoding.Default.GetString(data);
            Console.WriteLine(text);
        }
客户:

    Socket c;
    IPEndPoint endpoint;
    string text;
    public MainWindow()
    {
        InitializeComponent();
        c = new Socket(SocketType.Stream, ProtocolType.Tcp);
        endpoint = new IPEndPoint(IPAddress.Loopback, 1337);
        c.Connect(endpoint);
    }

    private void Send()
    {
        byte[] buffer = Encoding.Default.GetBytes(text);
        c.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendAsync), c);
    }
    private void SendAsync(IAsyncResult ar)
    {
        Socket s = (Socket)ar.AsyncState;
        s.EndSend(ar);
    }
    private void btnSend_Click(object sender, RoutedEventArgs e)
    {
        Thread t = new Thread(Send);
        text = txtMessage.Text;
        t.IsBackground = true;
        t.Start();
    }

c# -服务器套接字不检索数据

您需要在AsyncReceive处理程序中启动另一个BeginReceive。原来的异步接收完成了——你只会得到一个你所要求的响应。

另外,在讨论TCP时不要考虑消息——它是一个基于流的协议,没有消息。如果你想通过TCP发送(和接收)消息,你需要在TCP之上实现你自己的消息协议。

我建议阅读更多关于网络(以及一般的异步I/O)是如何工作的——就像多线程一样,很容易得到一些基本工作的东西,但不可能调试和正确修复。最简单的例子是将TCP视为基于消息的协议—它将倾向于主要在本地主机和非常受限的网络条件下工作,但它并不安全,并且它将在您的面前爆炸。