【问题标题】:C# Socket keep receiving empty messageC# Socket 不断收到空消息
【发布时间】:2017-06-13 02:26:14
【问题描述】:

我正在尝试训练自己,我目前正在构建一个小型 Tcp 服务器/客户端。

目前我有 3 个连接、监听客户端和监听消息的小类。以下是 3 个类:

public class ServersLauncher
{

    #region Main
    public static void Main(string[] args)
    {
        ServersLauncher sl = new ServersLauncher();
        Console.ReadLine();
        sl._udpServer?.Dispose();
        sl._tcpServer?.Dispose();
    }
    #endregion Main

    private UdpServer _udpServer;
    private TcpServer _tcpServer;

    private ServersLauncher()
    {
        _tcpServer = new TcpServer();
        Socket sc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 25004);
        sc.Bind(localEndPoint);
        IPEndPoint distantEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 25000);
        sc.Connect(distantEndPoint);
        while (!sc.Connected)
            Thread.Sleep(1000);
        byte[] buffer = Utility.ConvertMessage("Hell world !");
        sc.Send(buffer, buffer.Length, SocketFlags.None);
        sc.Close();
    }

}

顶部是服务器启动器,它启动服务器、创建客户端并发送消息。

public class TcpServer : IDisposable
{

    private readonly int _portTcp = 25000;
    private Socket _socket;
    private Thread _connectionsThread;
    private List<TcpClient> _clients;

    public TcpServer()
    {
        _clients = new List<TcpClient>();

        _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), _portTcp);
        _socket.Bind(endPoint);
        _connectionsThread = new Thread(new ThreadStart(ListenConnections));
        _connectionsThread.Start();
    }

    public void Dispose()
    {
        _connectionsThread.Abort();
        for(int i = 0; i < _clients.Count; i++)
        {
            _clients[i].Dispose();
        }
        _socket.Close();
    }

    private void ListenConnections()
    {
        _socket.Listen(100);
        while (true)
        {
            Socket clientSocket = _socket.Accept();
            _clients.Add(new TcpClient(clientSocket));
        }
    }

}

顶部是 TcpServer,它侦听连接并在一个客户端连接时创建客户端接口。

public class TcpClient : IDisposable
{

    private Socket _client;
    private Thread _receiverThread;

    public TcpClient(Socket client)
    {
        _client = client;
        _receiverThread = new Thread(ReceiveMessage);
        _receiverThread.Start();
    }

    public void Dispose()
    {
        _receiverThread.Abort();
    }

    private void ReceiveMessage()
    {
        while (true)
        {
            byte[] buffer = new byte[1024];
            _client.Receive(buffer);
            Utility.DisplayThread("A message has been received : " + Encoding.ASCII.GetString(buffer).Trim());
        }
    }

}

这里是存储套接字客户端和侦听消息的 TcpClient。 没什么复杂的,但我在阅读邮件时遇到了问题。现在,如果我启动程序,客户端会连接,然后......不停的消息!我收到一个“地狱世界”,然后是空消息。我阅读了 Socket 的 Receive 方法的文档,似乎它应该阻塞并等待消息追求是例行的。 我在某处做错了吗?在断开连接之前我需要从客户端刷新流吗? 感谢您的帮助!

【问题讨论】:

标签: c# tcp server


【解决方案1】:

收到空消息的原因是您的客户端套接字保持连接

您可以等待与您的客户接收更多消息,如果这是您想要的,试试这个:

 private void ReceiveMessage()
        {
            while (true) {
                if(_client.Available > 0) {
                    byte[] buffer = new byte[1024];
                    _client.Receive(buffer);
                    Console.WriteLine("A message has been received : " + Encoding.ASCII.GetString(buffer));
                }
            }
        }

if(_client.Available > 0) 检查是否有任意数量的字节 从网络接收的数据可供读取。

告诉我进展如何;

祝你好运;

【讨论】:

    【解决方案2】:

    嗯,我不确定您希望看到什么行为。

    您创建一个新的ServerLauncher,然后在执行此操作时执行以下操作:

    sc.Connect(distantEndPoint);
    while (!sc.Connected)
       Thread.Sleep(1000);
    byte[] buffer = Utility.ConvertMessage("Hell world !");
    sc.Send(buffer, buffer.Length, SocketFlags.None);
    sc.Close();
    

    这会连接,等待连接,发送消息然后关闭。

    然后你的 main 方法调用Console.ReadLine();...

    如果您的服务器已关闭,则不会有更多消息通过。删除sc.Close(); 行(或仅在调用某些标志时调用它,例如X

    也许您应该创建一个循环并从循环中发送消息,或者更好的是,从命令行传递消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多