1.服务器端操作
Thread threadWatch = null; //负责监听客户端的线程
Socket socketWatch = null; //负责监听客户端的套接字
//创建一个负责和客户端通信的套接字
List<Socket> socConnections = new List<Socket>();
List<Thread> dictThread = new List<Thread>();
/// <summary>
/// 打开监控
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void skinButton1_Click(object sender, EventArgs e)
{
//定义一个套接字用于监听客户端发来的信息 包含3个参数(IP4寻址协议,流式连接,TCP协议)
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//服务端发送信息 需要1个IP地址和端口号
IPAddress ipaddress = IPAddress.Parse(GModel.LocalIp); //获取文本框输入的IP地址
//将IP地址和端口号绑定到网络节点endpoint上
IPEndPoint endpoint = new IPEndPoint(ipaddress, 8848); //获取文本框上输入的端口号
//监听绑定的网络节点
socketWatch.Bind(endpoint);
//将套接字的监听队列长度限制为20
socketWatch.Listen(20);
//创建一个监听线程
threadWatch = new Thread(WatchConnecting);
//将窗体线程设置为与后台同步
threadWatch.IsBackground = true;
//启动线程
threadWatch.Start();
//启动线程后 txtMsg文本框显示相应提示
OPCommon.LogWrite.WriteLog("开始监听客户端传来的信息!" + "\r\n");
}
/// <summary>
/// 监听客户端发来的请求
/// </summary>
private void WatchConnecting()
{
while (true) //持续不断监听客户端发来的请求
{
Socket socConnection = socketWatch.Accept();
OPCommon.LogWrite.WriteLog("客户端连接成功" + socConnection.RemoteEndPoint + "\r\n");
//创建一个通信线程
ParameterizedThreadStart pts = new ParameterizedThreadStart(ServerRecMsg);
Thread thr = new Thread(pts);
thr.IsBackground = true;
socConnections.Add(socConnection);
//启动线程
thr.Start(socConnection);
dictThread.Add(thr);
}
}
//是否接受
private CancellationTokenSource cts = new CancellationTokenSource();
///
/// 接收客户端发来的信息
///
///客户端套接字对象
private void ServerRecMsg(object socketclientpara)
{
Socket socketServer = (Socket)socketclientpara;
while (!cts.IsCancellationRequested)
{
//创建一个内存缓冲区 其大小为1024*1024字节 即1M
byte[] arrServerRecMsg = new byte[1024 * 1024];
//将接收到的信息存入到内存缓冲区,并返回其字节数组的长度
try
{
int length = socketServer.Receive(arrServerRecMsg);
if (length != 0)
{
//将机器接受到的字节数组转换为人可以读懂的字符串
string strSRecMsg = Encoding.UTF8.GetString(arrServerRecMsg, 0, length);
int StartIndex = strSRecMsg.IndexOf("<?xml");
if (StartIndex > 0 )
{
string ChuliOver = strSRecMsg.Substring(StartIndex);
int EndIndex = ChuliOver.LastIndexOf("</EventNotificationAlert>");
ChuliOver = ChuliOver.Substring(0, EndIndex + 25);
Dictionary<string, string> GetDic = new Dictionary<string, string>();
OPCommon.XMLOpC.Xml2DicFC(ref GetDic,ChuliOver);
if (GetDic !=null)
{
GetDatas modelData = new GetDatas();
string Chepaihao = "";
string Leixing = "";
string Infs = "";
if (GetDic.Keys.Contains("licensePlate"))
{
Chepaihao = GetDic["licensePlate"];
}
if (GetDic.Keys.Contains("vehicleType"))//largeBus----2
{
Leixing = GetDic["vehicleType"];
}
if (GetDic.Keys.Contains("ANPR"))
{
Infs = GetDic["ANPR"];
}
modelData.Chepaihao = Chepaihao;
modelData.CheType = Leixing;
modelData.Infos = Infs;
string OutLeixingNo = Leixing.Substring(Leixing.IndexOf("----"));
ResultMsgComm msgApi = new APIGet().UpdateChepaiInfos(Chepaihao,GModel.ThisNo,OutLeixingNo);
modelData.APISucess = msgApi.Success;
modelData.APIFanhui = msgApi.AllMsg;
ResultMsg msg = new DAL.DALGetDatas().Insert(modelData);
if (msg.Success)
{
}
if (msgApi.Success)
{
}
}
}
将发送的字符串信息附加到文本框txtMsg上
//Msg = ("客户端:" + GetCurrentTime() + socketServer.RemoteEndPoint + "的消息:" + strSRecMsg + "\r\n");
}
}
catch (Exception ex)
{
//Msg = ("客户端:" + GetCurrentTime() + socketServer.RemoteEndPoint + "已经中断连接" + "\r\n"); //提示套接字监听异常
//dic.Remove(socketServer.RemoteEndPoint);
OPCommon.LogWrite.WriteLog(ex.Message);
socketServer.Close();//关闭之前accept出来的和客户端进行通信的套接字
break;
}
}
}
/// <summary>
/// 发送信息到客户端的方法
/// </summary>
/// <param name="sendMsg">发送的字符串信息</param>
private void ServerSendMsg(string sendMsg)
{
//将输入的字符串转换成 机器可以识别的字节数组
byte[] arrSendMsg = Encoding.UTF8.GetBytes(sendMsg);
//向客户端发送字节数组信息
foreach (Socket socConnection in socConnections)
{
socConnection.Send(arrSendMsg);
}
//将发送的字符串信息附加到文本框txtMsg上
//txtMsg.AppendText("So-flash:" + GetCurrentTime() + "\r\n" + sendMsg + "\r\n");
//}
}
2.客户端连接服务端
//创建Socket
private Socket tcpClient;
//创建取消数据源
private CancellationTokenSource cts = new CancellationTokenSource();
private void bt_netConnect_Click(object sender, EventArgs e)
{
if (this.bt_netConnect.Text == "连接")
{
//实例化Socket
tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
EndPoint ep = new IPEndPoint(IPAddress.Parse(this.tb_ipTxt.Text), int.Parse(this.tb_portTxt.Text));
try
{
tcpClient.Connect(ep);
}
catch (Exception ex)
{
MessageBox.Show("连接失败:" + ex.Message);
return;
}
MessageBox.Show("连接成功");
this.bt_netConnect.Text = "断开";
Task.Run(new Action(() =>
{
GetValue();
}));
}
else
{
tcpClient?.Close();
this.bt_netConnect.Text = "连接";
}
}
//读数据
private void GetValue()
{
while (!cts.IsCancellationRequested)
{
byte[] buffer = new byte[1024 * 10];
int length = -1;
try
{
length = tcpClient.Receive(buffer, SocketFlags.None);
}
catch(Exception ex)
{
break;
}
if (length > 0)
{
byte[] result = new byte[length];
Buffer.BlockCopy(buffer, 0, result, 0, length);
ReceiveDataDisplay(result);
SetValue(result);
}
}
}
//显示接收数据
private void ReceiveDataDisplay(byte[] b)
{
string str = System.Text.Encoding.Default.GetString(b);
if (tb_receiveTxt.InvokeRequired)
{
MethodInvoker mi = delegate ()
{
string str1 = tb_receiveTxt.Text;
tb_receiveTxt.Text = str1 + str;
};
tb_receiveTxt.Invoke(mi);
}
else
{
string str1 = tb_receiveTxt.Text;
tb_receiveTxt.Text = str1 + str;
}
}
//写数据
private void SetValue(byte[] b)
{
if (tcpClient.Connected)
{
try
{
tcpClient.Send(b);
}catch(Exception ex)
{
return;
}
}
}