一. TCP服務器的實現(xiàn)
1.創(chuàng)建套接字
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2.綁定本地終節(jié)點
IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6065);
serverSocket.Bind(ep);
3.開啟監(jiān)聽
serverSocket.Listen(0);
4.異步接收客戶端連接請求
private void AsyncAccept(Socket socket)
{
? ? ? ? socket.BeginAccept(asyncResult =>
? ? ? ? {
? ? ? ? ? ? Socket server = asyncResult.AsyncState as Socket;
? ? ? ? ? ? //獲取客戶端套接字
? ? ? ? ? ? Socket clientSocket = socket.EndAccept(asyncResult);
? ? ? ? ? ? Debug.Log(string.Format("客戶端{0}請求連接", clientSocket.RemoteEndPoint));
? ? ? ? ? ? Client c = new Client(clientSocket);
? ? ? ? ? ? clients.Add(c);
? ? ? ? ? ? AsyncReceive(c);
? ? ? ? ? ? AsyncAccept(server);
? ? ? ? }, socket);
? ? }
5.異步接收客戶端信息
private void AsyncReceive(Client client)
{
? ? ? ? try
? ? ? ? {
? ? ? ? ? ? client.clientSocket.BeginReceive(client.buffer, 0, client.buffer.Length, SocketFlags.None,
? ? ? ? ? ? asyncResult =>
? ? ? ? ? ? {
? ? ? ? ? ? ? ? try
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? int length = client.clientSocket.EndReceive(asyncResult);
? ? ? ? ? ? ? ? ? ? if (length > 0)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? string message = Encoding.UTF8.GetString(client.buffer);
? ? ? ? ? ? ? ? ? ? ? ? OnReceiveMessage(message);
? ? ? ? ? ? ? ? ? ? ? ? AsyncReceive(client);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? //客戶端斷開
? ? ? ? ? ? ? ? ? ? ? ? OnClientDisconnect(client);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? catch (SocketException e)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? Debug.Log(e.Message.ToString());
? ? ? ? ? ? ? ? ? ? if (client.clientSocket.Connected == false)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? OnClientDisconnect(client);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }, client.clientSocket);
? ? ? ? }
? ? ? ? catch (Exception e)
? ? ? ? {
? ? ? ? ? ? Debug.Log(e.Message.ToString());
? ? ? ? }
}
6.異步向客戶端發(fā)送信息
private void AsyncSend(Client client, byte[] data)
{
? ? ? ? if (client == null || data.Length == 0) return;
? ? ? ? try
? ? ? ? {
? ? ? ? ? ? client.clientSocket.BeginSend(data, 0, data.Length, SocketFlags.None, asyncResult =>
? ? ? ? ? ? {
? ? ? ? ? ? ? ? int length = client.clientSocket.EndSend(asyncResult);
? ? ? ? ? ? }, client.clientSocket);
? ? ? ? }
? ? ? ? catch (SocketException e)
? ? ? ? {
? ? ? ? ? ? Debug.Log(e.Message.ToString());
? ? ? ? ? ? OnClientDisconnect(client);
? ? ? ? }
}
二. TCP客戶端的實現(xiàn)
1.創(chuàng)建套接字
Socket?clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2.連接到服務器
clientSocket.BeginConnect(dataSourceServerEP, asyncResult =>
?{
? ? ? ? ? ? try
? ? ? ? ? ? {
? ? ? ? ? ? ? ? clientSocket.EndConnect(asyncResult);
? ? ? ? ? ? ? ? Debug.Log(serviceName + ": 連接數(shù)據(jù)源服務器成功");
? ? ? ? ? ? ? ? //接收消息
? ? ? ? ? ? ? ? ReceiveMessageFromServer();
? ? ? ? ? ? }
? ? ? ? ? ? catch (SocketException e)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Debug.Log(e.Message.ToString());
? ? ? ? ? ? ? ? ConnectToDataSourceServer(ip, port);
? ? ? ? ? ? }
? ? ? ? }, clientSocket);