using UnityEngine; using System.Collections; //引入库 using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Collections.Generic; using LitJson; public class TServer : MonoBehaviour { public string ownerName; //以下默认都是私有的成员 Socket serverSocket; //服务器端socket public List clientSockets =new List(); //客户端socket IPEndPoint ipEnd; //侦听端口 string recvStr; //接收的字符串 string sendStr; //发送的字符串 byte[] recvData = new byte[1024]; //接收的数据,必须为字节 byte[] sendData = new byte[1024]; //发送的数据,必须为字节 int recvLen; //接收的数据长度 Thread connectThread; //连接线程 //初始化 void InitSocket() { //定义侦听端口,侦听任何IP ipEnd = new IPEndPoint(IPAddress.Any, 50001); //定义套接字类型,在主线程中定义 serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //连接 serverSocket.Bind(ipEnd); //开始侦听,最大10个连接 serverSocket.Listen(10); //开启一个线程连接,必须的,否则主线程卡死 connectThread = new Thread(new ThreadStart(SocketReceive)); connectThread.Start(); } //连接 void SocketConnet() { //if (clientSocket != null) // clientSocket.Close(); //控制台输出侦听状态 Debug.Log("等待客户端连接...."); //一旦接受连接,创建一个客户端 Socket ss= serverSocket.Accept(); //服务器端socket //获取客户端的IP和端口 IPEndPoint ipEndClient = (IPEndPoint)ss.RemoteEndPoint; TServerC tc = new TServerC(); tc._socket = ss; tc.id = clientSockets.Count+1; //输出客户端的IP和端口 Debug.Log("客户端 ===>" + tc.id + "连接。。。。"); // SocketSend(sendStr); tc.ts = this; tc.init(); clientSockets.Add(tc); SocketConnet(); } public void SocketSend(string sendStr,int id) { for (int i = 0; i < clientSockets.Count; i++) { if(id!=clientSockets[i].id) { //发送 clientSockets[i].SocketSend(sendStr); } } } public TServerC getRoomSocketById(int id) { for (int i = 0; i < clientSockets.Count; i++) { if (id == clientSockets[i].id) { return clientSockets[i]; } } return null; } public JsonData getRoomList(int id) { JsonData datas = new JsonData(); for (int i = 0; i < clientSockets.Count; i++) { if (id != clientSockets[i].id) { datas.Add(clientSockets[i].getInfo()); } } return datas; } //服务器接收 void SocketReceive() { SocketConnet(); } //连接关闭 void SocketQuit() { for (int i = 0; i < clientSockets.Count; i++) { //先关闭客户端 if (clientSockets[i] != null) clientSockets[i]._socket.Close(); } //再关闭线程 if (connectThread != null) { connectThread.Interrupt(); connectThread.Abort(); } //最后关闭服务器 serverSocket.Close(); print("diconnect"); } // Use this for initialization void Start() { InitSocket(); //在这里初始化server } // Update is called once per frame void Update() { } void OnApplicationQuit() { SocketQuit(); } }