C#中socket的简单使用
一.Socket的概念
Socket其实并不是一个协议,而是为了方便使用TCP或UDP而抽象出来的一层,是位于应用层和传输控制层之间的一组接口.
当两台主机通信是,必须通过Socket连接,Socket则利用TCP/IP协议建立TCP连接.TCP连接则更依赖于底层的IP协议.Socket是控制层传输协议.
双向的通信连接实现数据的交换,连接的一端成为一个Socket.
二.网络通信三要素
IP地址(网络上主机设备的唯一标识)
端口号(定位程序)
有效端口:0~65535,其中0~1024由系统使用,开发中一般使用1024以上端口.
传输协议(用什么样的方式进行交互)
常见协议:TCP(面向连接,提供可靠的服务),UDP(无连接,传输速度快)
三.Socket的通信流程
四.C#中Socket的简单使用步骤
第一步:服务端监听某个端口
第二步:客户端向服务端地址和端口发起Socket请求
第三步:服务器接收连接请求后创建Socket连接,并维护这个连接队列
第四步:客户端和服务端就建立起了双工同信,客户端与服务端就可以实现彼此发送消息
五.简单代码实例
1.服务端代码

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Net;
5 using System.Net.Sockets;
6 using System.Text;
7 using System.Threading;
8
9 namespace SocketUtil
10 {
11 public class SocketServer
12 {
13 private string _ip = string.Empty;
14 private int _port = 0;
15 private Socket _socket = null;
16 private byte[] buffer = new byte[1024 * 1024 * 2];
17 /// <summary>
18 /// 构造函数
19 /// </summary>
20 /// <param name="ip">监听的IP</param>
21 /// <param name="port">监听的端口</param>
22 public SocketServer(string ip, int port)
23 {
24 this._ip = ip;
25 this._port = port;
26 }
27 public SocketServer(int port)
28 {
29 this._ip = "0.0.0.0";
30 this._port = port;
31 }
32
33 public void StartListen()
34 {
35 try
36 {
37 //1.0 实例化套接字(IP4寻找协议,流式协议,TCP协议)
38 _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
39 //2.0 创建IP对象
40 IPAddress address = IPAddress.Parse(_ip);
41 //3.0 创建网络端口,包括ip和端口
42 IPEndPoint endPoint = new IPEndPoint(address, _port);
43 //4.0 绑定套接字
44 _socket.Bind(endPoint);
45 //5.0 设置最大连接数
46 _socket.Listen(int.MaxValue);
47 Console.WriteLine("监听{0}消息成功", _socket.LocalEndPoint.ToString());
48 //6.0 开始监听
49 Thread thread = new Thread(ListenClientConnect);
50 thread.Start();
51
52 }
53 catch (Exception ex)
54 {
55 }
56 }
57 /// <summary>
58 /// 监听客户端连接
59 /// </summary>
60 private void ListenClientConnect()
61 {
62 try
63 {
64 while (true)
65 {
66 //Socket创建的新连接
67 Socket clientSocket = _socket.Accept();
68 clientSocket.Send(Encoding.UTF8.GetBytes("服务端发送消息:"));
69 Thread thread = new Thread(ReceiveMessage);
70 thread.Start(clientSocket);
71 }
72 }
73 catch (Exception)
74 {
75 }
76 }
77
78 /// <summary>
79 /// 接收客户端消息
80 /// </summary>
81 /// <param name="socket">来自客户端的socket</param>
82 private void ReceiveMessage(object socket)
83 {
84 Socket clientSocket = (Socket)socket;
85 while (true)
86 {
87 try
88 {
89 //获取从客户端发来的数据
90 int length = clientSocket.Receive(buffer);
91 Console.WriteLine("接收客户端{0},消息{1}", clientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(buffer, 0, length));
92 }
93 catch (Exception ex)
94 {
95 Console.WriteLine(ex.Message);
96 clientSocket.Shutdown(SocketShutdown.Both);
97 clientSocket.Close();
98 break;
99 }
100 }
101 }
102 }
103 }
1、服务端代码
2、客户端代码

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Net;
5 using System.Net.Sockets;
6 using System.Text;
7 using System.Threading;
8 using System.Threading.Tasks;
9
10 namespace SocketUtil
11 {
12 public class SocketClient
13 {
14 private string _ip = string.Empty;
15 private int _port = 0;
16 private Socket _socket = null;
17 private byte[] buffer = new byte[1024 * 1024 * 2];
18
19 /// <summary>
20 /// 构造函数
21 /// </summary>
22 /// <param name="ip">连接服务器的IP</param>
23 /// <param name="port">连接服务器的端口</param>
24 public SocketClient(string ip, int port)
25 {
26 this._ip = ip;
27 this._port = port;
28 }
29 public SocketClient(int port)
30 {
31 this._ip = "127.0.0.1";
32 this._port = port;
33 }
34
35 /// <summary>
36 /// 开启服务,连接服务端
37 /// </summary>
38 public void StartClient()
39 {
40 try
41 {
42 //1.0 实例化套接字(IP4寻址地址,流式传输,TCP协议)
43 _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
44 //2.0 创建IP对象
45 IPAddress address = IPAddress.Parse(_ip);
46 //3.0 创建网络端口包括ip和端口
47 IPEndPoint endPoint = new IPEndPoint(address, _port);
48 //4.0 建立连接
49 _socket.Connect(endPoint);
50 Console.WriteLine("连接服务器成功");
51 //5.0 接收数据
52 int length = _socket.Receive(buffer);
53 Console.WriteLine("接收服务器{0},消息:{1}", _socket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(buffer,0,length));
54 //6.0 像服务器发送消息
55 for (int i = 0; i < 10; i++)
56 {
57 Thread.Sleep(2000);
58 string sendMessage = string.Format("客户端发送的消息,当前时间{0}", DateTime.Now.ToString());
59 _socket.Send(Encoding.UTF8.GetBytes(sendMessage));
60 Console.WriteLine("像服务发送的消息:{0}", sendMessage);
61 }
62 }
63 catch (Exception ex)
64 {
65 _socket.Shutdown(SocketShutdown.Both);
66 _socket.Close();
67 Console.WriteLine(ex.Message);
68 }
69 Console.WriteLine("发送消息结束");
70 Console.ReadKey();
71 }
72 }
73 }
2、客户端代码
3、分别开启客户端和服务器

1 using SocketUtil;
2 using System;
3 using System.Collections.Generic;
4 using System.Linq;
5 using System.Text;
6 using System.Threading.Tasks;
7
8 namespace SocketClientApp
9 {
10 class Program
11 {
12 static void Main(string[] args)
13 {
14 SocketClient client = new SocketClient(8888);
15 client.StartClient();
16 Console.ReadKey();
17 }
18 }
19 }
开启客户端代码

1 using SocketUtil;
2 using System;
3 using System.Collections.Generic;
4 using System.Linq;
5 using System.Text;
6 using System.Threading.Tasks;
7
8 namespace SocketServerApp
9 {
10 class Program
11 {
12 static void Main(string[] args)
13 {
14 SocketServer server = new SocketServer(8888);
15 server.StartListen();
16 Console.ReadKey();
17 }
18 }
19 }
开启服务端代码
C#中socket的简单使用的更多相关文章
- socket.io简单入门(一.实现简单的图表推送)
引子:随着nodejs蓬勃发展,虽然主要业务系统因为架构健壮性不会选择nodejs座位应用服务器.但是大量的内部系统却可以使用nodejs试水,大量的前端开发人员转入全堆开发也是一个因素. 研究本例主 ...
- socket.io简单说明及在线抽奖demo
socket.io简单说明及在线抽奖demo socket.io 简介 Socket.IO可以实现实时双向的基于事件的通信. 它适用于各种平台,浏览器或设备,也同样注重可靠性和速度. socket.i ...
- linux中socket的理解
对linux中socket的理解 一.socket 一般来说socket有一个别名也叫做套接字. socket起源于Unix,都可以用“打开open –> 读写write/read –> ...
- java Socket实现简单在线聊天(二)
接<java Socket实现简单在线聊天(一)>,在单客户端连接的基础上,这里第二步需要实现多客户端的连接,也就需要使用到线程.每当有一个新的客户端连接上来,服务端便需要新启动一个线程进 ...
- java Socket实现简单在线聊天(一)
最近的项目有一个在线网页交流的需求,由于很久以前做过的demo已经忘记的差不多了,因此便重新学习一下. 我计划的大致实现步骤分这样几大步: 1.使用awt组件和socket实现简单的单客户端向服务端持 ...
- 操作系统底层原理与Python中socket解读
目录 操作系统底层原理 网络通信原理 网络基础架构 局域网与交换机/网络常见术语 OSI七层协议 TCP/IP五层模型讲解 Python中Socket模块解读 TCP协议和UDP协议 操作系统底层原理 ...
- python中socket模块详解
socket模块简介 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket.socket通常被叫做"套接字",用于描述IP地址和端口,是一个通信 ...
- Linux查看系统中socket状态
当我们打开的socket数量很多时,netstat就会变得慢了,有什么办法可以快速查看系统中socket状态? IPv4: $ cat /proc/net/sockstat sockets: used ...
- (转)python标准库中socket模块详解
python标准库中socket模块详解 socket模块简介 原文:http://www.lybbn.cn/data/datas.php?yw=71 网络上的两个程序通过一个双向的通信连接实现数据的 ...
- python中Socket的使用
说明 前一段时间学习python网络编程,完成简单的通过python实现网络通信的功能.现在,将python中Socket 通信的基本实现过程做一个记录备份. Socket通信 python 中的so ...
随机推荐
- CF1736C1 Good Subarrays (Easy Version)
题目传送门 思路 给出一种不需要脑子的做法. 首先我们把每个 \(a_i\) 都减去 \(i\),这样原问题就转化为对于每一个左端点 \(i\),寻找一段连续的区间,使得这段区间的最小值加上 \(i- ...
- PDO使用返回结果集的方法输出数据库里面的单个值
1 <?php 2 header('content-type:text/html; charset=utf-8'); 3 /* 通过调用驱动程序创建一个PDO实例 */ 4 $dsn = 'my ...
- [EULAR文摘] 利用蛋白组学技术开发一项蛋白评分用于预测TNFi疗效
利用蛋白组学技术开发一项蛋白评分与临床参数联用可以增强对TNF拮抗剂对RA疗效的预测效能 Cuppen BV, et al. EULAR 2015. Present ID: OP0130. 背景: 对 ...
- MRI病变能否预测已获临床缓解的早期RA未来放射学进展
MRI病变能否预测已获临床缓解的早期RA未来放射学进展 Tamai M, et al. EULAR 2015. Present ID: FRI0048. 原文 译文 FRI0048 MRI BONE ...
- SpringBoot2.6.x及以上版本整合swagger文档
SpringBoot的版本更新中引入了一些新的特性,并且Swagger的版本更新也同样引入了很多新的东西,这样就造成了许多配置无法实现一一对应的情况,因此高版本的SpringBoot集成Swagger ...
- 分布式任务调度平台XXL-JOB安装
安装xxl-job-admin 1.拉取镜像 #拉取镜像 docker pull xuxueli/xxl-job-admin:2.3.0 #新建挂载目录 mkdir /usr/local/xxl-jo ...
- Socket.io + Knex 实现私聊聊天室
前言 本文只介绍实现的核心代码,目的是记录和分享知识.若感兴趣可以往下看,在文章最后贴上了仓库地址.前端使用 Vite + Vue3:后端使用 Knex + Express. Room 的概念 私密 ...
- python的常见问题解决
1.python库下载安装慢:用清华镜像 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tun ...
- idea代码格式xml
<code_scheme name="Default copy" version="173"> <option name="LINE ...
- win10bug可导致系统崩溃
1.使用浏览器访问访问路径:\\.\globalroot\device\condrv\kernelconnect会立刻导致系统崩溃.会影响Windows10 1709及以上版本 2.使用以下代码保存成 ...