服务器端
主要代码
private Socket serverSocket;
private void InitServerSocket()
{
IPAddress ip = IPAddress.Any;
IPEndPoint ipe = new IPEndPoint(ip, 10030);
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket.Bind(ipe);
serverSocket.Listen(10);
Task.Run(() =>
{
AcceptThread(serverSocket);
});
}
private void AcceptThread(Socket serverSocket)
{
while (true)
{
try
{
Socket tempSock = serverSocket.Accept();
Task.Run(() =>
{
HandleAccept(tempSock);
});
}
catch (Exception err)
{
}
}
}
private void HandleAccept(Socket sock)
{
while (true)
{
try
{
if (sock.Poll(-1, SelectMode.SelectRead))
{
byte[] buffer = new byte[4096];
int num = sock.Receive(buffer);
if (num == 0)
{
sock.Close();
break;
}
string sCmd = Encoding.UTF8.GetString(buffer, 0, num);
if (sCmd.Trim() == "") continue;
var cmd = JsonConvert.DeserializeObject<CmdPackage>(sCmd);
HandleCmd(sock, cmd);
}
}
catch (Exception err)
{
}
}
}
private void HandleCmd(Socket sock, CmdPackage cmd)
{
if (cmd.Cmd == "Start")
{
string ip = cmd.Parameters["ip"];
info("Start,ip:" + ip);
int ret = NrClientSDK.NrClientSDK_NewReader(ip);
startFlag = true;
CmdPackage retCmd = new CmdPackage();
retCmd.Cmd = "Return";
retCmd.Parameters.Add("ret", ret.ToString());
var sRet = JsonConvert.SerializeObject(retCmd);
byte[] ba = Encoding.UTF8.GetBytes(sRet);
sock.Send(ba);
}
}
CmdPackage 类
class CmdPackage
{
public string Cmd { get; set; }
public Dictionary<string, string> Parameters { get; set; }= new Dictionary<string, string>();
}
客户端
private string SendCmd(CmdPackage cmd)
{
IPAddress iP = IPAddress.Parse(serverIP);
IPEndPoint iPEndPoint = new IPEndPoint(iP, serverPort);
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.Connect(iPEndPoint);
var sCmd = JsonConvert.SerializeObject(cmd);
byte[] buffer = Encoding.UTF8.GetBytes(sCmd);
clientSocket.Send(buffer);
byte[] bufRcv = new byte[4096];
int num = clientSocket.Receive(bufRcv);
string sRcv = Encoding.UTF8.GetString(bufRcv, 0, num);
clientSocket.Close();
return sRcv;
}