c# Socket网络通讯简单案例

c# Socket网络通讯简单案例

  1. 客户端类
///引用
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;

	///参数(ip,端口,电文头,电文体,是否返回)
	///该案例为项目案例  电文头29个长度,电文体不统一
 public string StartClient(string ip, int Port, string head, string sendInfo, bool returnFlag)
        {
            string recInfo = "";
            try
            {
                IPAddress Ip = IPAddress.Parse(ip);
                IPEndPoint ipPort = new IPEndPoint(Ip, Port);//把ip和端口转化为IPEndPoint实例
                Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket
                clientSocket.Connect(ipPort);//连接到服务器
                lock (this){
                    byte[] bInfo = Encoding.Default.GetBytes(sendInfo);
                    int sendLen = bInfo.Length;
                    byte[] bt = new byte[sendLen + 29];
                    byte[] bLen = Encoding.Default.GetBytes(sendInfo);
                    byte[] bHead = Encoding.Default.GetBytes(head);
                    Array.Copy(bHead, 0, bt, 0, bHead.Length);
                    Array.Copy(bInfo, 0, bt, 29, bInfo.Length);

                    clientSocket.Send(bt, bt.Length, 0);  //发送到服务端
                    if (returnFlag){
                        byte[] recLenByte = new byte[5];
                        clientSocket.Receive(recLenByte, recLenByte.Length, 0);
                        int recLen = Convert.ToInt16(Encoding.Default.GetString(recLenByte, 0, 5));
                        byte[] recInfoByte = new byte[recLen];
                        clientSocket.Receive(recInfoByte, recInfoByte.Length, 0);
                        recInfo = Encoding.Default.GetString(recInfoByte, 0, recLen).ToString();
                    }
                    clientSocket.Close();
                    return recInfo;
                }
            }
            catch (ArgumentNullException e){ return e.ToString();}
            catch (SocketException e){return e.ToString();}
        }
  1. 服务端类
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

    public class SocketServer
    {
        public static int port;///定义端口号
        private static System.Threading.Thread TCComunication;//定义线程
        public static Socket serverSocket;//定义socket
        /// <summary>
        ///是否断开连接
        /// </summary>
        public static bool flag;
        ///赋值 客户端 端口号
        public static void  SocketServers(int Port)
        {
            flag = true;
            port = Port;
        }
		///停止监听
        public static void exit()
        {
            flag = false;
            System.Threading.Thread.Sleep(1000);
            TCComunication.Abort();
            serverSocket.Close();
        }
		///开启监听
        public static void Startthread()
        {
            TCComunication = new Thread(new ThreadStart(Start));
            TCComunication.Start();
        }
        public static void Start()
        {
            try
            {
                string recInfo = "";
                string host = "192.168.1.1";//配置客户端ip地址
                IPAddress ip = IPAddress.Parse(host);
                IPEndPoint ipe = new IPEndPoint(ip, port);
                serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket类
                serverSocket.Bind(ipe);//绑定端口
                serverSocket.Listen(0);//开始监听
                while (flag)
                {
                    Socket temp = serverSocket.Accept();//为新建连接创建新的Socket。
                    byte[] recLenByte = new byte[1000];//定义一个1000长度的byte数组来接收
                    temp.Receive(recLenByte, recLenByte.Length, 0);
                    string str = Encoding.Default.GetString(recLenByte);//转string类型
                    string head = str.Substring(0,29);//截取电文头部
                     recInfo = str.Remove(0,29);//删掉电文头 就是电文体
                   string sendInfo =  parseHead(head, recInfo);//根据电文头和电文体 做出对应的操作
                    if (sendInfo != "")//sendInfo 返回给客户端的信息
                    {
                        byte[] bInfo = Encoding.Default.GetBytes(sendInfo);
                        int sendLen = bInfo.Length;
                        byte[] bLen = Encoding.Default.GetBytes(sendLen.ToString());
                        byte[] bt = new byte[sendLen + 5];
                        Array.Copy(bLen, 0, bt, 0, bLen.Length);
                        Array.Copy(bInfo, 0, bt, 5, sendLen);
                        temp.Send(bt, bt.Length, 0);//发送给客户端
                    }
                    temp.Close();
                    if (!flag)
                    {
                        temp.Close();
                        serverSocket.Close();
                        break;
                    }
                    Thread.Sleep(1000);
                }

            }
            catch (ArgumentNullException e)
            {
                Console.WriteLine("ArgumentNullException: {0}", e);
            }
            catch (SocketException e)
            {
                Console.WriteLine("SocketException: {0}", e);
            }


        }

        public static string parseHead(string head, string info)
        {
            string heads = head.Substring(head.Length - 25, 6);//截取出对应接口编号
            string reNull = "";//回复信息
            switch (heads)
            {
                case "E12345":  
                    reNull = "123";
                    break;
                 case "Q12345":  
                    reNull = "456";
                    break;
                case "w12346": 
                    reNull = "789";
                    break;
                default:
                    break;
            }
            return reNull;
        }
        public SocketServer()
        {
        }
    }
}

3.操作实现

  • 调用服务端启动监听
   //SocketServer:服务端类名
   SocketServer.SocketServers(9999);
   SocketServer.Startthread();//开始监听
  • 调用客户端 向服务端发送电文
  SocketClient PCXF = new SocketClient();//初始化创建客户端
  string plan_no =  PCXF.StartClient(HostIP, port, hread, param, false);//调用客户端向服务端发送数据 plan_no是服务端返回的数据
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中,Socket通讯是一种常见的网络通讯方式。通过使用Socket类,可以实现客户端和服务器之间的数据传输。在给定的引用中,我们可以看到一些关键的代码片段。 引用\[1\]中的代码片段是一个接收消息的方法。它通过clientSocket接收数据,并将接收到的消息打印出来。这个方法通常在一个循环中运行,以便持续接收来自客户端的消息。 引用\[2\]中的代码片段是一个监听客户端连接的方法。它使用serverSocket.Accept()方法来接受客户端的连接请求,并向客户端发送一条消息。然后,它创建一个新的线程来处理与该客户端的通信,这个线程调用了前面提到的接收消息的方法。 引用\[3\]中的代码片段是程序的入口点。它创建了一个服务器Socket,并绑定了一个IP地址和端口。然后,它开始监听客户端的连接请求,并在接受到连接后启动一个新的线程来处理与该客户端的通信。 综上所述,这些代码片段展示了在C#中使用Socket进行通讯的基本步骤,包括创建Socket、绑定IP地址和端口、监听连接请求、接收和发送数据等。 #### 引用[.reference_title] - *1* *2* *3* [C#Socket通讯(外网通讯,借助花生壳内网穿透)](https://blog.csdn.net/yunhaiC/article/details/121034490)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值