实例开发聊天室 tcp协议

本文介绍了一个基于TCP协议的服务器与客户端之间的通信实现方案。服务器能够接收多个客户端连接,并通过广播方式将任一客户端发送的消息转发给所有在线客户端。客户端可以发送消息到服务器并接收来自服务器的消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

tcp服务器端:

static List<Client> clientList=new List<Client>();

public static void BroadcastMessage(string message)

{

   var notConnectedList=new list<Client>();

    foreach(var client in clientList)

   {

     if(client.Connected)

      client.SendMessage(message);

     else

     {

        notConnectedList.Add(Client);

     }  

   }

   foreach(var temp in notConnectedList)

   {

      clientList.Remove(temp);

   }

}

Socket tcpServer = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

tcpServer.Bind(new IPEndPoint(IPAddress.Parse("10,28,120,164"),7788));

tcpServer.Listen(100);

Console.WriteLine("Server running...")

while(true)

{

   Socket clientSocket= tcpServer.Accept();

   Console.WriteLine("a client is connected!");

   Client client=new Client(clientSocket);  把与每个客户端通信的逻辑(收发消息)放到Client类里面进行处理

   clientList.Add(client);

}


---------------------------------------------------------------------------------------------

public class Client

{

    private Socket clientSocket;

    private Thread t;

    private byte[] data=new byte[1024]; //这是一个数据容器

    public Client(Socket s)

  {

       clientSocket=s;

       //启动一个线程 处理客户端的数据接收

        t=new Thread(ReceiveMessage);

        t.Start();

  }

  private void ReceiveMessage()

  {

    while(true)

    {

        //在接收数据之前 判断一下socket连接是否断开

         if(clientSocket.Poll(10,SelectMode.SelectRead))

          {

              clientSocket.Close();

              break;  //跳出循环 终止线程的执行

          }

          int length= clientSocket.Receive(data);

          string message=Encoding.UTF8.GetString(data,0,length);

           //TODO接收到数据的时候 要把这个数据 分发到客户端

          //广播消息

          Program.BroadcastMessage(message);

          Console.WriteLine("受到了消息"+message);

    }

    public void SendMessage(string message)

   {

        byte[] data= Encoding.UTF8.GetBytes(message);

       clientSocket.Send(data);

   }

   public bool Connected

  {

    get{ return clientSocket.Connected;}

  }

  }

}


----------------------------------------------------------------------------------------------

客户端(tcp)

public string ipaddress="10,28,120,164";

public int port=7788;

private Socket clientSocket;

public FieldInput textInput;

public Text text;

private Thread t;

private byte[] data=new byte[1024];

private string message="";

void Start()

{

  ConnectToServer();

}

void Update()

{

     if(message!=null && message!="")

   {

      text.text+="\n"+message;

      message="";  \\清空消息

   }

}

void ConnectToServer()  //连接服务器方法

{

    clientSocket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

    //跟服务器端建立连接

    clientSocket.Connect(new IPEndPoint(IPAddress.Parse(ipaddress),port));

   //创建一个新的线程,用来接收消息

    t=new Thread(ReceiveMessage);

    t.Start();

}

void ReceiveMessage()

{

  while(true)

 {

   if(clientSocket.Connected==false)

   break;

    int length=clientSocket.Receive(data);

     message=Encoding.UTF8.GetString(data,0,length);

 }

}

void SendMessage(string message)  //发送方法

{

  byte[] data=Encoding.UTF8.GetBytes(message);

  clientSocket.Send(data);

}

public void OnButtonClick()

{

    string value=textInput.text;

    SendMessage(value);

    textInput.text="";

}

void OnDestroy()

{

  clientSocket.Shutdown(SocketShutdown.Both); 关上连接

  clientSocket.Close();

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值