C#socket编程——TCP协议创建服务器端和客户端并进行通信

2023-11-09

        我们做网络通信的时候需要有通信协议,在进行socket编程的时候有两种通信协议TCP、UDP,这次我们就用简单的方式在一台电脑建立TCP协议的服务器端和客户端并使之进行通信。

        服务器端和客户端进行连接,第一步就行在服务器端创建一个socket,开始监听客户端的连接,然后在客户端创建一个socket,向服务器端发起连接,这样连接建立起来之后就可以进行数据的交换。

        由于Visual Studio一个解决方案下边只能启动一个项目,所以我们要创建两个解决方案(打开两个VS),一个解决方案下边创建服务器端,另一个解决方案下边创建客户端(均为控制台应用程序)。

        我们先来看完整的代码,之后在分步骤进行解释

服务器端:


using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

 
namespace socket编程_TCP协议_服务器端
{
    class Program
    {
        static void Main(string[] args)
        {
            //1.创建socket
            Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

            //2.绑定IP跟端口号
            IPAddress ipaddress = new IPAddress(new byte[] { 192,168,1,145 });
            EndPoint point = new IPEndPoint(ipaddress, 5566);
            tcpServer.Bind(point);//向操作系统申请一个可用的IP地址和端口号,用来做通信

            //3.开始监听 等待客户端连接
            tcpServer.Listen(100);//参数为最大连接数
            Console.WriteLine("开始监听");

            Socket clientSocket = tcpServer.Accept();//暂停当前线程,直到有一个客户端连接 //使用返回的Socket跟客户端做通信
            Console.WriteLine("一个客户端连接");

            //4.向客户端发送数据
            string message = "Hello";

            byte[] data = Encoding.UTF8.GetBytes(message);
            clientSocket.Send(data);//Send方法只能接受byte类型,于是先把数据转为byte类型。
            Console.WriteLine("向客户端发送一条数据");

            //5.接收客户端的数据
            byte[] data2 = new byte[1024];//创建字节数组接收客户端的数据 返回值length表示接收了多少字节的数据
            int length = clientSocket.Receive(data2);
            string message2 = Encoding.UTF8.GetString(data2, 0, length); //只把接收到的数据(0 - length)进行转化
            Console.WriteLine("接收到了一条消息:" + message2); 
            Console.ReadKey();
        }
    }
}

客户端:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;


namespace socket编程_TCP协议_客户端
{
    class Program
    {
        static void Main(string[] args)
        { 
            //1.创建Socket
            Socket tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

            //2.发起建立连接请求
            IPAddress ipaddress = IPAddress.Parse("192.168.1.145");
            EndPoint point = new IPEndPoint(ipaddress, 5566);
            tcpClient.Connect(point);//通过IP和端口号,定位一个要连接到的服务器端

            //3.接收数据
            byte[] data = new byte[1024];
            int length = tcpClient.Receive(data);//传递一个byte数组,实际上是用来接收数据 返回值length表示接收了多少字节的数据
            string message = Encoding.UTF8.GetString(data,0,length);//只把接收到的数据(0-length)进行转化
            Console.WriteLine(message); 

            //4.向服务器端发送消息
            string message2 = Console.ReadLine();//读取用户输入
            tcpClient.Send(Encoding.UTF8.GetBytes(message2));//把字符串转为字节数组 发送到服务器端 
            Console.ReadKey();
        }
    }
}

下边我们来分布进行解释

1、首先我们先来创建服务器端

(1)、创建Socket

(Socket属于命名空间System.Net.Sockets下的一个类),参数选择InterNetwork(内网)、Stream(流),以及我们的Tcp协议。

//1.创建socket
Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

(2)、绑定IP跟端口号

        每个计算机都有一个网络的地址(也可能有多个网卡,就会有不同的IP地址,我们要选择指定的IP地址进行通信),局域网的地址一般为192.168.x.x,即为IP地址,但是仅仅获取IP地址就可以了吗?显然是不行的,每个计算机都有很多软件,需要通信的软件有很多个,如果只通过IP地址发送数据,计算机并不能判断数据要发送给哪个软件,所以这个时候就需要通过端口号区分数据所要分配的软件,每个软件申请的端口号是唯一的,端口号一般为0-60000。所以通过IP地址找到计算机,通过端口号找到软件,我们才可以进行通信。

        如何查看本机的IP地址?

        在控制台中输入ipconfig,回车。

        

 

        

这里可以看到我的IP地址为192.168.1.145。端口号可以随便取,这里我们就采用5566。

接着我们继续写代码

//2.绑定IP跟端口号
IPAddress ipaddress = new IPAddress(new byte[] { 192,168,1,145 });
EndPoint point = new IPEndPoint(ipaddress, 5566);
tcpServer.Bind(point);//向操作系统申请一个可用的IP地址和端口号,用来做通信

(3)、开始监听 等待客户端连接

//3.开始监听 等待客户端连接
tcpServer.Listen(100);//参数为最大连接数
Console.WriteLine("开始监听");
Socket clientSocket = tcpServer.Accept();//暂停当前线程,直到有一个客户端连接 //使用返回的Socket跟客户端做通信
Console.WriteLine("一个客户端连接");

 (4)、向客户端发送消息

//4.向客户端发送数据
string message = "Hello";
byte[] data = Encoding.UTF8.GetBytes(message);//Send方法只能接受byte类型,于是先把数据转为byte类型。
clientSocket.Send(data);
Console.WriteLine("向客户端发送一条数据");

(5)、接收消息

//5.接收客户端的数据
byte[] data2 = new byte[1024];//创建字节数组接收客户端的数据 返回值length表示接收了多少字节的数据
int length = clientSocket.Receive(data2);
string message2 = Encoding.UTF8.GetString(data2, 0, length); //只把接收到的数据(0 - length)进行转化
Console.WriteLine("接收到了一条消息:" + message2);

2、创建客户端

(1)、创建Socket

//1.创建Socket
Socket tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

(2)、发起建立连接请求

//2.发起建立连接请求 IP地址和端口号要和服务器端保持一致
IPAddress ipaddress = IPAddress.Parse("192.168.1.145");//此方法也可以绑定IP地址
EndPoint point = new IPEndPoint(ipaddress, 5566);
tcpClient.Connect(point);//通过IP和端口号,定位一个要连接到的服务器端

(3)、接收数据 

//3.接收数据
byte[] data = new byte[1024];
int length = tcpClient.Receive(data);//传递一个byte数组,实际上是用来接收数据 返回值length表示接收了多少字节的数据
string message = Encoding.UTF8.GetString(data,0,length);//只把接收到的数据(0-length)进行转化
Console.WriteLine(message);

(4)、向服务器端发送消息

//4.向服务器端发送消息
string message2 = Console.ReadLine();//读取用户输入
tcpClient.Send(Encoding.UTF8.GetBytes(message2));//把字符串转为字节数组 发送到服务器端

此时我们已经可以进行测试,首先启动服务器端

然后启动客户端,此时服务器端已经发生变化

向服务器端发送消息

此时一个简单的tcp协议的通信已经完成。

————————————————
版权声明:本文为CSDN博主「LennyS丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wang568270833/article/details/89764756

https://blog.csdn.net/wang568270833/article/details/89764756

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#socket编程——TCP协议创建服务器端和客户端并进行通信 的相关文章

随机推荐

  • Fortran 微分方程求解 --ODEPACK

    最近涉及到使用Fortran对微分方程求解 我们知道MATLAB已有内置的函数 比如ode家族 ode15s 对应着不同的求解办法 通过查看odepack的官方文档 我尝试使用了dlsode求解刚性和非刚性常微分方程组 首先是github网
  • Unity3d防止按键劫持导致无法响应点击事件

    起因 项目上线之后 接到一些玩家反馈 在登录界面点击没有响应 无法登陆的 小米 魅族等应用商店上的差评也大多集中于此 心里一万只草泥马在奔腾 排查问题 首先 排查逻辑代码 找出是谁写的代码 大概会被拿去祭天吧 然而并没有 逻辑代码并没有问题
  • FastCGI处理自定义HTTP头

    FCGX中 自定义头可以获取环境变量获得 但是名字前面要加入HTTP 字母全部大写 例如 自定义头username 在fastcgi的FCGX中 变为 HTTP USERNAME 可以用FCGX GetParam获取单个环境变量 头信息在F
  • 使用高德地图(点标记)完成vue2项目

    目录 前言 官网中的代码 项目中的代码 效果图 代码 配置 前言 由于项目 中有要使用高德地图的需求 我就 傲娇的说 我会使用百度地图 可以改为百度地图不 最终的结果就是要用高德地图 后端小哥哥还特别好的安慰我说 高德地图的用法跟百度地图的
  • 上采样和下采样

    分辨率 是屏幕图像的精密度 是指显示器所能显示的像素的多少 由于屏幕上的点 线和面都是由像素组成的 显示器可显示的像素越多 画面就越精细 同样的屏幕区域内能显示的信息也越多 可以把整个图像想象成是一个大型的棋盘 而分辨率的表示方式就是所有经
  • c#笔记2018-12-27

    using System 2018 12 27 c 学习笔记 1 c 判断if else if switch 2 循环while for do while 3 循环实例 for循环99乘法表 while 循环99乘法表 do while 循
  • 关于contenteditable = true中光标异常判定的解决方法

  • Eclipse和PyDev搭建完美Python开发环境(Windows篇)

    十一长假在家闲着没事儿 准备花点时间学习一下Python 今儿花了一个下午搭建Python的开发环境 不禁感叹 开源的东西就是麻烦啊 唉 可怜我们这些被微软宠坏了的开发人员 为什么不用别的IDE呢 IDLE是小打小闹用的 那个WingIDE
  • 如何选用GPU云服务器?

    1 相关知识了解 1 1 了解厂家 1 1 1 面向个人的平台 名称 特点 极链AI云 微信绑定送100 学生200 1024Lab云 便宜 国外 DBC支付 不知道是啥 不考虑 矩池云GPU VNC远程访问图形化桌面 操作简单 gpu种类
  • ls命令用法总结

    ls 命令可以说是linux下最常用的命令之一 a 列出目录下的所有文件 包括以 开头的隐含文件 b 把文件名中不可输出的字符用反斜杠加字符编号 就象在C语言里一样 的形式列出 c 输出文件的 i 节点的修改时间 并以此排序 d 将目录象文
  • idea的target文件夹不见了

    1 第一种方法 在2位置打上 2 第二种方法 在5里面寻找target 并删掉 3 总结 目前遇到的就这两种情况 第二种情况5中用 分开的每一个都是忽略的文件或文件夹 像 git文件 idea文件夹都可以在这里配置忽略 我知道的作用是在pr
  • Unity Xbox360 Input

    1 资料收集 2 Unity中增加键值注册 3 A键值 4 B键值 5 X键值 6 Y键值 7 LeftBumper 键值
  • 思考卷积神经网络(CNN)中各种意义

    只是知道CNN是不够 我们需要对其进行解剖 继而分析不同部件存在的意义 CNN的目的 简单来说 CNN的目的是以一定的模型对事物进行特征提取 而后根据特征对该事物进行分类 识别 预测或决策等 在这个过程里 最重要的步骤在于特征提取 即如何提
  • AltiumDesigner 绘制PCB常见问题

    1 普通过孔16mil 24mil 2 PCB双层板看到上面有大量的过孔 很多都没有用到的 这些过孔有什么用啊 答 通过大量过孔连接顶层和底层的铺铜 也就是将顶层和底层的 地 良好的连接 为接地点提供更多回路 以提高整个电路板的抗干扰能力
  • Rpm相关操作

    安装rpm包 rpm ivh your package rpm 安装过程中可能出现下面的警告或者提示 conflict with 可能是要安装的包里有一些文件可能会覆盖现有的文件 缺省时这样的情况下是无法正确安装的 强制安装即可 rpm f
  • 《数据结构与算法》实验:排序算法实验比较——选择排序 & 堆排序

    数据结构与算法 实验和课程Github资源 数据结构与算法 实验 线性结构及其应用 算术表达式求值 数据结构与算法 实验 树型结构的建立与遍历 数据结构与算法 实验 图结构的建立与搜索 数据结构与算法 实验 查找结构的实验比较 二叉查找树B
  • 同步通讯和异步通讯(简单理解)

    同步通信和异步通信 简单理解 注 本篇文章只是告诉你什么是同步通信 什么是异步通信 即使没有计算机基础的同学也适合阅读 同时也能帮助计算机专业同学更好理解这个知识点 但是如果想深入学习 还需自己翻阅资料 一 电脑完成一个读命令需要的步骤 主
  • ​Qt for Python 入门¶​

    本页重点介绍如何从源代码构建Qt for Python 如果你只想安装PySide2 与你需要运行 pip pip install pyside2 有关更多详细信息 请参阅我们的快速入门指南 此外 您可以 查看与项目相关的常见问题解答 一般
  • 【猿人学WEB题目专解】猿人学第17题

    据说 看我文章时 关注 点赞 收藏 的 帅哥美女们 心情都会不自觉的好起来 前言 作者简介 大家好我是 user from future 意思是 来自未来的用户 寓意着未来的自己一定很棒 个人主页 点我直达 在这里肯定能找到你想要的 专栏介
  • C#socket编程——TCP协议创建服务器端和客户端并进行通信

    我们做网络通信的时候需要有通信协议 在进行socket编程的时候有两种通信协议TCP UDP 这次我们就用简单的方式在一台电脑建立TCP协议的服务器端和客户端并使之进行通信 服务器端和客户端进行连接 第一步就行在服务器端创建一个socket