各位大侠:
我现在需要写一个C# 的 TCP Socket 客户端程序(WinForm),持续实时接收6个温湿度传感器(6个温湿度传感器的IP已知)发过来的数据,并且当服务器如果关闭,也就是ping不通的时候,客户端需要一直去连接,可一分钟去连接一次,直到服务端再次打开。
求一个思路,如果有示例代码就感激不尽了。。。
后台Socket 接受方法那个地方可以写一个white循环一直去接受服务器发送来的信息,定义一个事件,当接受到信息触发这个事件。前台在做具体操作
是的,目前有两个问题:
1.我需要接收6个服务器的IP的数据,是否需要写六遍循环接收数据的方法,有其他比较好的办法吗?
2 .当服务器断网后再重新打开时,我如何及时地重新连接上继续接收数据呢?
1 private void ReceMsgSix(Socket clientSocket, string ip) 2 { 3 while (!isStop) 4 { 5 try 6 { 7 byte[] buffer = new byte[1024]; 8 9 if (clientSocket.Connected) 10 { 11 int length = clientSocket.Receive(buffer); 12 if (length <= 0) break; 13 14 string data = HEXHelper.byteToHexStr(buffer, length); 15 if (data.Length == 18) 16 { 17 // 数据处理 18 } 19 } 20 else 21 { 22 LogHelper.LogFile(ip + " 的Socket正在重新连接..."); 23 break; 24 } 25 } 26 catch (Exception e) 27 { 28 LogHelper.LogFile(ip + " 发生异常了 :" + e.Message + "---;---" + e.StackTrace, ""); 29 //ConnectSix(); 30 break; 31 } 32 } 33 34 clientSocket.Shutdown(SocketShutdown.Both); 35 clientSocket.Close(); 36 clientSocket.Dispose(); 37 }
@LiamChan: 你可以封装一下 将连接做成一个类,每个连接是一个对象。我们现在是同时连接3个服务器
@LiamChan:
private static void ReceMsgSix(Socket clientSocket, string ip,Action<byte[]> fun)
{
if (data.Length == 18)
{
//处理数据
fun(buffer);
}
}
这样在外侧调用这个方法接受信息,传入处理数据的匿名方法,这样可以处理很多个连接
@赵大大: 谢谢指点,由于我是刚接触socket就被要求做这个,不是非常懂,能不能发个示例demo给我参考下呢? 非常谢谢了 ~~
@赵大大: 我的邮箱是 chli_1990@163.com ,感激不尽 !
@LiamChan: 加我下qq吧 我们这边有加密的 代码发给你你打不开 2535105453
@赵大大: 真不好意思,公司不准用qq阿
@LiamChan:
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace ClassLibrary2 { public class Text { public void text() { TCP.ConnectionServer("192.168.214.1", 800, SocketConncrionType.服务器1, DataoOperationFun); TCP.ConnectionServer("192.168.214.2", 800, SocketConncrionType.服务器2, DataoOperationFun); } public void DataoOperationFun(byte[] buffer, ConncrionSockets socket) { //数据操作 操作 switch (socket.type) { case SocketConncrionType.服务器1: break; case SocketConncrionType.服务器2: break; default: break; } } } public class TCP { private static List<ConncrionSockets> _ConncrionSocketsCollection; public static List<ConncrionSockets> ConncrionSocketsCollection { get { return _ConncrionSocketsCollection ?? (_ConncrionSocketsCollection = new List<ConncrionSockets>()); } } public static void ConnectionServer(string ip, int port, SocketConncrionType type, Action<byte[], ConncrionSockets> fun) { ConncrionSockets socket = new ConncrionSockets(); socket.IP = ip; socket.Port = port; socket.type = type; socket.DataoOperationFun = fun; IPAddress ipAddress = IPAddress.Parse(ip); IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, port); socket.SocketObj = new Socket(ipEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); socket.SocketObj.Connect(ipEndPoint); ConncrionSocketsCollection.Add(socket); } public static void ReceiveData(ConncrionSockets conncrionSocket) { ReceiveData(conncrionSocket, new byte[1024], 100); } private static void ReceiveData(ConncrionSockets socket, byte[] buffer, int outTime) { bool isStop = false; new System.Threading.Thread(() => { while (!isStop) { try { buffer = new byte[buffer.Length]; if (socket.SocketObj == null || socket.SocketObj.Connected == false) { throw new ArgumentException("参数socket为null,或者未连接到远程计算机"); } if (socket.SocketObj.Poll(outTime * 1000, SelectMode.SelectRead) == true) { int count = socket.SocketObj.Receive(buffer); socket.DataoOperationFun(buffer, socket); } } catch (Exception) { isStop = true; socket.TagerSocketClose(); } } }).Start(); } } public class ConncrionSockets { public System.Net.Sockets.Socket SocketObj { get; set; } /// <summary> /// Ip地址 /// </summary> public string IP { get; set; } /// <summary> /// 端口 /// </summary> public int Port { get; set; } /// <summary> /// 服务器类型 /// </summary> public SocketConncrionType type { get; set; } /// <summary> /// 数据操作匿名方法 /// </summary> public Action<byte[], ConncrionSockets> DataoOperationFun; public void TagerSocketClose() { //关闭连接 //或者做其他操作 比如再次连接服务 此处可以获取到 ip和Port } } public enum SocketConncrionType { 服务器1, 服务器2 } }
@LiamChan: 你看一下,对照着改一改 思路是这样的 你看看有没有问题 我没有测试
timer不就完了。socket客户端挺容易的啊
能否具体点呢?