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
{
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 ;
if ( socketList. Count > 0 )
{
foreach ( var item in socketList)
{
}
}
else
{
}
}
}
Socket TcpServer;
#region Tcp协议异步监听
public void StartListening ( )
{
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 异步连接客户端
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 异步接受客户端消息
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) ;
}
}
return ;
}
Debug. Log ( tcpClient. RemoteEndPoint. ToString ( ) + "收到客户端消息:{length}=====" + length + "___" + Encoding. UTF8. GetString ( data) ) ;
AsynSend ( tcpClient, "收到客户端消息..." ) ;
AsynRecive ( tcpClient) ;
} , null ) ;
}
catch ( Exception ex)
{
Debug. Log ( "异常信息:" + ex. Message) ;
}
}
#endregion
#region 异步发送消息
public void AsynSend ( Socket tcpClient, string message)
{
byte [ ] data = Encoding. UTF8. GetBytes ( message) ;
try
{
tcpClient. BeginSend ( data, 0 , data. Length, SocketFlags. None, asyncResult =>
{
int length = tcpClient. EndSend ( asyncResult) ;
Debug. Log ( "服务端完成发送消息=====" + length+ "___" + message) ;
} , null ) ;
}
catch ( Exception ex)
{
Debug. Log ( "发送消息异常信息=====" + ex. Message) ;
}
}
#endregion
private void HandleClient ( Socket clientSocket)
{
byte [ ] buffer = new byte [ 1024 ] ;
try
{
int bytesRead = clientSocket. Receive ( buffer) ;
if ( bytesRead > 0 )
{
Debug. Log ( "Received: {0}" + Encoding. ASCII. GetString ( buffer, 0 , bytesRead) ) ;
}
else
{
Debug. Log ( "Client closed the connection." ) ;
}
}
catch ( SocketException se)
{
Debug. Log ( $"Socket error: { se. Message } " ) ;
}
finally
{
clientSocket. Close ( ) ;
}
}
private void OnDestroy ( )
{
Debug. Log ( socketList. Count) ;
foreach ( KeyValuePair< string , Socket> item in socketList)
{
item. Value. Dispose ( ) ;
item. Value. Close ( ) ;
}
if ( TcpServer. Connected)
{
TcpServer. Shutdown ( SocketShutdown. Both) ;
}
TcpServer. Dispose ( ) ;
TcpServer. Close ( ) ;
}
[ ContextMenu ( "客户端数量" ) ]
public void DebugClientCount ( )
{
Debug. Log ( "连接数量===" + socketList. Count) ;
}
}
}