C# Socket的使用

C# 中的 System.Net.Sockets.Socket 类是 .NET Framework 提供的核心类,用于处理网络套接字编程。Socket 类是用于网络编程的基础类,它位于 System.Net.Sockets 命名空间中。

使用 Socket 类,可以创建客户端和服务器应用程序来进行基于TCP、UDP和其他网络协议的通信。

 

以下是如何在 C# 中使用 Socket 类进行基本的 TCP 服务器和客户端通信的步骤:

TCP 服务器端实现

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;namespace SocketServer
{class Program{private static byte[] buffer = new byte[1024];private static int port = 8885; // 定义服务器监听端口static void Main(string[] args){// 创建一个 IP 地址对象,绑定到本地主机IPAddress ipAddress = IPAddress.Parse("127.0.0.1");// 创建一个新的 Socket 对象,指定为 IPv4、面向流(TCP)协议Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);// 绑定服务器 socket 到特定的 IP 和端口IPEndPoint localEndPoint = new IPEndPoint(ipAddress, port);serverSocket.Bind(localEndPoint);// 开始监听连接请求,最大同时排队的连接数为 10serverSocket.Listen(10);Console.WriteLine($"启动监听 {serverSocket.LocalEndPoint} 成功");// 启动线程等待客户端连接Thread listenThread = new Thread(ListenForClients);listenThread.Start(serverSocket);// 等待控制台输入以保持程序运行Console.ReadLine();}private static void ListenForClients(object obj){Socket listener = (Socket)obj;while (true){// 接受一个客户端的连接请求Socket clientSocket = listener.Accept();// 发送欢迎消息给客户端string welcomeMessage = "ServerSayHello";byte[] data = Encoding.ASCII.GetBytes(welcomeMessage);clientSocket.Send(data);// 在单独的线程中处理来自客户端的消息Thread receiveThread = new Thread(ReceiveData);receiveThread.Start(clientSocket);}}private static void ReceiveData(object obj){Socket clientSocket = (Socket)obj;while (true){try{// 接收客户端发来的数据int received = clientSocket.Receive(buffer);// 将接收的数据转换为字符串并输出string message = Encoding.ASCII.GetString(buffer, 0, received);Console.WriteLine($"接收客户端 {clientSocket.RemoteEndPoint} 消息: {message}");// 实际应用中,这里可能需要对消息进行响应或进一步处理}catch (Exception ex){Console.WriteLine($"接收异常:{ex.Message}");// 关闭连接clientSocket.Shutdown(SocketShutdown.Both);clientSocket.Close();break;}}}}
}

TCP 客户端实现

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;namespace SocketClient
{class Program{private static byte[] buffer = new byte[1024];static void Main(string[] args){// 设置要连接的服务器地址和端口IPAddress ipAddress = IPAddress.Parse("127.0.0.1");int port = 8885;Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);try{// 连接到服务器clientSocket.Connect(new IPEndPoint(ipAddress, port));Console.WriteLine("连接服务器成功");// 接收服务器发送的消息int receiveLength = clientSocket.Receive(buffer);Console.WriteLine("接收服务器消息:{0}", Encoding.ASCII.GetString(buffer, 0, receiveLength));// 发送多条消息给服务器for (int i = 0; i < 10; i++){Thread.Sleep(1000); // 模拟延时string sendMessage = $"ClientSendMessageHelp{i} at {DateTime.Now}";byte[] data = Encoding.ASCII.GetBytes(sendMessage);clientSocket.Send(data);Console.WriteLine("向服务器发送消息:{0}", sendMessage);}}catch (Exception ex){Console.WriteLine("连接或通信过程中发生错误: {0}", ex.Message);}finally{// 关闭连接clientSocket.Shutdown(SocketShutdown.Both);clientSocket.Close();Console.WriteLine("发送完毕,按回车键退出...");Console.ReadLine();}}}
}

以上代码分别展示了如何创建一个简单的 TCP 服务器和客户端,服务器会监听客户端的连接请求,并在建立连接后与客户端交换数据。

客户端则尝试连接到服务器,并发送和接收数据。

 

请注意,使用Socket进行网络编程需要对网络协议和通信原理有一定的了解。

如果需要更复杂的网络通信功能,可能需要使用更高层次的网络库或框架,例如TcpClientTcpListener

 

Socket.Connected 不能作为TCP连接的判断依据

Socket.Connected 不能作为TCP连接的判断依据-CSDN博客

 

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

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

相关文章

[SUCTF 2019]EasySQL1 题目分析与详解

一、题目介绍 1、题目来源&#xff1a; BUUCTF网站&#xff0c;网址&#xff1a;https://buuoj.cn/challenges 2、题目描述&#xff1a; 通过以上信息&#xff0c;拿到flag。 二、解题思路 首先打开靶机&#xff0c;尝试输入1查看回显&#xff0c;回显如图所示&#xff1a;…

clickhouse的docker部署与springboot整合

注意&#xff1a;镜像bitnami/clickhouse包含服务端和客户端&#xff0c;yandex版本需要使用yandex/clickhouse-server&#xff0c;yandex/clickhouse-server docker启动命令(允许空密码 -e ALLOW_EMPTY_PASSWORDyes)&#xff0c;clickhouse版本不同&#xff0c;配置文件在的位…

利用psutil库检查脚本是否在运行

摘要 如果要判断某一脚本是否在运行&#xff0c;可以通过psutil库获取所有进程的cmdline&#xff0c;并判断指定的文件名是否在cmdline中。 目录 1.psutil库简介 2.检查代码及说明 2.1检查思路 2.2异常捕获 2.3执行方法 1.psutil库简介 psutil 是一个跨平台&#xff08;…

记一次生产jvm oom问题

前言 jvm添加以下参数&#xff0c;发生OOM时自动导出内存溢出文件 -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/opt 内存分析工具&#xff1a; MAT, 下载地址&#xff1a;Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation&#xff0c; 注意工具地址…

让AI玩一千万次贪吃蛇

如果让人工智能来玩贪吃蛇游戏&#xff0c;会发生什么&#xff1f; 图源&#xff1a;DALLE 目录 贪吃蛇实现 游戏规则 游戏实现 Q学习算法实现 Q学习简介 Q表和Q值 Q学习更新规则 Q学习在贪吃蛇游戏中的应用 整体项目完整代码 运行过程截图 代码分析 环境设置 …

LeetCode142-环形链表II

参考链接&#xff1a;代码随想录&#xff1a;LeetCode142-环形链表II 总结下来就是fast指针走两步&#xff0c;slow指针走一步&#xff0c;如果相遇了&#xff0c;在相遇点B那里&#xff0c;然后链表头假设为点A&#xff0c;那么再次设置两个指针fast idx&#xff0c;slow idx&…

Jtti:怎么备份github上的数据?

备份GitHub上的数据可以通过以下几种方式来实现&#xff1a; 使用Git命令行备份&#xff1a;使用Git命令行工具将GitHub仓库克隆(clone)到本地计算机上。这样可以将GitHub仓库的所有文件和历史记录复制到本地&#xff0c;作为备份。使用以下命令将仓库克隆到本地&#xff1a; g…

2024.2.23 C++QT 作业

思维导图 练习题 1>简单实现闹钟播报&#xff0c;设置时间&#xff0c;当系统时间与设置时间相同时播报语音5次&#xff0c;然后停止。如果设置时间小于当前系统时间&#xff0c;则弹出消息提示框&#xff0c;并清空输入框。 #include "widget.h" #include &quo…

1142.百亿富翁

Problem: 百亿富翁 文章目录 思路解题方法复杂度Code 思路 这是一个单调栈的问题。单调栈是一种特殊的栈结构&#xff0c;它的特点是栈中的元素保持单调性。在这个问题中&#xff0c;我们需要找到每个元素左边和右边第一个比它大的元素。我们可以使用一个单调递增的栈来解决这个…

JSON(javaScript Object Notation,Js对象标记)—我耀学IT

Json是一种轻量级的数据交换格式&#xff0c;目前使用非常广泛&#xff0c;是一种轻量级的数据交换格式。易于人阅读和编写&#xff0c;可以在多种语言之间进行数据交换 。同时也易于机器解析和生成 1.1json的值: 值可以是对象、数组、数字、字符串或者三个字面值(false、nul…

Oracle11.2.0.4设置st_shapelib.dll后报ORA-28595: Extproc 代理: DLL 路径无效错误问题

1、找st_shapelib.dll动态链接库文件 %ArcGIS\Desktop10.2\DatabaseSupport\Oracle\Windows64% 2、放到oracle路径下 把st_shapelib.dll放在%oracle_home%\bin下 3、修改extproc.ora文件 extproc.ora 文件位于 ORACLE_HOME\hs\admin 目录中。 将 ST_Geometry (st_shapelib)…

什么是nginx 、安装nginx、nginx调优

一、 什么是nginx 1.1 nginx的概念 一款高新能、轻量级Web服务软件系统资源消耗低对HTTP并发连接的处理能力高单台物理服务器可支持30 000&#xff5e;50 000个并发请求。 1.2 nginx模块与作用 核心模块&#xff1a;是 Nginx 服务器正常运行必不可少的模块&#xff0c;提供错…

深入理解JS的执行上下文、词法作用域和闭包(下)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【Java程序设计】【C00262】基于Springboot的会员制医疗预约服务管理系统(有论文)

基于Springboot的会员制医疗预约服务管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的会员制医疗预约服务管理信息系统&#xff0c;本系统分为三种角色&#xff1a;管理员、医生和会员&#xff1b; 在系统…

JavaSec 基础之 XXE

文章目录 XMLReaderSAXReaderSAXBuilderDocumentBuilderUnmarshaller**SAXParserFactory**XMLReaderFactoryDigester总结 XMLReader public String XMLReader(RequestBody String content) {try {XMLReader xmlReader XMLReaderFactory.createXMLReader();// 修复&#xff1a…

如何让电脑待机而wifi不关的操作方法!!

1、一台电脑如果一天不关机&#xff0c;大约消耗0.3度电。 一般一台电脑的功耗约为250-400W&#xff08;台式机&#xff09;。 一台电脑每月的耗电量&#xff1a;如果是每小时300W每天10小时每月30天90KW&#xff0c;即90千瓦时的电。 这只是保守估计。 2、使用完毕后正常关闭…

企业微信应用开发:使用Cpolar域名配置进行本地接口回调的调试指南

文章目录 1. Windows安装Cpolar2. 创建Cpolar域名3. 创建企业微信应用4. 定义回调本地接口5. 回调和可信域名接口校验6. 设置固定Cpolar域名7. 使用固定域名校验 企业微信开发者在应用的开发测试阶段&#xff0c;应用服务通常是部署在开发环境&#xff0c;在有数据回调的开发场…

【MATLAB】 RLMD信号分解+FFT傅里叶频谱变换组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 展示出图效果 1 RLMD分解算法 RLMD&#xff08;Robust Local Mode Decomposition&#xff09;是一种鲁棒的局部模态分解方法。它是通过在局部区间内对信号进行多项式拟合&#xff0c;提取局部特征&#xff0c;进而分解信…

【Java程序设计】【C00294】基于Springboot的车辆充电桩管理系统(有论文)

基于Springboot的车辆充电桩管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的车辆充电桩管理系统 本系统前台功能模块分为&#xff1a;首页功能和用户后台管理 后台功能模块分为&#xff1a;管理员功能和…

达梦数据库搭建和连接(详解一文看懂)

达梦数据库搭建和连接 一、数据库搭建1.安装前准备2.下载 Docker3.导入安装包4.启动docker版docker-compose版 5.启动/停止数据库 二、数据库连接1、下载DBeaver2、下载驱动3、DBeaver新建驱动数据库-驱动管理器新建驱动创建新驱动设置创建驱动-库驱动类确定和关闭 4、连接 博主…