TCP C#包到特定客户端

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP C#包到特定客户端相关的知识,希望对你有一定的参考价值。

我正在编写TCP服务器以提高我对该协议的了解。最近,一个社区成员(RenéVogt先生)帮助我建立了我的服务器和多个客户端之间的连接。

一切正常,答案(一个简单的活动包)被发送给所有连接的客户端。但现在,我想指定一个发送数据包的连接。我将简要解释一下:

服务器在专用主机中运行。我的个人计算机作为Client1连接到服务器,发送活动数据包(“AA”)并接收服务器回复。然后,另一个客户端(Client2,client3 ......和on)连接到服务器。将收到alive,服务器将回答此客户端。但另外,我想向Client1发送一个类似“Client2已连接”(或其他任何内容)的数据包。

我的代码如下:

using System;
using System.Threading;
using System.Net.Sockets;
using mysql.Data.MySqlClient;
using System.Net;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            TcpListener serverSocket = new TcpListener(50000);
            TcpClient clientSocket = default(TcpClient);
            int counter = 0;

            serverSocket.Start();
            Console.WriteLine(" >> " + "Server Started");

        counter = 0;
            while (true)
            {
                counter += 1;
                clientSocket = serverSocket.AcceptTcpClient();
                Console.WriteLine(" >> " + "Client No:" + Convert.ToString(counter) + " started!");
                handleClinet client = new handleClinet();
                client.startClient(clientSocket, Convert.ToString(counter));
            }

            clientSocket.Close();
            serverSocket.Stop();
            Console.WriteLine(" >> " + "exit");
            Console.ReadLine();
        }
    }

    //Class to handle each client request separatly
    public class handleClinet
    {
        TcpClient clientSocket;

        string clNo;
        public void startClient(TcpClient inClientSocket, string clineNo)
        {
                this.clientSocket = inClientSocket;
                this.clNo = clineNo;
                Thread ctThread = new Thread(doChat);
                ctThread.Start();

        }
        private void doChat()
        {
            bool LoopReceive = true;
            bool LoopSend = false;
            int requestCount = 0;
            byte[] bytesFrom = new byte[256];
            string dataFromClient = null;
            Byte[] sendBytes = null;
            string serverResponse = null;
            string rCount = null;
            requestCount = 0;
            string Packettosend = "";

            while ((true))
            {
                try
                {
                    requestCount = requestCount + 1;
                    NetworkStream networkStream = clientSocket.GetStream();
                    networkStream.Flush();
                    networkStream.Read(bytesFrom, 0, bytesFrom.Length);
                    dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
                    IPEndPoint remoteIpEndPoint = clientSocket.Client.RemoteEndPoint as IPEndPoint;

                    Console.WriteLine(" >> PACKET: " + dataFromClient);



                    if (dataFromClient.StartsWith("AA")
                    {
                        Packettosend = "ALIVE";
                        Console.WriteLine("::ALIVE PACKET");
                    }


                    //PACKETS TO SEND
                    if (Packettosend == "ALIVE")
                    {
                        Byte[] sendBytes1 = { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 };
                        networkStream.Write(sendBytes1, 0, sendBytes1.Length);
                    }

                }
                catch (Exception ex)
                {
                    Console.WriteLine(" >> " + ex.ToString());
                }
            }
        }
    }
}

我搜索了一些答案,但它们没有用。是否可以将网络流指向除发送数据包的当前客户端之外的任何其他内容?

提前致谢!

答案

简单的代码是,将客户端存储到带有id或字典的客户端列表,

Dictionary<TcpClient, int> clintlist= new Dictionary<TcpClient, int>();

当你想发送特定客户端时,只需在客户列表中搜索id

以上是关于TCP C#包到特定客户端的主要内容,如果未能解决你的问题,请参考以下文章

Unity网络通信(TCP&UDP)

C# TCP 客户端监听数据

TCP 打洞和UDP打洞

使用 libtorrent 下载特定片段

从堆栈中弹出特定片段并删除其他片段

如何将一个数组的值解包到另一个数组的特定索引中?