直接代码 可用
服务端
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;
public class TCPServer : MonoBehaviour
{
public static string ipAdress;
public static int port;
private byte[] data = new byte[1024];
private Socket serverSocket;//服务器Socket
private Socket client;//客户端Socket
private Thread myThread;//启动监听线程
private Thread receiveThread;//接收数据线程
private List<Socket> clientSocketList = new List<Socket>();
public static TCPServer Instance;
private void Awake()
{
if (Instance == null)
{
Instance = this;
}
}
void Start()
{
TCPServer.ipAdress = IPManager.GetIP(ADDRESSFAM.IPv4);
InitSocket();
}
void InitSocket()
{
try
{
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint iPPoint = new IPEndPoint(IPAddress.Parse(ipAdress), port);
serverSocket.Bind(iPPoint);
serverSocket.Listen(10);
Debug.Log("Server Running...");
myThread = new Thread(ListenClientConnect);
myThread.Start();
}
catch (System.Exception ex)
{
Debug.Log(ex.Message);
}
}
void ListenClientConnect()
{
while (true)
{
client = serverSocket.Accept();
clientSocketList.Add(client);
Debug.Log("客户端:" + client.RemoteEndPoint + "连接到服务器!");
AllSendMs("From Server:" + client.RemoteEndPoint + "客户端已连接到服务器!");
receiveThread = new Thread(ReceiveMsg);
receiveThread.Start(client);
}
}
public static string ReceiveInfo="";
void ReceiveMsg(object clientSocket)
{
client = clientSocket as Socket;
while (true)
{
try
{
//客户端连接服务器成功后,服务器接收客户端发送的消息
byte[] buffer = new byte[1024 * 1024 * 3];
//实际接收到的有效字节数
int len = client.Receive(buffer);
if (len == 0 || client.Poll(100, SelectMode.SelectRead))
{
string s = "客户端:" + client.RemoteEndPoint + "断开了连接!";
Debug.Log(s);
AllSendMs(s);
clientSocketList.Remove(client);
break;
}
string str = Encoding.UTF8.GetString(buffer, 0, len);
ReceiveInfo = str;
if (ReceiveInfo!="")
{
AllSendMs(str);
}
Debug.Log(ReceiveInfo);
}
catch (System.Exception ex)
{
Debug.Log("从服务器获取数据错误" + ex.Message);
break;
}
}
}
public void AllSendMs(string ms)
{
for (int i = 0; i < clientSocketList.Count; i++)
{
clientSocketList[i].Send(Encoding.UTF8.GetBytes(ms));
}
}
//void AllSendMs(object obj)
//{
// for (int i = 0; i < clientSocketList.Count; i++)
// {
// data = obj.SerializeToByteArray();
// clientSocketList[i].Send(data, data.Length, 0);
// }
//}
void OnDestroy()
{
try
{
//关闭线程
if (myThread != null || receiveThread != null)
{
myThread.Interrupt();
myThread.Abort();
receiveThread.Interrupt();
receiveThread.Abort();
}
//最后关闭socket
if (serverSocket != null)
{
for (int i = 0; i < clientSocketList.Count; i++)
{
clientSocketList[i].Close();
}
serverSocket.Shutdown(SocketShutdown.Both);
serverSocket.Close();
}
}
catch (System.Exception ex)
{
Debug.Log(ex.Message);
}
print("disconnect");
}
}
客户端
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class TCPClient : MonoBehaviour
{
public Text texz;
public static string ipAdress;
public static int port;
private byte[] data = new byte[1024];
public static Socket clientSocket;
private Thread receiveT;
public static TCPClient Instance;
public static string ReceiceInfo;
private void Awake()
{
if (Instance ==null)
{
Instance = this;
}
}
void Start()
{
ConnectToServer();
}
void ConnectToServer()
{
try
{
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Thread.Sleep(1000);
clientSocket.Connect(IPAddress.Parse(ipAdress), port);
texz.text += (IPAddress.Parse(ipAdress));
texz.text += (port);
Thread.Sleep(1000);
Debug.Log("连接服务器成功");
receiveT = new Thread(ReceiveMsg);
receiveT.Start();
}
catch (System.Exception ex)
{
texz.text += ex.Message;
Debug.Log("连接服务器失败!");
Debug.Log(ex.Message);
}
}
private void ReceiveMsg()
{
while (true)
{
if (clientSocket.Connected == false)
{
Debug.Log("与服务器断开了连接");
break;
}
//客户端连接服务器成功后,服务器接收客户端发送的消息
byte[] buffer = new byte[1024 * 1024 * 3];
//实际接收到的有效字节数
int len = clientSocket.Receive(buffer);
string str = Encoding.UTF8.GetString(buffer, 0, len);
ReceiceInfo = str;
Debug .Log ("接收到的是:"+ ReceiceInfo);
}
}
public void SendMes(string ms)
{
data = new byte[1024];
data = Encoding.UTF8.GetBytes(ms);
clientSocket.Send(data, data.Length , SocketFlags.None);
}
void SendMes(GameObject obj)
{
//byte[] data = new byte[1024];
//data =
//clientSocket.Send(data, data.Length, 0);
}
void OnDestroy()
{
try
{
if (clientSocket != null)
{
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();//关闭连接
}
if (receiveT != null)
{
receiveT.Interrupt();
receiveT.Abort();
}
}
catch (Exception ex)
{
Debug.Log(ex.Message);
}
}
}