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 ...
随机推荐
- 依那西普治疗多关节型和系统型JRA的长期疗效[EULAR2007_SAT0397]
依那西普治疗多关节型和系统型JRA的长期疗效 Giannini EH, Ilowite NT. EULAR2007. Abstract No:SAT0397. 标签: EULAR2007,EULAR文 ...
- Cesium渲染模块之VAO
1. 引言 Cesium是一款三维地球和地图可视化开源JavaScript库,使用WebGL来进行硬件加速图形,使用时不需要任何插件支持,基于Apache2.0许可的开源程序,可以免费用于商业和非商业 ...
- LeetCode-382 链表随机结点
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/linked-list-random-node 题目描述 给你一个单链表,随机选择链表的一个节点, ...
- centos7配置vue环境
1.安装nodejs #下载源码 wget https://npm.taobao.org/mirrors/node/v14.15.4/node-v14.15.4-linux-x64.tar.xz #解 ...
- C# datatable group by分组
DataTable dt = new DataTable(); dt.Columns.Add("A"); dt.Columns.Add("B"); dt.Col ...
- 15.网关Gateway
创建网关的Module 使用注册中心和配置中心 详细可以参考另两篇篇博客-注册中心和配置中心 报错 编译报了这个错,原因是我们没有给网关配置数据库连接字符串,但是引用了common,common中有m ...
- 随机颜色,加载loading效果,节流,应用周期函数,wxs
随机颜色 data: { colorList:[] }, getColor(){ wx.request({ url: 'https://www.escook.cn/api/color', method ...
- [PHP]流程控制的替代语法:endif/endwhile/endfor使用介绍
我们经常在wordpress一类博客程序的模板里面看到很多奇怪的PHP语法,比如: 代码如下: <?php if(empty($GET_['a'])): ?> <font color ...
- python读取Excel整列或整行数据
单元格拆分 def get_index(capital): """ 大写字母(Excel列头)转数字 :param capital: 'A' --> 0, 'AA' ...
- uniapp - 设置代理
uniapp - 设置代理 HbuilderX 找到 manifest.json 文件,点击源码视图 "h5" : { "title" : "案件要素 ...