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,多线程为基础来实现的。