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

标签 c# .net sockets

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

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

服务器:

        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();
    }

最佳答案

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

此外,在谈论 TCP 时不要考虑消息 - 它是基于流的协议(protocol),没有消息。如果您想通过 TCP 发送(和接收)消息,您需要在 TCP 之上实现您自己的消息协议(protocol)。

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

关于C# - 服务器套接字不检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32702306/

相关文章:

c# - 插入 C# MongoDB 中的嵌套数组

c# - 什么时候用 IList 什么时候用 List

c# - 如何避免使用 XML 反序列化创建对象的多个实例?

c# - Selenium 在浏览器后退按钮操作后使用旧页面并且不显示对 DOM 的更改

c# - 我如何为我的 Windows Mobile 5 应用程序创建数据库并访问它?

c# - .NET 线程问题

javascript - 使用 Express 4 模块化 Socket.io

Python 多处理和套接字未关闭

c# - 从安装项目中删除文件

java - Java密码和socket流的三个问题