首页 > 其他分享 >TCP连接

TCP连接

时间:2023-08-28 10:00:27浏览次数:26  
标签:Socket buffer len TCP new byte data 连接

创建一个服务端

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {//创建TCP的服务端
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            server.Bind(new IPEndPoint(IPAddress.Any, 10000));//IPAddress.Any-0000本机IP,10000为端口号
            server.Listen(1000);//监听连接的数量
            this.txtResult.AppendText("服务已经启动!");
            Thread t = new Thread(Execute);
            t.IsBackground=true;
            t.Start(server);

        }
        //线程Execute
        private void Execute( Object obj)
        {
            Socket server =obj as Socket;
            while(true)
            {
                Socket client = server.Accept();
                Thread thread = new Thread(SingleExecute);
                thread.IsBackground=true;
                thread.Start(client);
            }
        }
        //线程SingleExecute
        private void SingleExecute(Object obj)
        {
            Socket client = obj as Socket;
            //只做接收
            while (true)
            {
                byte[] buffer_len = new byte[4];
                int current_len = 0;
                do
                {
                    byte[] temp = new byte[buffer_len.Length-current_len];
                    int count = client.Receive(temp);//接收到的数据传入temp中,返回收到的字节数count
                    if (count > 0)
                    {
                        Array.Copy(temp,0,buffer_len, current_len, temp.Length);//把temp从索引0开始复制到buffer_len从current_len开始,长度为temp.Length
                        current_len += count;
                    }
                }while(current_len < buffer_len.Length);//确保收到包头(4个字节)
                int len = 0;
                len += (buffer_len[0] << 24);
                len += (buffer_len[1] << 16);
                len += (buffer_len[2] << 8);
                len += (buffer_len[3] );
                try
                {
                    byte[] data = new byte[len];
                    current_len = 0;
                    do
                    {
                        byte[] buffer = new byte[data.Length - current_len];
                        int count = client.Receive(buffer);
                        if (count > 0)
                        {
                            Array.Copy(buffer, 0, data, current_len, buffer.Length);
                            current_len += count;
                        }
                    } while (current_len < data.Length);
                    string msg = Encoding.UTF8.GetString(data);
                    output(msg);//输出
                    client.Send(Encoding.UTF8.GetBytes("1234"));//数据发送到Socket
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }
                
            }
        }
        private delegate void outputDelegate(string msg);

        private void output(string msg)
        {
            this.txtResult.Dispatcher.Invoke(new outputDelegate(outputAction), msg);
        }

        private void outputAction(string msg)
        {
            this.txtResult.AppendText(msg);
            this.txtResult.AppendText(" \n ");
            
        }
    }

创建一个客户端

        private void MenuItem_Click_3(object sender, RoutedEventArgs e)
        {
            Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            socket.Connect(new IPEndPoint(IPAddress.Parse("192.168.0.39"),10000));
            byte[] data=Encoding.UTF8.GetBytes("连接成功!");//The connection was successful,中文太大会导致算术溢出。
            int len = data.Length;
            byte[] data_len= new byte[4];
            data_len[0] = (byte)((len >>8*3) & 0xFF);
            data_len[1] = (byte)((len >>8*2) & 0xFF);
            data_len[2] = (byte)((len >>8*1) & 0xFF);
            data_len[3] = (byte)(len  & 0xFF);

            byte[] data_all = new byte[len + 4];
            Array.Copy(data_len,0,data_all, 0, data_len.Length);//把头部data_len复制到data_all
            Array.Copy(data, 0, data_all, 4, data.Length);

            socket.Send(data_all);

            byte[] buffer = new byte[1024];
            int count = socket.Receive(buffer,SocketFlags.None);
            if (count > 0)
            {
                string msg = Encoding.UTF8.GetString(buffer, 0, count);
                System.Windows.MessageBox.Show(msg);
                socket.Send(buffer, 0, count, SocketFlags.None);
            }
        }

 

标签:Socket,buffer,len,TCP,new,byte,data,连接
From: https://www.cnblogs.com/lin-07/p/17661503.html

相关文章

  • 使用FinalShell 连接虚拟机(Ubuntu) ip报错解决方案
    问题描述使用FinalShell连接时报以下错误:进入虚拟机查看IP时出现以下信息,并没有发现其主机IP信息解决方案在虚拟机(Ubuntu)中运行以下命令sudodhclientens33再次查看其ip信息然后查看FinalShell中,发现连接成功,最终问题得以解决关于dhclient命令dhclient......
  • Kepserver作为ModbusTCP Server数据上传案例
    该案例已实现于物联温湿度传感器采集第一步:数据采集(此处以ModbusRTU为例不做具体说明)  第二步:数据转发设置: (请参考我的博文: kepserver作为ModbusTcp服务器与外围设备通信)  第三步:数据采集和数据转发关联 ......
  • adb指令(查看电脑连接设备)
    电脑已配置ADB环境adb的全称为AndroidDebugBridge调试桥,是连接Android手机与PC端的桥梁,通过adb可以管理、操作模拟器和设备,如安装软件、系统升级、运行shell命令等。 详细:http://www.taodudu.cc/news/show-1575061.html?action=onClick一、连接设备操作步骤:1.IP连接法:同一......
  • mysql数据库连接密码的修改
    使用MySQL创建新连接时,密码是一个非常重要的组成部分。默认情况下,MySQL会生成一个随机的密码,该密码由一串随机的字符组成,包括数字、字母和其它特殊字符。在安装MySQL时,您可以选择使用自己的密码,也可以使用默认密码。默认密码是MySQL在安装时为root用户设置的密码。在许多情况下,建......
  • ⛳ TCP 协议面试题
    ⛳TCP协议面试题......
  • 解决win10下ensp连接cloud死机问题
    应用版本:eNSPV100R003C00SPC100VirtualBox-5.2.30-130521-WinWinPcap_4_1_3Wireshark-win64-3.0.3问题现象:链接cloud后 不能ping通 抓包发现好多来自192.168.56.1到192.168.56.2的udp包,一会儿就卡死出现#######可能是虚拟网卡问题,所以创建窗户自带的换回网卡解决问题......
  • PROFIBUS主站转MODBUS TCP网关
    1.产品功能YC-DPM-TCP网关在Profibus总线侧实现主站功能,在以太网侧实现ModbusTcp服务器功能。可将ProfibusDP从站接入到ModbusTcp网络;通过增加DP/PA耦合器,也可将ProfibusPA从站接入ModbusTcp网络。YC-DPM-TCP网关最多支持125个Profibus从站的通信,只支持单主站系统,不支持多主站......
  • 关于自建Rustdesk 远程桌面服务器的公网访问:无法连接中继服务器的问题解决方法
    自建服务器位于内网时,内网客户端ID/中继的地址通常写成内网IP,外网客户端一般会用公网IP进行端口映射,但这样设置出现外网客户端无法连接中继服务器,但内网客户端使用正常的现象。经过半天的排查分析,当内网和外网填写的自定义服务器地址时,rust服务器无法识别出需要使用nat包的地址,默......
  • 如何使用MicroPython将Raspberry Pi Pico W与伺服电机连接?
    PicoW是一款经济实惠且紧凑的微控制器板,基于RP2040芯片,非常适合嵌入式系统和物联网项目。MicroPython是Python的轻量级实现,为微控制器编程提供了用户友好的环境。通过遵循概述的步骤,读者将学习如何将伺服电机连接到PicoW、编写MicroPython代码来控制其运动,并获得将精确......
  • 【MySQL 8.0】建立安全的网络连接
    (root@node01)>showglobalvariableslike'require_secure_transport';+--------------------------+-------+|Variable_name|Value|+--------------------------+-------+|require_secure_transport|OFF|+----------------------......