服务器
//其他线程要使用所以要全局
static Socket socket;
static void Main(string[] args)
{
//得有手机(使用ipv4查找地址,使用字节流传输数据,使用Tcp协议传输)
socket=new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//创建手机卡(默认IP地址,自定义端口号)
IPEndPoint iPEnd=new IPEndPoint(IPAddress.Any,222);
//绑定手机号
socket.Bind(iPEnd);
//设定接听上线
socket.Listen(10);
//等待别人打电话(会阻塞线程)
//子线程被输入阻塞的时候,主线程能继续正常运行
ThreadPool.QueueUserWorkItem(Accept);
while (true)
{
}
}
/// <summary>
/// 等待别人连接(会阻塞线程)
/// </summary>
/// <param name="state"></param>
private static void Accept(object state)
{
Socket client=socket.Accept();
//来电显示
//获取ip地址和端口号
IPEndPoint clientIP=client.RemoteEndPoint as IPEndPoint;
Console.WriteLine(clientIP.Address+":"+clientIP.Port+"连接");
//开线程收消息
ThreadPool.QueueUserWorkItem(Receive, client);
//等待下一个连接
ThreadPool.QueueUserWorkItem(Accept);
}
private static void Receive(object state)
{
Socket client=state as Socket;
//创建一个字节流用来接收消息
byte[] buffer=new byte[1024];
//接收客户端发来的消息(会阻塞线程)
int len = client.Receive(buffer, SocketFlags.None);
//收到长度为0的消息时断开连接
if(len>0)
{
//禁止收发消息
client.Shutdown(SocketShutdown.Both);
//关闭连接释放资源
client.Close();
return;
}
//1024是流的长度 len是消息的实际长度
//截取数组前n位
byte[] data = buffer.Take(len).ToArray();
//解析data
//byte数组转string
string str=UTF8Encoding.UTF8.GetString(data);
Console.WriteLine(str);
//给客户端回消息
Send(client, UTF8Encoding.UTF8.GetBytes("哦额你放哪"));
//开线程收消息
ThreadPool.QueueUserWorkItem(Receive,client);
}
//发送消息给客户端
private static void Send(Socket client, byte[] bytes)
{
client.Send(bytes);
}
客户端
public Text text;
Socket socket;
Queue<byte[]> que=new Queue<byte[]>();
// Start is called before the first frame update
void Start()
{
socket=new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect("127.0.0.1", 666);
//收消息
ThreadPool.QueueUserWorkItem(Receive);
}
private void Receive(object state)
{
byte[] buffer=new byte[1024];
int len = socket.Receive(buffer, SocketFlags.None);
if(len <= 0)
{
socket.Shutdown(SocketShutdown.Both);
socket.Close();
return;
}
byte[] data = buffer.Take(len).ToArray();
que.Enqueue(data);
ThreadPool.QueueUserWorkItem(Receive);
}
public void OnBtn()
{
string str = "写佛冈我看帮你";
byte[] data=UTF8Encoding.UTF8.GetBytes(str);
socket.Send(data);
}
// Update is called once per frame
void Update()
{
//在主线程中取出队列的消息
while( que.Count > 0 )
{
byte[] data=que.Dequeue();
string str=UTF8Encoding.UTF8.GetString(data);
text.text = str;
}
}