C#客户端套接字多次发送和接收

C#客户端套接字多次发送和接收,c#,sockets,tcp-ip,C#,Sockets,Tcp Ip,我正在使用套接字进行TCP-IP连接,我想从客户端建立简单的系统发送接收 Socket sck; sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint localEndpt = new IPEndPoint(IPAddress.Parse("123.123.123.1"), 12345); try

我正在使用套接字进行TCP-IP连接,我想从客户端建立简单的系统发送接收

 Socket sck;
        sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPEndPoint localEndpt = new IPEndPoint(IPAddress.Parse("123.123.123.1"), 12345);
        try
        {
            sck.Connect(localEndpt);
        }
        catch
        {
            Console.Write("Unable to Connect");
        }
        while (true)
        {
            Console.WriteLine("Enter Text");
            string sendtext = Console.ReadLine();
            byte[] Data = Encoding.ASCII.GetBytes(sendtext);
            sck.Send(Data);
            Console.WriteLine("Data Sent!");

            byte[] bytesReceived = new byte[sck.ReceiveBufferSize];
            int bytes = 0;
            String strReceived = "";

            int dataAvailable = 0;
            while (dataAvailable == 0 || dataAvailable != sck.Available)
            {
                dataAvailable = sck.Available;
                Thread.Sleep(100); // if no new data after 100ms assume transmission finished
            }

            if (sck.Available > 0)
            {
                bytes = sck.Receive(bytesReceived, bytesReceived.Length, 0);
                strReceived+=Encoding.ASCII.GetString(bytesReceived, 0, bytes);
            }

            Console.WriteLine("Received from server: " + strReceived);
        }
        Console.Read();

问题是第一个请求通过,但第二个请求不通过,因为套接字不再可用(套接字“available”属性值为0)。我做错了什么?建立多个发送-接收请求(按顺序)的最简单方法是什么。可用不表示套接字是否可用,但传入数据可用于读取:

您的程序退出,因为它在发送消息后立即检查回复(传入数据)。在检查数据之前,使用
线程。睡眠


可能消息甚至还没有发送,因为
Socket.Send
只是将其放在网络接口卡的输出缓冲区中。当套接字最终发送消息时,它将更新连接状态。如果它没有得到回复(在TCP连接上),它将在您查询状态时告诉您它已断开连接。在UDP上,它不会告诉您任何信息,因为UDP是无连接的。

Socket。可用
不表示套接字是否可用,但传入数据可用于读取:

您的程序退出,因为它在发送消息后立即检查回复(传入数据)。在检查数据之前,使用
线程。睡眠


可能消息甚至还没有发送,因为
Socket.Send
只是将其放在网络接口卡的输出缓冲区中。当套接字最终发送消息时,它将更新连接状态。如果它没有得到回复(在TCP连接上),它将在您查询状态时告诉您它已断开连接。在UDP上,它不会告诉你什么,因为UDP是无连接的。

这段代码对我来说很好。

    private List<Socket> _clients = new List<Socket>();
    private Thread _dataReceiveThread;
    private bool _isConnected;

    private void DataReceive()
    {
        while (_isConnected)
        {
            List<Socket> clients = new List<Socket>(_clients);
            foreach (Socket client in clients)
            {
                try
                {
                    if (!client.Connected) continue;
                    string txt = "";
                    while (client.Available > 0)
                    {
                        byte[] bytes = new byte[client.ReceiveBufferSize];
                        int byteRec = client.Receive(bytes);
                        if (byteRec > 0)
                            txt += Encoding.UTF8.GetString(bytes, 0, byteRec);
                    }
                    if (!string.IsNullOrEmpty(txt))
                        /* TODO: access the text received with "txt" */
                }
                catch (Exception e)
                {
                    Exception_Handler(e);
                }
            }
        }
    }
交叉线程中的更新列表框

此代码可以放在注释部分

myListBox1.Invoke((Action)(() => { myListBox1.Items.Add(txt) }));

这段代码对我来说很好

    private List<Socket> _clients = new List<Socket>();
    private Thread _dataReceiveThread;
    private bool _isConnected;

    private void DataReceive()
    {
        while (_isConnected)
        {
            List<Socket> clients = new List<Socket>(_clients);
            foreach (Socket client in clients)
            {
                try
                {
                    if (!client.Connected) continue;
                    string txt = "";
                    while (client.Available > 0)
                    {
                        byte[] bytes = new byte[client.ReceiveBufferSize];
                        int byteRec = client.Receive(bytes);
                        if (byteRec > 0)
                            txt += Encoding.UTF8.GetString(bytes, 0, byteRec);
                    }
                    if (!string.IsNullOrEmpty(txt))
                        /* TODO: access the text received with "txt" */
                }
                catch (Exception e)
                {
                    Exception_Handler(e);
                }
            }
        }
    }
交叉线程中的更新列表框

此代码可以放在注释部分

myListBox1.Invoke((Action)(() => { myListBox1.Items.Add(txt) }));