using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Threading;
using System;
namespace _聊天室_socket_TCP服务器端
{
class Program
{
static List clientlist = new List();
//广播消息
public static void BroadcastMessage(string message)
{
//存放所有没有连接的客户端
var notConnectedList = new List();
foreach (var client in clientlist)
{
if (client.Connected)
client.SendMessage(message);
else
{
notConnectedList.Add(client);
}
}
foreach (var temp in notConnectedList)
{
clientlist.Remove(temp);
}
}
static void Main(string[] args)
{
Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
tcpServer.Bind(new IPEndPoint(IPAddress.Parse("192.168.0.112"), 7788));
tcpServer.Listen(100);
//可以接收到多个客户端的连接
while (true)
{
Socket clientSocket = tcpServer.Accept();
//把与每个客户端通信的逻辑(收发消息)放到client类里面进行处理
Client client = new Client(clientSocket);
clientlist.Add(client );
}
}
}
//用来跟客户端做通信
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);
//接收到数据的时候,要把这个数据分发到客户端
//广播这个消息
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;}
}
}
}
客户端
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using UnityEngine;
using System.Text;
using System.Threading;
public class chatroom_client : MonoBehaviour
{
public string ipaddress = “192.168.0.112”;
public int port = 7788;
public UIInput textinput;
public UILable chatLable;
private Socket clientSocket;
private Thread t;
private byte[] data = new byte[1024];
void Start()
{
ConnectToServer();
}
void Update()
{
if(message!=null&&message!="")
{
chatLable.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(ReciveMessage);
t.Start();
} //用来循环接收消息
void ReciveMessage()
{
while (true)
{
if (clientSocket.Connected == false)
break;
int length = clientSocket.Receive(data);
string message = Encoding.UTF8.GetString(data, 0, length);
}
}
//发送消息
void SendMessage(string message)
{
byte[] data = Encoding.UTF8.GetBytes(message );
clientSocket.Send(data);
}
public void OnSendButtonClick()
{
string value = textInput.value;
SendMessage(value);
textInput.value="";
}
void OnDestory()
{
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();//关闭连接
}
}