关于Socket传输对象
2016-11-19 11:48
218 查看
最近有个项目关于用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) {tryFaceModel 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
相关文章推荐
- 关于socket通信时传输对象
- 关于socket使用Amf直接进行对象传输的
- socket传输对象,这篇很失败,请看BLOG中另外一篇
- socket使用代理连接以及传输对象
- Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--前面6篇博文全部源代码下载地址
- 关于,C/S传输数据时,并发的socket数,多少个合适?10
- socket传输类对象
- 关于axis 使用过程中传输对象序列化的问题
- C# socket传输自定义对象
- android socket对象传输
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务3[聊天室][使用IE浏览本页]
- c#socket实现对序列化对象的传输和接收
- 关于Silverlight Socket编程中不能传输汉字的临时处理方法
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务1
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--类设计2
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务4[聊天室][使用IE浏览本页]
- JAVA Socket传输数据和对象
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--类设计1
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务3[聊天室]
- Socket同时使用ObjectInputStream和ObjectOutputStream传输序列化对象时的顺序