C# socket 刚收到第一条消息

C# socket just first message received

我已经搜索了很多示例和教程,但我终究无法弄清楚我在这里做错了什么...如果我向该服务器发送多条消息,我只发送了第一条打印在Console.Writeline 命令,其余的永远不会打印...我一定是做错了一些根本性的错误,但我真的找不到它...:S

这是服务器代码:

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms.VisualStyles;

namespace HL7_Manager
{
public class MonitorServer
{
    private int _port;
    private Socket _serverSocket;
    private List<ClientObject> _clients;

    public bool IsConnected { get; set; }
    public MonitorServer(int port)
    {
        _port = port;
        _clients = new List<ClientObject>();
    }

    public void StartListening()
    {
        _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        Thread listenThread = new Thread(new ThreadStart(ListenerThread));
        listenThread.IsBackground = true;
        listenThread.Start();
    }

    public void StopListening()
    {
        IsConnected = true;
        _serverSocket.Close();
        while (_clients.Count > 0)
        {
            _clients[0].KeepProcessing = false;
            _clients[0].ClientSocket.Close();
            _clients.RemoveAt(0);
        }
    }

    private void ListenerThread()
    {
        _serverSocket.Bind(new IPEndPoint(IPAddress.Any, _port));
        _serverSocket.Listen(100);

        Console.WriteLine("Listening on port 8000");

        while (true)
        {
            Socket clientSocket = _serverSocket.Accept();
            ClientObject client = new ClientObject();
            client.KeepProcessing = true;
            client.ClientSocket = clientSocket;
            _clients.Add(client);
            ParameterizedThreadStart ptStart = new ParameterizedThreadStart(ProcessClientThread);
            Thread processThread = new Thread(ptStart);
            processThread.IsBackground = true;
            processThread.Start(client);
            clientSocket = null;
            client = null;
        }
    }

    private void ProcessClientThread(object clientObj)
    {
        Console.WriteLine("Client connected");
        ClientObject client = (ClientObject) clientObj;
        Socket clientSocket = client.ClientSocket;
        byte[] buffer = new byte[clientSocket.ReceiveBufferSize];
        int receiveCount = 0;

        while (client.KeepProcessing)
        {
            try
            {
                receiveCount = clientSocket.Receive(buffer, 0, buffer.Length, SocketFlags.None);
                Console.WriteLine(Encoding.ASCII.GetString(buffer));
            }
            catch (Exception ex)
            {
                if (!client.KeepProcessing)
                    return;
                Console.WriteLine(ex.Message);
            }
        }
        clientSocket.Close();
        _clients.Remove(client);
    }
}
}

这是您绝对应该更改的方法以及更改方法。

    private void ProcessClientThread(object clientObj)
    {
        Console.WriteLine("Client connected");
        ClientObject client = (ClientObject)clientObj;
        Socket clientSocket = client.ClientSocket;
        byte[] buffer = new byte[clientSocket.ReceiveBufferSize];
        int receiveCount = 0;

        while (client.KeepProcessing)
        {
            try
            {
                receiveCount = clientSocket.Receive(buffer, 0, buffer.Length, SocketFlags.None);
                if (receiveCount == 0)
                    break; //the client has closed the stream
                var ret = Encoding.ASCII.GetString(buffer, 0, receiveCount);
                Console.WriteLine(ret);
            }
            catch (Exception ex)
            {
                if (!client.KeepProcessing)
                    return;
                Console.WriteLine(ex.Message);
            }
        }
        clientSocket.Close();
        _clients.Remove(client);
    }

检查您实际收到了多少字节。 TCP 是一种流式传输协议,这意味着如果您的客户端一个接一个地发送多个小消息,您将在接收方一次接收到它们。 如果您的接收缓冲区中恰好有一个空字符,您可能认为您没有收到所有这些字符串,但实际上您收到了。 通过检查您收到了多少字节并检查缓冲区内容来检查这一点。 如果您犯了这个错误,您的代码中可能存在更深层次的问题。 TCP 正在流式传输这一事实使其变得有点复杂