1、服务端
using System;
using System.Collections.Generic;
using System.Text;
#region 命名空间
using System.Net;
using System.Net.Sockets;
using System.Threading;
using UnityEngine;
#endregion
namespace AsynServerConsole
{
/// <summary>
/// Tcp协议异步通讯类(服务器端)
/// </summary>
public class AsynTcpServer: MonoBehaviour
{
//存储已连接的客户端的泛型集合
private static Dictionary<string, Socket> socketList = new Dictionary<string, Socket>();
private void Start()
{
StartListening();
}
float ttt;
private void Update()
{
ttt += Time.deltaTime;
if (ttt>5f)
{
ttt = 0f;
//Debug.Log("连接数量==="+ socketList.Count);
if (socketList.Count > 0)
{
foreach (var item in socketList)
{
// Debug.Log("连接客户端====" + item.Key);
// HandleClient(item.Value);
//AsynSend(item.Value,"心跳");
}
}
else
{
}
}
}
Socket TcpServer;
#region Tcp协议异步监听
/// <summary>
/// Tcp协议异步监听
/// </summary>
public void StartListening()
{
//主机IP
IPEndPoint serverIp = new IPEndPoint(IPAddress.Parse("192.168.15.72"), 8686);
TcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
TcpServer.Bind(serverIp);
TcpServer.Listen(100);
Debug.Log("异步开启监听...");
AsynAccept(TcpServer);
}
#endregion
#region 异步连接客户端
/// <summary>
/// 异步连接客户端
/// </summary>
/// <param name="tcpServer"></param>
public void AsynAccept(Socket tcpServer)
{
tcpServer.BeginAccept(asyncResult =>
{
Socket tcpClient = tcpServer.EndAccept(asyncResult);
string str = tcpClient.RemoteEndPoint.ToString();
socketList.Add(str, tcpClient);
Debug.Log("收到连接=============" + tcpClient.RemoteEndPoint.ToString());
AsynSend(tcpClient, "收到客户端连接...");//发送消息
AsynAccept(tcpServer);//继续监听客户端
AsynRecive(tcpClient);//继续监听客户端消息
}, null);
}
#endregion
#region 异步接受客户端消息
/// <summary>
/// 异步接受客户端消息
/// </summary>
/// <param name="tcpClient"></param>
public void AsynRecive(Socket tcpClient)
{
byte[] data = new byte[1024];
try
{
tcpClient.BeginReceive(data, 0, data.Length, SocketFlags.None,
asyncResult =>
{
int length = tcpClient.EndReceive(asyncResult);
if (length==0)
{
Debug.Log("客户端退出===="+tcpClient.RemoteEndPoint.ToString());
foreach (var item in socketList)
{
if (item.Key.Contains(tcpClient.RemoteEndPoint.ToString()))
{
socketList.Remove(item.Key);
}
}
tcpClient.Close();
return;
}
string mes = Encoding.UTF8.GetString(data, 0, length);
Debug.Log(tcpClient.RemoteEndPoint.ToString()+"收到客户端消息:{length}=====" + length + "___" + mes);
// Debug.Log(tcpClient.RemoteEndPoint.ToString()+"收到客户端消息:{length}=====" + length + "___" + Encoding.UTF8.GetString(data));