C#中简单Socket编程

C#中简单Socket编程

Socket分为面向连接的套接字(TCP套接字)和面向消息的套接字(UDP 套接字)。我们平时的网络编程是对Socket进行操作。

接下来,我用C#语言来进行简单的TCP通信和UDP通信。

一、TCP通信

新建项目SocketTest,首先添加TCP通信的客户端代码,如下:

byte[]data = new byte[1024];Socket ClientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);Console.WriteLine("Please write Server IPAdress:");string IPAdress = Console.ReadLine();Console.WriteLine();Console.Write("Please Write Server Port:");int nPort = Convert.ToInt32(Console.ReadLine());IPEndPoint IP = new IPEndPoint(IPAddress.Parse(IPAdress),nPort);try{ClientSocket.Connect(IP);}catch (SocketException e){Console.WriteLine("Can Not Connet Server!");Console.WriteLine(e.ToString());return;}int nRetByte = ClientSocket.Receive(data);string strData = Encoding.ASCII.GetString(data,0, nRetByte);Console.WriteLine(strData);while (true){string strInput = Console.ReadLine();if (strInput == "exit")break;String strSay = " Client Say:"; ClientSocket.Send(Encoding.ASCII.GetBytes(strSay + strInput));data = new byte[1024];nRetByte = ClientSocket.Receive(data);strData = Encoding.ASCII.GetString(data, 0, nRetByte);Console.WriteLine(strData);}Console.WriteLine("DisConnect From Server");ClientSocket.Shutdown(SocketShutdown.Both);ClientSocket.Close();

客户端套接字通信过程是:第一步:调用Socket类创建套接字。第二步:调用Connect()函数连接服务器。

TCP通信服务端代码如下:

 // 返回收到的字节数int nRetByte;byte[] data = new byte[1024];// IPEndPoint 将网络终结点表示为IP地址和端口号// IPAddress 提供网络协议IP地址IPEndPoint IPep = new IPEndPoint(IPAddress.Any,9050);// 实现 Berkeley套接字接口// AddressFamily:指定Socket类实例可以使用的寻址方案;// InterNetwork:IPV4版本的地址// SocketType:套集字类型;Stream:基于TCP的字节流类型// ProtocolType:协议的类型Socket newSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);// 使Socket与一个本地终结点相连newSocket.Bind(IPep);// 使Socket与处于监听状态newSocket.Listen(10);Console.WriteLine("Wait for a Client");// 为新建连接创建新的SocketSocket ClientSocket = newSocket.Accept();// RemoteEndPoint:获取远程终结点IPEndPoint ClientTip = (IPEndPoint)ClientSocket.RemoteEndPoint;Console.WriteLine("Connect with Client:"+ ClientTip.Address + "at Port:"+ ClientTip.Port);string strWelcome = "Welcome to Server,You Can Send Data To Server";// 获取ASCII字符集的编码// GetBytes将指定字符串中所有的字符编码为一个字节序列data = Encoding.ASCII.GetBytes(strWelcome);// 将数据发送到SocketClientSocket.Send(data);while (true){data = new byte[1024];// 从绑定的套接字接受数据,将数据存入接受缓冲区nRetByte = ClientSocket.Receive(data);Console.WriteLine("Receive Data from Client, Data Size is {0} Bit",nRetByte);if (nRetByte == 0)break;Console.WriteLine(Encoding.ASCII.GetString(data,0,nRetByte));string strInput = Console.ReadLine();if (strInput == "exit")break;String strSay = "Server Say:";ClientSocket.Send(Encoding.ASCII.GetBytes(strSay + strInput));Console.WriteLine(strInput);}Console.WriteLine("DisConnect from ClientAddress",ClientTip.Address);ClientSocket.Close();newSocket.Close();

TCP通信服务端的通信过程是:第一步调用Socket创建套接字。第二步:调用Bind()函数将套接字绑定到指定的IP地址和端口号。第三步:调用Listen()函数监听套接字。第四步:调用Accept()函数等待客户端连接。上述代码执行结果如下:

Snipaste_2024-07-09_23-13-02

这个测试使用本地回环地址127.0.0.1。

二、UDP通信

UDP通信是面向消息的通信方式。它具有快速不可靠的特点。UDP通信中客户端的过程:

第一步:创建套接字。第二步调用connect函数连接服务器(这一步是可选的,可以写可以不写)。具体代码如下:

 byte[] data = new byte[1024];string strInput, strData;// 定义一个源IP地址// Parse:IP地址字符串转换为IPAdress实例IPEndPoint ClientIP = new IPEndPoint(IPAddress.Parse("127.0.0.1"),9050);// 定义一个基于UDP协议的SocketSocket ClientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);string strWelcome = "Hello are you Here?";data = Encoding.ASCII.GetBytes(strWelcome);// 向服务器发送指定字节的数据ClientSocket.SendTo(data,data.Length, SocketFlags.None,ClientIP);IPEndPoint IPSender = new IPEndPoint(IPAddress.Any,0);EndPoint IPRemote = (EndPoint)IPSender;data = new byte[1024];int nRevByte = ClientSocket.ReceiveFrom(data,ref IPRemote);Console.WriteLine("Receive Data From Server:{0}", IPRemote.ToString());Console.WriteLine(Encoding.ASCII.GetString(data,0, nRevByte));while (true){// 从标准输入流中读取下一行字符strInput = Console.ReadLine();if(strInput=="exit")break;// 将从控制台中获取的数据发送到服务器端,并且接收服务器端发回的数据ClientSocket.SendTo(Encoding.ASCII.GetBytes(strInput), IPRemote);data = new byte[1024];nRevByte= ClientSocket.ReceiveFrom(data, ref IPRemote);strData= Encoding.ASCII.GetString(data,0, nRevByte);Console.WriteLine(strData);}Console.WriteLine("StopClient");ClientSocket.Close();

UDP通信服务器端通信过程:

第一步:创建套接字。第二步:将套接字绑定到指定IP地址和端口号。第三步:接收客户端的数据。具体代码如下:

int nRecvByte;byte[] data = new byte[1024];// 定义一个网络端点IPEndPoint IPAdress = new IPEndPoint(IPAddress.Any,9050);// 定义一个数据报类型的Socket// SocketType.Dgram:使用数据报协议// ProtocolType:UDP协议Socket ClientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);// Socket与本地的终端结点绑定ClientSocket.Bind(IPAdress);Console.WriteLine("Wait For a Client!");// 定义一个要发送的IP地址IPEndPoint Sender = new IPEndPoint(IPAddress.Any,0);EndPoint IPRemote = (IPEndPoint)Sender;// 接受数据报并存储源终结点nRecvByte = ClientSocket.ReceiveFrom(data,SocketFlags.None,ref IPRemote);Console.WriteLine("Message Receive From:{0}:", IPRemote.ToString());Console.WriteLine(Encoding.ASCII.GetString(data,0,nRecvByte));string strWelcome = "Welcome to My Test Server!";data = Encoding.ASCII.GetBytes(strWelcome);ClientSocket.SendTo(data,SocketFlags.None,IPRemote);while (true){//接收客户端的数据并且发回 data = new byte[1024];nRecvByte = ClientSocket.ReceiveFrom(data,ref IPRemote);Console.WriteLine(Encoding.ASCII.GetString(data,0, nRecvByte));ClientSocket.SendTo(data,IPRemote);}

UDP通信效果如下:

Snipaste_2024-07-09_23-31-17
好了,今天就介绍到这里。欢迎大家一起交流。源码:SocketTest

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/43991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

71.WEB渗透测试-信息收集- WAF、框架组件识别(11)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:70.WEB渗透测试-信息收集- WAF、框架组件识别(10)-CSDN博客 如果有…

RT2-使用NLP的方式去训练机器人控制器

目标 研究在网络数据上训练的视觉语言模型也可以直接结合到端到端的机器人控制中,提升泛化性以及获得突出的语义推理;使得单个的端到端训练模型可以同时学习从机器人观测到动作的映射,这个过程可以受益于基于网络上的语言和视觉语言数据的预训…

提高LabVIEW软件的健壮性

提高LabVIEW软件的健壮性,即增强其在各种操作条件下的可靠性和稳定性,是开发过程中非常重要的一环。健壮的软件能够在面对意外输入、极端环境和系统故障时依然表现出色,确保系统的连续性和可靠性。以下是详细的方法和策略,从多个角…

如何在 CentOS 上配置本地 YUM 源

引言 CentOS 作为一个流行的企业级 Linux 发行版,依赖 YUM(Yellowdog Updater, Modified)来管理软件包。YUM 源(Repository)是软件包存储和分发的中心,它们通常位于互联网上。然而,在某些情况下…

Linux驱动开发-03字符设备驱动框架搭建

一、字符设备驱动开发步骤 驱动模块的加载和卸载(将驱动编译模块,insmod加载驱动运行)字符设备注册与注销(我们的驱动实际上是去操作底层的硬件,所以需要向系统注册一个设备,告诉Linux系统,我有…

快速入门,springboot知识点汇总

学习 springboot 应该像学习一门编程语言一样,首先要熟练掌握常用的知识,而对于不常用的内容可以简单了解一下。先对整个框架和语言有一个大致的轮廓,然后再逐步补充细节。 前序: Spring Boot 通过简化配置和提供开箱即用的特性&#xff0c…

第三期书生大模型实战营 第1关 Linux 基础知识

第三期书生大模型实战营 第1关 Linux 基础知识 第三期书生大模型实战营 第1关 Linux 基础知识InternStudio开发机创建SSH密钥配置通过本地客户端连接远程服务器通过本地VSCode连接远程服务器运行一个Python程序总结 第三期书生大模型实战营 第1关 Linux 基础知识 Hello大家好&a…

cesium 雷达扫描

cesium 雷达扫描 (下面附有源码) 实现思路 1、通过改变圆型材质来实现效果, 2、用了模运算和步进函数(step)来创建一个重复的圆形图案 3、当纹理坐标st落在垂直或水平的中心线上时,该代码将改变透明度和颜色,以突出显示这些线 示例代码 <!DOCTYPE html> <ht…

成为编程大佬!!——数据结构与算法(1)——算法复杂度!!

前言&#xff1a;解决同一个程序问题可以通过多个算法解决&#xff0c;那么要怎样判断一个算法的优劣呢&#xff1f;&#x1f914; 算法复杂度 算法复杂度是对某个程序运行时的时空效率的粗略估算&#xff0c;常用来判断一个算法的好坏。 我们通过两个维度来看算法复杂度——…

Maven在Windows中的配置方法

本文介绍在Windows电脑中&#xff0c;下载、配置Maven工具的详细方法。 Maven是一个广泛使用的项目管理工具&#xff0c;主要针对Java项目&#xff0c;但也可以用于其他类型的项目&#xff1b;其由Apache软件基金会维护&#xff0c;旨在简化和标准化项目构建过程&#xff0c;依…

数字经济时代,你有数商吗?

引言&#xff1a;随着科技的飞速发展&#xff0c;我们正步入一个全新的数字经济时代。在这个时代里&#xff0c;数据成为了新的石油&#xff0c;是推动经济增长和社会进步的关键要素。而在这个数据洪流中&#xff0c;一个新兴的概念——“数商”&#xff0c;正逐渐进入公众的视…

递归、搜索与回溯算法 2024.7.4-24.7.9

专题介绍&#xff1a; 一、递归 1、汉诺塔问题 class Solution {public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {int n A.size();move(n,A,B,C);// 将A柱上的n个盘子通过借助B盘子全部挪到C柱子上}void move(int m,List<Integ…

Python | Leetcode Python题解之第226题翻转二叉树

题目&#xff1a; 题解&#xff1a; class Solution:def invertTree(self, root: TreeNode) -> TreeNode:if not root:return rootleft self.invertTree(root.left)right self.invertTree(root.right)root.left, root.right right, leftreturn root

01_空中机器人

空中机器人&#xff08;Aerial Robotics&#xff09;最早由美国乔治亚理工大学的Robert Michelson提出&#xff0c;是指各种搭载了GPS、机载导航设备、视觉识别设备以及无线通信设备等&#xff0c;能够在一定的范围内实现无人飞行的旋翼无人飞行器、无人飞艇等。 空中机器人拓…

Zynq系列FPGA实现SDI视频编解码+图像缩放+多路视频拼接,基于GTX高速接口,提供8套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本博已有的FPGA图像缩放方案本方案的无缩放应用本方案在Xilinx--Kintex系列FPGA上的应用 3、详细设计方案设计原理框图SDI 输入设备Gv8601a 均衡器GTX 解串与串化SMPTE SD/HD/3G SDI IP核BT1120转RGB自研…

14-58 剑和诗人32 - 使用矢量数据库增强 LLM 应用程序

GPT-4、Bloom、LaMDA 等大型语言模型 (LLM) 在生成类似人类的文本方面表现出了令人印象深刻的能力。然而,它们在事实准确性和推理能力等方面仍然面临限制。这是因为,虽然它们的基础是从大量文本数据中提取统计模式,但它们缺乏结构化的知识源来为其输出提供依据。 最近,我们…

基于信号量的生产者消费者模型

文章目录 信号量认识概念基于线程分析信号量信号量操作 循环队列下的生产者消费者模型理论认识代码部分 信号量 认识概念 信号量本质: 计数器 它也叫做公共资源 为了线程之间,进程间通信------>多个执行流看到的同一份资源---->多个资源都会并发访问这个资源(此时易出现…

【Linux】进程(9):进程控制2(进程等待)

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解Linux进程&#xff08;9&#xff09;进程控制2&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一. 为什么要进程等待二. 如何进行进程等待1.wait函数—…

使用linux的mail命令发送html格式的邮件

1、关闭本机的sendmail服务或者postfix服务 #执行下面的命令&#xff0c;各位大侠都对号入座吧 #sendmial service sendmail stop chkconfig sendmail off #postfix service postfix stop chkconfig postfix off#再狠一点就直接卸载吧.. yum remove sendmail yum remove postf…

欧拉部署nginx

1.下载nginx 下载地址&#xff1a;https://nginx.org/en/download.html 选择稳定版本 下的镜像文件进行下载 2.解压Nginx包 cd /root/nginx tar -zxvf nginx-1.26.0.tar.gz cd nginx-1.26.03.安装nginx相关依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl o…