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();
}