首页新闻找找看学习计划

WinForm 多个Socket持续接收服务端数据

0
悬赏园豆:100 [已解决问题] 解决于 2018-03-29 10:33

各位大侠:

我现在需要写一个C# 的 TCP Socket 客户端程序(WinForm),持续实时接收6个温湿度传感器(6个温湿度传感器的IP已知)发过来的数据,并且当服务器如果关闭,也就是ping不通的时候,客户端需要一直去连接,可一分钟去连接一次,直到服务端再次打开。

 

求一个思路,如果有示例代码就感激不尽了。。。

LiamChan的主页 LiamChan | 初学一级 | 园豆:102
提问于:2018-03-27 15:07
< >
分享
最佳答案
1

后台Socket 接受方法那个地方可以写一个white循环一直去接受服务器发送来的信息,定义一个事件,当接受到信息触发这个事件。前台在做具体操作

收获园豆:100
赵大大 | 初学一级 |园豆:1 | 2018-03-28 13:35

是的,目前有两个问题:

 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 | 园豆:102 (初学一级) | 2018-03-28 13:44

@LiamChan: 你可以封装一下 将连接做成一个类,每个连接是一个对象。我们现在是同时连接3个服务器

赵大大 | 园豆:1 (初学一级) | 2018-03-28 13:52

@LiamChan:

 private static void ReceMsgSix(Socket clientSocket, string ip,Action<byte[]> fun)

{

  if (data.Length == 18)

  {

    //处理数据

    fun(buffer);

  }

}

这样在外侧调用这个方法接受信息,传入处理数据的匿名方法,这样可以处理很多个连接

赵大大 | 园豆:1 (初学一级) | 2018-03-28 13:57

@赵大大: 谢谢指点,由于我是刚接触socket就被要求做这个,不是非常懂,能不能发个示例demo给我参考下呢? 非常谢谢了 ~~

LiamChan | 园豆:102 (初学一级) | 2018-03-28 14:00

@赵大大: 我的邮箱是 chli_1990@163.com ,感激不尽 !

LiamChan | 园豆:102 (初学一级) | 2018-03-28 14:05

@LiamChan: 加我下qq吧 我们这边有加密的 代码发给你你打不开 2535105453

赵大大 | 园豆:1 (初学一级) | 2018-03-28 14:05

@赵大大: 真不好意思,公司不准用qq阿

LiamChan | 园豆:102 (初学一级) | 2018-03-28 14:12

@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
    }
}
赵大大 | 园豆:1 (初学一级) | 2018-03-28 14:32

@LiamChan: 你看一下,对照着改一改 思路是这样的 你看看有没有问题 我没有测试

赵大大 | 园豆:1 (初学一级) | 2018-03-28 14:33
其他回答(1)
1

timer不就完了。socket客户端挺容易的啊

日暮青色 | 园豆:339 (菜鸟二级) | 2018-03-27 15:11

能否具体点呢?

支持(0) 反对(0) LiamChan | 园豆:102 (初学一级) | 2018-03-27 15:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册