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

多线程下SOCKET编程相关推荐

  1. Linux下Socket编程

    Linux下Socket编程    网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的S ...

  2. windows下socket编程GetLastError()函数返回结果与对照表-转

    原文地址:http://blog.sina.com.cn/s/blog_4880c4bb0100b6a5.html WSAGetLastError()函数返回结果与对照表: Windows Socke ...

  3. Qt中采用多线程实现Socket编程

    Qt中采用多线程实现Socket编程 Socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 本文介绍的是Qt中采用多线程 ...

  4. 一文了解linux下socket编程

    一文了解linux下socket编程 文章目录 一文了解linux下socket编程 1 网络编程的相关简述 1.1 引言 1.2 Tcp和Udp简介 1.3 TCP三次握手和四次挥手 1.4 网络编 ...

  5. LINUX下Socket编程 函数格式详解

    你需要了解的一些系统调用: socket() bind() connect() listen() accept() send() recv() sendto() recvfrom() close() ...

  6. linux下socket编程读写函数

    linux下socket编程,实现服务器与客户端的通信之后,在同一个虚拟机上,打开两个shell,一个运行服务器程序,一个运行客户端程序,课相互发送数据. 如果使用的是recv接收函数,当关闭客户端或 ...

  7. Windows下Socket编程

    Windows下Socket编程 构架 创建socket 绑定bind 存储转换函数 监听listen 接收accept 发送send(tcp)/sendto(udp) 接收recv(tcp)/rec ...

  8. [zz]Linux 下 socket 编程示例

    本示例为 Client/Server 结构,通过代码演示 Client 如何建立连接,并向远程端发送数据:Server 端如何侦听系统连接请求,接收请求并建立连接,进而获取客户端发来的数据.代码虽短, ...

  9. win32下Socket编程(1)

    一.win32的socket编程,是socket编程中比较经典也比较基础的一部分,根据传输方式和协议的区别,可以简单的分为TCP传递和UDP传递两种.这篇文章主要是阐述基于TCP的Socket编程. ...

最新文章

  1. 递归查找具有特定扩展名的文件
  2. 4.使用pnglib读写png图片
  3. 论文小综 | 知识图谱表示学习中的零样本实体研究
  4. 【ElasticSearch】Es 缓存
  5. Oracle存储过程的异常处理
  6. 数据结构:二维ST表
  7. 【区块链】区块链学习要点记录
  8. photoshop CS6 DDS插件
  9. Enter的使用计算机,电脑键盘上enter为什么叫回车键
  10. 服务器视频文件外链,视频图床 视频外链网站 视频上传外链分享
  11. 使用tf.image.resize() 和tf.image.resize_with_pad()调整图像大小
  12. Proxmox监视器
  13. C++模板与泛型编程:模板特例化
  14. SQL中对 datetime 类型操作
  15. win32的BitBlt和StretchBlt
  16. 畅游电驴/电骡(emule) 1.0 发布-下载网络资源的利器
  17. ​浙江省交通运输物流信息服务中心平台容灾设备采购二期项目
  18. cherry-pick和merge使用的场景
  19. Kafka实战《原理2》
  20. 关于判断力 - 正视事实是基础

热门文章

  1. OpenSSL SSL_read: Connection was aborted, errno 10053的问题
  2. 固态硬盘之主控哪家强?
  3. 微信小程序图片转发到微信
  4. 【navicat】定时清除数据库备份,并保留最近7天
  5. Exchange 2007 被攻击
  6. 五招保护您的家用路由器安全
  7. 图像分割(六) —— STransFuse
  8. 手机编程python可以实现吗?有哪些软件值得推荐?
  9. 重装系统win11服务器未响应怎么修复操作
  10. 科技人文丨爱上陌生人的36个问题