C#socket编程之实现一个简单的TCP通信

Stella981
• 阅读 1161

TCP(TransmissionControl Protocol)传输控制协议。

是一种可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应用:Web浏览器;电子邮件、文件传输程序。

C#socket编程之实现一个简单的TCP通信

TCP编程的服务器端一般步骤是:

  1、创建一个socket,用函数socket()。

  2、设置socket属性。

  3、绑定本机的IP地址、端口等信息到socket上,用函数bind()。

  4、开启监听,用函数listen()。

      5、接收客户端上来的连接,用函数accept()。

      6、通过accept()返回相应客户端的socket建立专用的通信通道。

  7、收发数据,用函数send()和recv(),或者read()和write()。

  8、关闭网络连接。

  9、关闭监听。

TCP编程的客户端一般步骤是:

  1、创建一个socket,用函数socket()。

  2、设置socket属性。 

  3、设置要连接的对方的IP地址和端口等属性。

  4、连接服务器,用函数connect()。

  5、收发数据,用函数send()和recv(),或者read()和write()。

  6、关闭网络连接。 

---------------------
作者:subin_iecas
来源:CSDN
原文:https://blog.csdn.net/subin_iecas/article/details/80289513 


下面是一个简单的TCP的通信程序源码

主要功能是模拟一个群聊,当多个客户端连接进来后,任意一个客户端发送的消息都将被服务器端接收并群发给所有客户端


服务器端:

C#socket编程之实现一个简单的TCP通信 C#socket编程之实现一个简单的TCP通信

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Net;
 7 using System.Net.Sockets;
 8 using System.Threading;
 9 
10 namespace _037_test
11 {
12     class Program
13     {
14         static void Main(string[] args)
15         {
16             Server s = new Server("192.168.0.105", 8888);
17             s.Start();
18         }
19     }
20 }

Program.CS

C#socket编程之实现一个简单的TCP通信 C#socket编程之实现一个简单的TCP通信

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6 using System.Net;
  7 using System.Net.Sockets;
  8 using System.Threading;
  9 
 10 namespace _037_test
 11 {
 12     class Server
 13     {
 14         Socket serverSock;
 15         List<Socket> clientList = new List<Socket>();
 16         public Server(string ip, int port)
 17         {
 18             //创建socket套接字
 19             serverSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 20             //检测ip地址是否有误
 21             IPAddress ipAdd;
 22             if (!IPAddress.TryParse(ip, out ipAdd))
 23             {
 24                 Console.WriteLine("ip有误,服务器创建失败");
 25                 return;
 26             }
 27             //绑定ip地址和端口;
 28             IPEndPoint point = new IPEndPoint(ipAdd, port);
 29             serverSock.Bind(point);
 30             //无限监听接收
 31             serverSock.Listen(0);
 32 
 33         }
 34 
 35         public void Start()
 36         {
 37             Thread th = new Thread(AcceptClient);
 38             th.Start();
 39             SendToAll();
 40         }
 41 
 42         public void AcceptClient()
 43         {
 44             Console.WriteLine("等待连接");
 45             while (true)
 46             {
 47                 Socket client = serverSock.Accept();//等待接收用户的连接,并返回连接成功的用户
 48                 IPEndPoint clientPoint = client.RemoteEndPoint as IPEndPoint;//获取所连接的用户的ip
 49                 Console.WriteLine(clientPoint.Address+"已连接");
 50                 clientList.Add(client);
 51                 Thread clientT = new Thread(ReceiveMessage);
 52                 clientT.Start(client);
 53             }
 54         }
 55 
 56         public void SendToAll()
 57         {
 58             while (true)
 59             {
 60                 string message = "管理员:"+Console.ReadLine();
 61                 byte[] messageBytes = Encoding.Default.GetBytes(message);
 62                 for (int i = 0; i < clientList.Count; i++)
 63                 {
 64                     try
 65                     {
 66                         clientList[i].Send(messageBytes);
 67                     }
 68                     catch (SocketException)
 69                     {
 70                         Console.WriteLine("有一个客户端下线");
 71                         clientList.RemoveAt(i);
 72                         i--;
 73                     }
 74                     catch (Exception e)
 75                     {
 76                         Console.WriteLine(e.Message);
 77                     }
 78                 }
 79             }
 80         }
 81 
 82         public void ReceiveMessage(object obj)
 83         {
 84             while (true)
 85             {
 86                 Socket client = obj as Socket;//将线程的start方法传入的obj转回socket类型
 87                 byte[] messageBytes = new byte[100 * 1024];//数据容器
 88                 try
 89                 {
 90                     int num = client.Receive(messageBytes);//receive方法返回字节长度,并把内容存在传入的数组中
 91                     IPEndPoint clientPoint = client.RemoteEndPoint as IPEndPoint;//获取所连接的用户的ip
 92                     Console.WriteLine(clientPoint.Address+":" + Encoding.Default.GetString(messageBytes, 0, num));
 93 
 94                     //服务器端负责将从客户端收到的消息转发给所有客户端
 95                     string message = clientPoint.Address + ":" + Encoding.Default.GetString(messageBytes, 0, num);
 96                     foreach (var item in clientList)
 97                     {
 98                         if (item!=client)
 99                         {
100                             item.Send(Encoding.Default.GetBytes(message));
101                         }
102                     }
103                 }
104                 catch (Exception)
105                 {
106                     Console.WriteLine("有一个客户端离开");
107                     clientList.Remove(client);
108                     break;
109                 }
110             }
111             
112         }
113     }
114 }

Server.CS


客户端:

C#socket编程之实现一个简单的TCP通信 C#socket编程之实现一个简单的TCP通信

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Net.Sockets;
 7 using System.Net;
 8 using System.Threading;
 9 
10 namespace _038_test
11 {
12     class Program
13     {
14         static void Main(string[] args)
15         {
16             Client c = new Client("192.168.0.105", 8888);
17             c.Start();
18         }
19     }
20 }

Program.CS

C#socket编程之实现一个简单的TCP通信 C#socket编程之实现一个简单的TCP通信

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Net.Sockets;
 7 using System.Net;
 8 using System.Threading;
 9 
10 namespace _038_test
11 {
12     class Client
13     {
14         Socket clientSock;
15         public Client(string ip, int port)
16         {
17             clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
18             try
19             {
20                 IPEndPoint point = new IPEndPoint(IPAddress.Parse(ip), port);
21                 clientSock.Connect(point);
22             }
23             catch (Exception)
24             {
25                 Console.WriteLine("服务器没有开启");
26                 return;
27             }
28 
29             Console.WriteLine("已连接服务器");
30         }
31 
32         public void Start()
33         {
34             Thread th = new Thread(SendMessage);
35             th.Start();
36             ReceiveMessage();
37         }
38 
39         public void SendMessage()
40         {
41             try
42             {
43                 while (true)
44                 {
45                     string message = Console.ReadLine();
46                     byte[] messageBytes = Encoding.Default.GetBytes(message);
47                     clientSock.Send(messageBytes);
48                 }
49             }
50             catch (Exception)
51             {
52                 Console.WriteLine("服务器断开");
53                 return;
54             }
55             
56         }
57 
58         public void ReceiveMessage()
59         {
60             try
61             {
62                 while (true)
63                 {
64                     byte[] messageBytes = new byte[100 * 1024];
65                     int num = clientSock.Receive(messageBytes);
66                     Console.WriteLine(Encoding.Default.GetString(messageBytes, 0, num));
67                 }
68             }
69             catch (Exception)
70             {
71                 Console.WriteLine("服务器断开");
72                 return;
73             }
74         }
75 
76     }
77 }

Client.CS


运行结果:

C#socket编程之实现一个简单的TCP通信 C#socket编程之实现一个简单的TCP通信

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
34.TCP取样器
阅读文本大概需要3分钟。1、TCP取样器的作用   TCP取样器作用就是通过TCP/IP协议来连接服务器,然后发送数据和接收数据。2、TCP取样器详解!(https://oscimg.oschina.net/oscnet/32a9b19ba1db00f321d22a0f33bcfb68a0d.png)TCPClien
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这