最近有个项目关于用socket传输对象话不多说直接上代码
服务端
Thread TcpThread = new Thread(new ThreadStart(Listen)); TcpThread.Start();//启动一个子线程来调用socket的监听方法
Socket socketAccpet;
public void Listen(){
IPAddress address = IPAddress.Parse("192.168.1.218"); Socket tcpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); IPEndPoint IP = new IPEndPoint(address, 3000);
MessageBox.Show("监听已启动");
socketAccpet = tcpSocket.Accept(); tcpSocket.Bind(IP);
tcpSocket.Listen(10);
while (true)
{
thread.Start();//可能有并发请求,所以消息的接收也需要在子线程中处理 Thread thread = new Thread(new ThreadStart(ReceiveMsg));
}
}
public void ReceiveMsg() { byte[] buffer = new byte[1024]; MemoryStream mStream = new MemoryStream(); mStream.Position = 0; while (true) { int ReceiveCount = socketAccpet.Receive(buffer, 1024, 0); if (ReceiveCount == 0) { break;//接收到的字节数为0时break } else { mStream.Write(buffer, 0, ReceiveCount); //将接收到的数据写入内存流 } } mStream.Flush(); mStream.Position = 0; BinaryFormatter bFormatter = new BinaryFormatter(); if (mStream.Capacity > 0) { //将接收到的内存流反序列化为对象 Police1 p = (Police1)bFormatter.Deserialize(mStream); this.BeginInvoke(new Action(() => { UpdateUI(p); })); } else { //Console.WriteLine("接收到的数据为空。"); } socketAccpet.Close(); }
客户端
public void sendMsg(Object obj) {
try
FaceModel model = obj as FaceModel; {
IPAddress IP = IPAddress.Parse("192.168.1.218"); ; Socket socketSend = null;
while (true)
socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); {
IPEndPoint Ip = new IPEndPoint(IP, 3000);
MemoryStream mStream = new MemoryStream(); socketSend.Connect(Ip);
bformatter.Serialize(mStream, model); //将消息类转换为内存流 BinaryFormatter bformatter = new BinaryFormatter(); //二进制序列化类
mStream.Flush();
while (mStream.Read(buffer, 0, buffer.Length) > 0) byte[] buffer = new byte[1024];
mStream.Position = 0; //将流的当前位置重新归0,否则Read方法将读取不到任何数据
{
if (socketSend != null) socketSend.Send(buffer); //从内存中读取二进制流,并发送
}
break;
}
socketSend.Close();
}
} catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
void InitSocketThread() { socketTh = new Thread(new ThreadStart(InitSocket)); socketTh.IsBackground = true; socketTh.Start(); }
public void InitSocket() { IPAddress[] ips = Dns.GetHostEntry(Dns.GetHostName()).AddressList; String ip = String.Empty;
foreach (var item in ips) { if (item.AddressFamily.ToString() == "InterNetwork") { ip = item.ToString(); break; } }
DeviceSet[] dss = CGlobalData.Instance.Service.GetDeviceSetting(ip); foreach (var item in dss) { if (item.Keydesc == "ServerIP") {
point = new IPEndPoint(IPAddress.Parse(item.Kvalue), 55555); break; } } Boolean isConnection = false;
while (!isConnection) { try { client.Client.Connect(point); isConnection = true; } catch (Exception ex) { isConnection = false; } }
有一点很重要,客户端和服务端的对象必须来自同一dll