客户端
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net.Sockets;
using System.Threading;
using UnityEngine.UI;
public class Echo : MonoBehaviour
{
//定义套接字
private Socket _socket;
//UGUI
public InputField inputField;
public Text text;
private string recvStr = "";
readonly byte[] readBuff = new byte[1024];
//点击连接按钮
public void Connection()
{
//Socket
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //地址族,套接字类型,协议
//syncConnect
// _socket.Connect("192.168.1.151",8888);
//AsyncConnect
_socket.BeginConnect("192.168.1.151", 8888, ConnectCallback, _socket);
}
//Async Connect 回调
void ConnectCallback(IAsyncResult asyncResult)
{
try
{
Socket socket = (Socket) asyncResult.AsyncState;
socket.EndConnect(asyncResult);
Debug.Log("Socket Connect Success");
socket.BeginReceive(readBuff, 0, 1024, 0, ReceiveCallback, socket);
}
catch (SocketException e)
{
Debug.Log($"Socket Connect fail{e.ToString()}");
}
}
//Async Receive 回调
void ReceiveCallback(IAsyncResult asyncResult)
{
try
{
Socket socket = (Socket) asyncResult.AsyncState;
int count = socket.EndReceive(asyncResult);
recvStr = System.Text.Encoding.Default.GetString(readBuff, 0, count);
socket.BeginReceive(readBuff, 0, 1024, 0, ReceiveCallback, socket);
}
catch (SocketException e)
{
Debug.Log($"Socket Receive fail{e.ToString()}");
}
}
//点击发送按钮
public void Send()
{
// SendSync();
SendAsync();
}
public void SendSync()
{
//Send
string sendStr = inputField.text;
byte[] sendBytes = System.Text.Encoding.Default.GetBytes(sendStr);
_socket.Send(sendBytes);
//Recv
int count = _socket.Receive(readBuff);
string recvStr = System.Text.Encoding.Default.GetString(readBuff, 0, count);
text.text = recvStr;
//Close
_socket.Close();
Connection();
}
//Async 发送
public void SendAsync()
{
//Send
string sendStr = inputField.text;
byte[] sendBytes = System.Text.Encoding.Default.GetBytes(sendStr);
for (int i = 0; i < 10000; i++)
{
_socket.BeginSend(sendBytes, 0, sendBytes.Length, 0, SendCallBck, _socket);
}
}
public void SendCallBck(IAsyncResult asyncResult)
{
try
{
Socket socket = (Socket) asyncResult.AsyncState;
int count = socket.EndSend(asyncResult);
}
catch (SocketException e)
{
Debug.Log($"Socket Send fail {e.ToString()}");
}
}
private void Start()
{
AsyncTest();
Debug.Log("ling,ling,ling");
}
private void Update()
{
text.text = recvStr;
}
void SyncTest()
{
System.Threading.Thread.Sleep(5000);
Debug.Log("铃铃铃");
}
void AsyncTest()
{
Timer timer = new Timer(TimeOut, null, 5000, 0);
timer.Change(5000, 0);
}
private void TimeOut(System.Object state)
{
Debug.Log("铃铃铃");
}
}
服务端
VS建立一个Console C# 工程
using System;
using System.Net;
using System.Net.Sockets;
using System.Collections.Generic;
namespace SocketSaver
{
class ClientState
{
public Socket socket;
public byte[] readBuff = new byte[1024];
}
class MainClass
{
//监听
static Socket listenfd;
//客户端Socket及状态信息
static Dictionary<Socket, ClientState> clients = new Dictionary<Socket, ClientState>();
public static void Main(string[] args)
{
Console.WriteLine("Hello World!");
//Socket
Socket listenfd = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//Bild
IPAddress ipAdr = IPAddress.Parse("192.168.1.151");
IPEndPoint ipEp = new IPEndPoint(ipAdr,8888);
MainClass mainClass = new MainClass();
//
//mainClass.SyncSaver(listenfd, ipEp);
//
mainClass.AsyncSaver(listenfd, ipEp);
}
public void SyncSaver(Socket listenfd,IPEndPoint ipEp)
{
listenfd.Bind(ipEp);
//Listen
listenfd.Listen(0);
Console.WriteLine("[服务器]启动成功");
while (true)
{
//Accept
Socket connfd = listenfd.Accept();
Console.WriteLine("[服务器]Accept");
//Receive
byte[] readBuff = new byte[1024];
int count = connfd.Receive(readBuff);
string readStr = System.Text.Encoding.Default.GetString(readBuff, 0, count);
Console.WriteLine("[服务器接收]" + readStr);
//Console.WriteLine("[服务器接收来自]" + connfd.Available);
//Send
byte[] sendBytes = System.Text.Encoding.Default.GetBytes(readStr);
connfd.Send(sendBytes);
}
}
void AsyncSaver(Socket listenfd,IPEndPoint ipEp)
{
listenfd.Bind(ipEp);
listenfd.Listen(0);
Console.WriteLine("[Async 服务器]启动成功");
listenfd.BeginAccept(AsyncAcceptCallBack,listenfd);
//等待
Console.ReadLine();
}
//Accept 回调
void AsyncAcceptCallBack(IAsyncResult asyncResult)
{
try
{
Console.WriteLine("[服务器]Accept");
Socket listenfd = (Socket) asyncResult.AsyncState;
Socket clientfd = listenfd.EndAccept(asyncResult);
//clients 列表
ClientState state = new ClientState();
state.socket = clientfd;
clients.Add(clientfd,state);
//接收数据BeginReceive
clientfd.BeginReceive(state.readBuff,0,1024,0, ReceiveCallBack,state);
//继续Accept
listenfd.BeginAccept(AsyncAcceptCallBack,listenfd);
}
catch (SocketException e)
{
Console.WriteLine($"Socket Accept fail{e.ToString()}");
}
}
void ReceiveCallBack(IAsyncResult asyncResult)
{
try
{
ClientState state = (ClientState)asyncResult.AsyncState;
Socket clientfd = state.socket;
int count = clientfd.EndReceive(asyncResult);
//客户端关闭
if (count == 0)
{
clientfd.Close();
clients.Remove(clientfd);
return;
}
string recvStr = System.Text.Encoding.Default.GetString(state.readBuff,0,count);
Console.WriteLine("[服务器接收]" + recvStr);
byte[] sendBytes = System.Text.Encoding.Default.GetBytes("服务端:echo我接收到客户端消息:"+ recvStr);
clientfd.Send(sendBytes);//减少代码量,不用异步
clientfd.BeginReceive(state.readBuff,0,1024,0,ReceiveCallBack,state);
}
catch (SocketException e)
{
Console.WriteLine($"Socket Receive fail{e.ToString()}");
}
}
}
}