//聊天室 服务器
namespace Unity聊天室_Socket_TCP_Server
{
class Program
{
public static List<Client> clientList = new List<Client>();
public static void BroadcastMessage(string message)
{
foreach (var clinet in clientList)
{
if (clinet.isConnect)
clinet.SendToClientMessage(message);
}
}
static void Main(string[] args)
{
Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
EndPoint e = new IPEndPoint(IPAddress.Parse("10.246.40.205"), 7786);
tcpServer.Bind(e);
tcpServer.Listen(100);//监听最多100个客户端
Console.WriteLine("Server is running....");
//一直监听客户端们来建立链接
while (true)
{
Socket clientSocket = tcpServer.Accept();//同意链接继续执行; 没链接,等待 不会往下执行
Console.WriteLine("one Client is connected!");
Client client = new Client(clientSocket);
clientList.Add(client);
}
}
}
}
namespace Unity聊天室_Socket_TCP_Server
{
public class Client
{
private Socket clientSocket;
private Thread thread;
private byte[] data = new byte[1024];
public bool isConnect
{
get { return clientSocket.Connected; }
}
public Client(Socket s)
{
clientSocket = s;
//启动一个线程用来处理该客户端发来的数据
thread = new Thread(ReceiveMessage);
thread.Start();
}
private void ReceiveMessage()
{
while (true)
{
//上一次收发是否完成
//if (clientSocket.Connected == false) { break; }
//判断TCP链接是否断开
if (clientSocket.Poll(10, SelectMode.SelectRead)) {
clientSocket.Close();
Program.clientList.Remove(this);
break; }
int receiveLength = clientSocket.Receive(data);
string message = Encoding.UTF8.GetString(data, 0, receiveLength);
//TODO:接收到数据分发给客户端们
Program.BroadcastMessage(message);
Console.WriteLine("收到消息:" + message);
}
}
public void SendToClientMessage(string message)
{
byte[] data = Encoding.UTF8.GetBytes(message);
clientSocket.Send(data);
}
}
}
//聊天室 客户端 unity
public class ChatManager : MonoBehaviour
{
public string ip = "10.246.40.205";
public int prot = 7786;
private Socket clinetSocket;
private Thread thread;
private byte[] data = new byte[1024];
private string resevieMessgae = "";
public InputField textInput;
public Text PanelText;
// Use this for initialization
void Start()
{
ConnectToServer();
}
// Update is called once per frame
void Update()
{
if (resevieMessgae != null && resevieMessgae != "")
{
PanelText.text += "\n" + resevieMessgae;
}
resevieMessgae = "";
}
void ConnectToServer()
{
try
{
clinetSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clinetSocket.Connect(IPAddress.Parse(ip), prot);
Debug.Log("ConnectToServer:");
//创建一个线程接收消息
thread = new Thread(ClientResevieMessage);
thread.Start();
}
catch (Exception e)
{
Debug.Log("ConnectToServer Exception" + e.ToString());
}
}
void ClientSendMessage(string message)
{
byte[] data = Encoding.UTF8.GetBytes(message);
clinetSocket.Send(data);
//Debug.Log("ClientSendMessage:" + message);
}
void ClientResevieMessage()
{
while (true)
{
if (!clinetSocket.Connected)
{
break;
}
int length = clinetSocket.Receive(data);
resevieMessgae = Encoding.UTF8.GetString(data, 0, length);
}
}
public void OnSendButtonClick()
{
string value = SystemInfo.deviceName + "发言:" + textInput.text;
ClientSendMessage(value);
textInput.text = "";
}
void OnDisale()
{
// clinetSocket.Shutdown(SocketShutdown.Both);
clinetSocket.Close();
}
public void ExitGame()
{
clinetSocket.Close();
Debug.Log("ExitGame:");
Application.Quit();
}
}