多线程下SOCKET编程

SOCKET编程往往离不开多线程,说到多线程,总的说来还是一个比较复杂的东西,尤其是业务逻辑变得复杂的时候,有时候或者说经常,会弄得人头晕脑胀。但是C#,相对好一点,因为微软封装了,帮我们做很多工作,但是在实际的编码过程中,往往会出现各种各样的错误或者BUG。

这里先写一个简单的多线程函数,这样有个初步的理解,也算是入门了,相信大家不用多论述就能明白。

public static void Start()
        {
            Thread t1 = new Thread(ExceMethod);
            t1.IsBackground = true;
            t1.Start();

            Console.WriteLine(DateTime.Now);
        }

        private static void ExceMethod()
        {
           while(true){
                Console.WriteLine(DateTime.Now);
                
               //do anything

               Thread.Sleep(1000);
            }
        }

   如果两个方法都去掉static 也是可以的。这样就实现了多线程,简单吧。当如如果仅仅是这个代码,恐怕也没什么意义哦,这个只是表示我们已经实现了多线程。多线程主要用在有阻塞的场合下。

  在这里我们和SOCKET结合起来使用,SOCKET多线程服务器端代码

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;

namespace ConsoleSocketServer
{
    class Program
    {
        private static TcpListener tcpServer = null;
        
        private static byte[] bytes = new byte[256];

        static void Main(string[] args)
        {
            IPAddress iPAddress = IPAddress.Any;
            tcpServer = new TcpListener(iPAddress, 999);
            //999是端口号,可以随便改 0-1024,主要不要和什么80,8080之类的常用端口号相冲突哦。

              tcpServer.Start();
            Console.WriteLine("监听已启动......");

            Thread t1 = new Thread(ExceMethod);
            t1.IsBackground = true;
            t1.Start();

            Console.ReadKey();
        }

        private static void ExceMethod()
        {
            byte[] msg = Encoding.UTF8.GetBytes("服务端数据");

           while(true){
               TcpClient client = tcpServer.AcceptTcpClient();
               while (true)
               {
                   try
                   {
                       int i = client.Client.Receive(bytes);

                       Console.WriteLine(DateTime.Now.ToString("G") + "接受:" + Encoding.UTF8.GetString(bytes));

                       client.Client.Send(msg);
                   }catch{
                       break;
                   }
               }
               client.Close();

               Thread.Sleep(1000);//10000单位是毫秒,系统在运行过程中,稍微有点停顿,个人感觉会更好一点。
            }
        }
    }
}

SOCKET多线程客户端代码

using System;
using System.Text;
using System.Collections;
using System.ComponentModel;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using System.Collections.Generic;
using System.Runtime.InteropServices;


namespace ConsoleSocketClient
{
    class Program
    {
        private static TcpClient client = new TcpClient();

        static void Main(string[] args)
        {
            client.Connect("127.0.0.1", 999);
            Console.WriteLine("连接成功......");

            Thread t1 = new Thread(ExceMethod);
            t1.IsBackground = true;
            t1.Start();

            Console.ReadKey();
        }
        
        private static void ExceMethod()
        {
            while (true) { 
            byte[] data = Encoding.UTF8.GetBytes("客户端数据");
            Socket socket = client.Client;
            socket.Send(data, data.Length, SocketFlags.None);
            //Console.WriteLine("发送成功" + Encoding.UTF8.GetString(data));

            socket.Receive(data, SocketFlags.None);
            Console.WriteLine("接受数据" +  Encoding.UTF8.GetString(data));
            Thread.Sleep(1000);

            }
        }

        }
    }


到这里路就走通了。但是这个也只能算是演示代码,在实战中,不仅有业务逻辑的,还应该有更多的抓错和判断。在这里只是想帮助大家更好的理解SOCKET编程。而且代码的具体写法与业务场景是有关系的。这里顶多也只能算是点到为止。

当然,多线程模式的SOCKET编程一般与通讯程序有关系,后面如果有时间,再写写在自动化行业的modbus协议数据的读取。因为读modbus数据,就是以SOKET,多线程为基础来实现的。

你可能感兴趣的:(技术)