服务端:
socket绑定ip和端口
开启socket,等待连接(新线程中,防止阻塞)
监听到连接,开启两端数据传输(新线程,防止阻塞)
等待连接中断,关闭传输线程。
关闭连接等待。
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;
public static class OperationSocketServer
{
static Thread serverListener;//等待连接
static Thread serverReadData;//读取数据
static Socket SK_server;
public static void OpenServer(string ipaddress,int port)
{
try
{
IPAddress pAddress = IPAddress.Parse(ipaddress);
IPEndPoint pEndPoint = new IPEndPoint(pAddress, port);
SK_server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//TCP连接
SK_server.Bind(pEndPoint);
SK_server.Listen(1);//设置最大连接数
// Debug.Log("监听成功");
//创建新线程执行监听,否则会阻塞,导致unity无响应
serverListener = new Thread(ServerListen);
serverListener.IsBackground = true;
serverListener.Start(SK_server);
}
catch (System.Exception)
{
Debug.LogError("打开失败");
}
}
static Socket socketSend;
private static void ServerListen(object o)
{
try
{
Socket socketWatch = o as Socket;
while (true)
{
//此处注意,Accept()方法是阻塞的,子线程执行到这里就一直在这里等待连接,所以正常情况下不能通过抛出异常来执行一些未连接的逻辑方法。BeginAccept()是异步的。暂时没用过
socketSend = socketWatch.Accept();
Debug.Log(socketSend.RemoteEndPoint.ToString() + ":" + "连接成功");
//新建线程不断监听接受数据
serverReadData = new Thread(Received);
serverReadData.IsBackground = true;
serverReadData.Start(socketSend);
}
}
catch (System.Exception)
{
throw;
}
}
static byte[] buffer;
private static void Received(object o)
{
try
{
Socket socketSend = o as Socket;
while (true)
{
buffer = new byte[1024];
int len = socketSend.Receive(buffer);
if (len == 0) break;
string str = Encoding.UTF8.GetString(buffer, 0, len);
//处理数据
//Data(str);
#if UNITY_EDITOR
Debug.Log("服务器打印客户端返回消息:" + socketSend.RemoteEndPoint + ":" + str);
#endif
// Send("我收到了");
}
}
catch (System.Exception)
{
throw;
}
}
public static void CloseServer()
{
serverListener.Abort();
serverReadData.Abort();
SK_server.Close();
}
}
客户端
socket绑定ip和端口
连接socket
连接成功,发送数据【开启数据接受传输(新线程,防止阻塞)】
【关闭连接,关闭数据接受线程。】
断开连接。
public bool ConnectServer(string serverip,int serverPort)
{
try
{
IPAddress pAddress = IPAddress.Parse(serverip);
IPEndPoint pEndPoint = new IPEndPoint(pAddress, serverPort);
socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socketClient.Connect(pEndPoint);
return true;
// Debug.Log("连接成功");
//创建线程,执行读取服务器消息
//clientConnect = new Thread(Received);
//clientConnect.IsBackground = true;
//clientConnect.Start();
}
catch (System.Exception)
{
return false;
}
}
public void Send(string msg)
{
try
{
byte[] buffer = new byte[1024];
buffer = Encoding.UTF8.GetBytes(msg);
socketClient.Send(buffer);
}
catch (System.Exception)
{
Debug.Log("未连接");
}
}