C# TCP操作(服务,客户端)

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;
            }
        }
    } 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: c是计算机编程语言中的一种。它是一种高级编程语言,由丹尼斯·里奇在1972年开发出来。C语言的设计目标是提供高效、灵活和可移植的编程方式。C语言的特点包括: 1. 简洁而直观的语法:C语言的语法结构相对简单,容易理解和使用。它使用了大量的关键字和语法结构来实现各种功能。 2. 功能强大的标准库:C语言提供了丰富的标准库,包含了大量的函数和数据类型,可以方便地进行各种操作和处理。 3. 高效的执行速度:C语言编写的程序执行速度非常快,因为它是一种编译型语言,可以直接转换为机器代码执行。 4. 跨平台性:C语言的代码可以在不同的操作系统和平台上运行,只需稍作修改。这使得C语言成为编写移植性强的程序的理想选择。 5. 应用广泛:C语言广泛应用于系统级编程、嵌入式系统、游戏开发、网络编程等领域。许多操作系统和编译器都是用C语言编写的。 总而言之,C语言是一种强大而灵活的编程语言,具有高效、可移植和广泛应用等特点。它为程序员提供了丰富的功能和工具,使得开发复杂的软件变得更加简单和容易。无论是初学者还是经验丰富的开发者,学习和掌握C语言都是非常有价值的。 ### 回答2: c可以代表很多东西,如: 1. C语言:C语言是一种通用的高级程序设计语言,由贝尔实验室的Dennis M. Ritchie在20世纪70年代开发。它是一门强大且灵活的语言,广泛用于系统软件开发,嵌入式系统以及其他计算机应用程序的编写。 2. 久仰大名:C语言的名字很有名,因为它在计算机编程领域具有重要的地位,并且已成为许多计算机科学课程的基石。学习C语言可以帮助人们了解计算机的底层工作原理并提高编程能力。 3. 碳元素:C是化学元素周期表上的一个符号,代表碳元素。碳是地球上最常见的元素之一,它存在于各种有机化合物中,并且在生命的基础元素中起着重要作用。 4. 高音调:在西方音乐中,C是一个高音调的音符,它位于音阶的第一位。C音符也常用作调音参考,用来调整乐器的音高。 综上所述,C是一个多义词,可以指代C语言、久仰大名、碳元素以及高音调。具体取决于背景和语境。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值