首页 > 编程语言 >C# TCP通信

C# TCP通信

时间:2024-07-26 17:50:23浏览次数:7  
标签:socket C# cB System TCP 通信 IPs ex using

一、服务端

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace WindowsFormsApp7
{
    public partial class Form2 : Form
    {
        //服务器套接字
        private Socket socket;
        //客户端连接
        List<Socket> sockets = new List<Socket>();

        Encoding encoding = Encoding.UTF8;
        public Form2()
        {
            InitializeComponent();
            load();
        }

        private void Label3_Click(object sender, EventArgs e)
        {

        }

        /// <summary>
        /// 加载
        /// </summary>
        private void load()
        {
            //1.获取本地网络分配给你的IP
            System.Net.IPHostEntry hostEntry = Dns.GetHostEntry(Dns.GetHostName());
            //第二步:
            foreach (var item in hostEntry.AddressList)
            {
                //3.判断是否是协议版本V4
                if (item.AddressFamily == AddressFamily.InterNetwork)
                {
                    cB_IPs.Items.Add(item);
                }
            }
            //添加本机IP
            cB_IPs.Items.Add("127.0.0.1");
            cB_IPs.Items.Add("192.168.110.96");
            cB_IPs.SelectedIndex = 0;//默认选中0个对象
        }

        /// <summary>
        /// 打开服务器
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button2_Click(object sender, EventArgs e)
        {
            //1.初始化
            socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            //2.监听
            IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Parse(cB_IPs.Text) ,(int)numericUpDown1.Value);
            try
            {
                socket.Bind(iPEndPoint);//监听
                socket.Listen(10);//一秒可以监听多少个客户端连接
                //监听客户端
                ThreadPool.QueueUserWorkItem((Object o) =>
                {
                   
                    while (true)
                    {
                        Socket socket1 = socket.Accept();//客户端连接
                        sockets.Add(socket1);
                        //获取客户端连接IP和端口
                        IPEndPoint iPEndPoint1 = (IPEndPoint)socket1.RemoteEndPoint;
                        //显示到数据表格
                        dataGridView1.Invoke(new Action(() =>
                        {
                            dataGridView1.Rows.Add(iPEndPoint1.Address, iPEndPoint1.Port);
                        }));
                    }
                    
                });
            }
            catch (Exception ex)
            {
                MessageBox.Show($"服务端开始失败:{ex}");
            }

        }

        /// <summary>
        /// 发送
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button3_Click(object sender, EventArgs e)
        {
            try
            {
                //判断是否群发
                int index = dataGridView1.CurrentCell.RowIndex;
                //判断是否群发
                if (checkBox1.Checked)
                {
                    foreach (Socket item in sockets)
                    {
                        item.Send(encoding.GetBytes(textBox3.Text));
                    }
                }
                else
                {
                    //获取客户端socket
                    Socket socket = sockets[index];
                    //发送
                    socket.Send(encoding.GetBytes(textBox3.Text));
                }
            }
            catch (Exception ex)
            {

                MessageBox.Show($"发送失败:{ex}");
            }
      
        }
    }
}
View Code

 

二、客户端

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace WindowsFormsApp7
{
    public partial class Form1 : Form
    {
        private Socket socket;
        Encoding encoding = Encoding.Unicode;
        public Form1()
        {
            InitializeComponent();
            load();

        }

        /// <summary>
        /// 加载
        /// </summary>
        private void load()
        {
            //1.获取本地网络分配给你的IP
            IPHostEntry hostEntry = Dns.GetHostEntry(Dns.GetHostName());
            //第二步:
            foreach (var item in hostEntry.AddressList)
            {
                //3.判断是否是协议版本V4
                if (item.AddressFamily == AddressFamily.InterNetwork)
                {
                    cB_IPs.Items.Add(item);
                }
            }
            //添加本机IP
            cB_IPs.Items.Add("127.0.0.1");
            cB_IPs.Items.Add("192.168.110.96");
            cB_IPs.SelectedIndex = 0;//默认选中0个对象
        }

        /// <summary>
        /// 连接
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button2_Click(object sender, EventArgs e)
        {
            //第一步:初始化套接字对象
            socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            try
            {
                //第二步:连接
                socket.Connect(cB_IPs.Text,(int)numericUpDown1.Value);
                ThreadPool.QueueUserWorkItem(Reception);
                MessageBox.Show("连接成功!");
                button1.Enabled = true;
                button3.Enabled = true;
                button2.Enabled = false;
                cB_IPs.Enabled = false;
                numericUpDown1.Enabled = false;
            }
            catch(Exception ex)
            {
                //连接失败
                MessageBox.Show($"连接失败:{ex}");
            }

        }
        /// <summary>
        /// 断开
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button1_Click(object sender, EventArgs e)
        {
            if (socket != null && socket.Connected)
            {
                socket.Close();
                MessageBox.Show("断开连接");
                button1.Enabled = false;
                button2.Enabled = true;
                cB_IPs.Enabled = true;
                numericUpDown1.Enabled = true;
                button3.Enabled = false;
            }
        }

        /// <summary>
        /// 发送
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button3_Click(object sender, EventArgs e)
        {
            //1.判断连接状态
            if (socket != null && socket.Connected)
            {
                //2.字符串转换二进制
                byte[] data = encoding.GetBytes(textBox3.Text);
                try
                {
                    //3.发送
                    socket.Send(data);
                }
                catch (Exception ex)
                {

                    MessageBox.Show($"发送失败:{ex}");
                }
            }
        }

        /// <summary>
        /// 接收数据
        /// </summary>
        public void Reception(Object o)
        {
            byte[] data = new byte[1024*2];
            try
            {
                //接收
                int length = socket.Receive(data);
                //判断是否有发送字节
                if (length > 0)
                {
                    textBox2.Invoke(new Action(() => {
                        textBox2.Text += $"RX [{DateTime.Now.ToString("HH:mm:ss")}]:{encoding.GetString(data, 0, length)}";
                    }));

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"接收失败:{ex}");
            }
        }
    }
}
View Code

 

标签:socket,C#,cB,System,TCP,通信,IPs,ex,using
From: https://www.cnblogs.com/zeussbook/p/18325935

相关文章

  • [三、渲染控制法]3. ForEach:循环渲染
    ForEach接口基于数组类型数据来进行循环渲染,需要与容器组件配合使用,且接口返回的组件应当是允许包含在ForEach父容器组件中的子组件。例如,ListItem组件要求ForEach的父容器组件必须为List组件。说明从APIversion9开始,该接口支持在ArkTS卡片中使用。接口描述ForEa......
  • [二、状态管理]4其他状态管理(2)@Watch装饰器:状态变量更改通知
    @Watch应用于对状态变量的监听。如果开发者需要关注某个状态变量的值是否改变,可以使用@Watch为状态变量设置回调函数。说明从APIversion9开始,该装饰器支持在ArkTS卡片中使用。 概述@Watch用于监听状态变量的变化,当状态变量变化时,@Watch的回调方法将被调用。@Watch......
  • Fatal error: Call to undefined function mysql_connect() in …
    错误记录:Fatalerror:Calltoundefinedfunctionmysql_connect()in…错误原因:运行环境问题解决方案:你的PHP不支持mysql_connect()函数。PHP是一种模块化的设计,除了核心的内容,其他都是可选的。之所以不支持,是因为在编译PHP时没有加入对MYSQL数据库的支持。原因2:......
  • CF932C Permutation Cycle
    题目传送门思路:个人认为构造题全靠感性理解,理解对了问题就迎刃而解了。(有点像做阅读理解)我们先感性地理解题目中所有变量和函数的含义。\(f\)函数是什么?当\(j\neq0\)时,\(f(i,j)=f(p_i,j-1)\),就是使\(j\)花费了\(1\)的代价,然后使\(i\)变为了\(p_i\)。这就......
  • Android 将 ViewModel 和 Compose界面的数据 双向绑定
    简介双向绑定说白了就是达到下面的效果:ViewModel能够实时传输从Room数据库查询到的数据到Compose页面。Compose页面能实时传输用户输入的数据到ViewModel类。需要分别在ViewModel和Compose中操作。一、在ViewModel中:1、使用mutableStateOf家族定义一个可变的值(......
  • C#调用C++的dll方法
    C#调用C++的dll方法有时候用一些硬件厂家的库函数,厂家没有支持C#的,就只有C、C++语言,这个时候只能将C、C++编译成dll文件,然后用C#来调用这些接口。下面使用环境为vs2010,win32,x86C++打包成为dll首先创建一个win32的C++项目然后点击向导中的dll然后在这个文件中编写dll的函数......
  • 【踩坑系列-Docker】基于Alibaba Cloud Linux3基础镜像安装Nginx
    Author:赵志乾Date:2024-07-26Declaration:AllRightReserved!!!1.问题描述    使用AlibabaCloudLinux3作为基础镜像,在其上安装Nginx,对应的Dockerfile内容如下:#指定基础镜像FROMalibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3:lat......
  • 在.net 8中使用HttpClientFactory时日志记录请求body和响应body
     1、定义DelegatingHandlerpublicclassLoggingHandler:DelegatingHandler{privatereadonlyILogger<LoggingHandler>_logger;publicLoggingHandler(ILogger<LoggingHandler>logger){_logger=logger;}protectedov......
  • 二叉树及其存储实现C语言(附上源码)
    1.什么是二叉树        二叉树是一种特殊的树型结构,其特点是每个结点至多只有两棵子树(即二叉树不存在度大于二的结点),并且二叉树的子树有左右之分,次序不可颠倒【有序树】。 2.二叉树的定义二叉树T:一个有穷的结点集合。    -这个集合可以为空;    -......
  • jeecg boot 企业级应用管理后台 (五)菜单模块介绍 从0开始 (持续更新)
    Jeecg的菜单模块是其重要组成部分,管理和展示应用程序中的导航菜单。以下是关于Jeecg菜单模块的详细介绍,涵盖了数据库、前端和后端的各个部分。数据库部分Jeecg的菜单模块在数据库中通常涉及以下几个表:菜单表(sys_menu):存储菜单的基本信息,如菜单名称、路径、图标、父级菜......