服务器端
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace Chat_Server
{
class Server
{
//用于存储已连接的客户端,便于管理
private static List<Client> clientList = new List<Client>();
//服务器收到消息广播给所有在线客户端
public static void BroadMessage(string message)
{
//存储已断开连接的客户端
List<Client> notConnectedClient = new List<Client>();
foreach (var item in clientList)
{
if (item.connencted)
item.SendMes(message);
else
notConnectedClient.Add(item);
}
//删除已断开的客户端
foreach (var item in notConnectedClient)
{
clientList.Remove(item);
Console.WriteLine(item + " disConnected!!");
}
}
static void Main(string[] args)
{
Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
EndPoint point = new IPEndPoint(ipAddress, 7788);
tcpServer.Bind(point);
tcpServer.Listen(100);
Console.WriteLine("Server Running..");
while (true)
{
Socket clientSocket = tcpServer.Accept();
Console.WriteLine("One Client Connected!!");
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 socket)
{
clientSocket = socket;
SendMes("Welcome to our ChatRoom!!");
//启用新线程
t = new Thread(ReceiveMes);
t.Start();
}
//向客户端发送新消息
public void SendMes(string message)
{
byte[] data = Encoding.UTF8.GetBytes(message);
clientSocket.Send(data);
Console.WriteLine("Sended One Message to a ChatClient");
}
//接收客户端发来的消息
private void ReceiveMes()
{
while (true)
{
if (clientSocket.Poll(10, SelectMode.SelectRead))
{
clientSocket.Close();
break;
}
int length = clientSocket.Receive(data);
string message = Encoding.UTF8.GetString(data, 0, length);
Console.WriteLine("Receive Message: " + message);
Server.BroadMessage(message);
}
}
//判断此客户端是否断开
public bool connencted
{
get { return clientSocket.Connected; }
}
}
}
unity客户端
/*****************************
*
* Author : TheNO.5
*
******************************/
using UnityEngine;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
public class ChatManager : MonoBehaviour
{
public string ip = "127.0.0.1";
public int port = 7788;
public UILabel text;
public UIInput input;
public GameObject sendButton;
private Socket clientSocket;
private Thread t;
private string str;
void Start()
{
UIEventListener.Get(sendButton).onClick = OnSendButtonClick;
ConnectToServer();
t = new Thread(ReceiveMes);
t.Start();
}
void Update()
{
if(str != null && str != "")
{
text.text += "\n" + str;
str = "";
}
}
void ConnectToServer()
{
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.Connect(new IPEndPoint(IPAddress.Parse(ip), port));
}
void ReceiveMes()
{
while (true)
{
byte[] data = new byte[1024];
int length = clientSocket.Receive(data);
string message = Encoding.UTF8.GetString(data, 0, length);
str = message;
}
}
private void SendMes(string message)
{
byte[] data = Encoding.UTF8.GetBytes(message);
clientSocket.Send(data);
}
private void OnSendButtonClick(GameObject go)
{
SendMes(input.value);
input.value = "";
}
void OnDestroy()
{
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
}
}