首页 程序笔记 使用C#的Socket实现最简单的TCP通信示例代码

使用C#的Socket实现最简单的TCP通信示例代码

使用C#实现TCP通信有多个类可以使用,最简单的是直接使用TcpListener+TcpClient类,但有时候这两个类并不方便做更底层的一些配置。而使用Socket类可以做一些比较底层的TCP配置。这里给出使用Socket实现最简单的TCP通信示例代码。、

相关说明

IPAddress addr = IPAddress.Parse(“127.0.0.1”);
System.Net.IPAddress,IP地址的对象表示方法,将字符串IP地址转换为IPAddress实例。

IPEndPoint ipe = new IPEndPoint(addr, 21000);
System.Net.IPEndPoint,表示一个特定的IP地址和端口的组合,socket绑定等使用,是IP地址和端口被成对处理的对象。

AddressFamily.InterNetwork
System.Net.Sockets.AddressFamily是枚举,InterNetwork表示使用IP V4版本的地址进行通信。

SocketType.Stream
System.Net.Sockets.SocketType是枚举,Stream表示基于字节流,不重复数据的双向通信,使用TCP传输控制协议。

Sockert服务端的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace tcp_server
{
    class Program
    {
        static void Main(string[] args)
        {
            //============================================================================//
            // 1、服务监听地址和端口
            //============================================================================//
            string host = 127.0.0.1;
            // 端口号
            int port = 8081;
            // 将IP地址字符串转换为IPAddress对象
            IPAddress ip = IPAddress.Parse(host);
            // IP EndPoint
            IPEndPoint ipe = new IPEndPoint(ip, port);

            //============================================================================//
            // 2、创建socket服务端并监听端口
            //============================================================================//
            //创建TCP Socket对象
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //绑定EndPoint对象(地址)
            server.Bind(ipe);

            //开始监听
            server.Listen(0);
            Console.WriteLine(已经处于监听状态,等待客户端连接 . . . );

            //============================================================================//
            // 3、等待客户端连接,并得到连接的Socket
            //============================================================================//
            Socket remote = server.Accept();
            Console.WriteLine(客户端建立连接 . . . );

            byte[] bytes = new byte[1024];
            //从客户端接收消息
            int len = remote.Receive(bytes, bytes.Length, 0);
            //将消息转为字符串
            string recvStr = Encoding.ASCII.GetString(bytes, 0, len);
            Console.WriteLine(接收的客户端消息 : {0}, recvStr);

            string sendStr = Response from server!;
            Console.WriteLine(发送消息给客户端 : {0}, sendStr);

            // 将字符串消息转为字节数组
            bytes = Encoding.ASCII.GetBytes(sendStr);
            //发送消息给客户端
            remote.Send(bytes, bytes.Length, 0);

            //============================================================================//
            // 4、关闭服务端的监听
            //============================================================================//
            if (server != null)
            {
                server.Close();
                server = null;
            }

            Console.WriteLine(Press any key to continue . . . );
            Console.ReadKey(true);
        }
    }
}

Socket客户端的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace tcp_client
{
    class Program
    {
        static void Main(string[] args)
        {
            //============================================================================//
            // 1、服务端地址
            //============================================================================//
            string hostAddr = 127.0.0.1;
            int port = 8081;
            // 将IP地址字符串转换为IPAddress对象
            IPAddress ip = IPAddress.Parse(hostAddr);
            // 创建终结点EndPoint
            IPEndPoint ipe = new IPEndPoint(ip, port);

            //============================================================================//
            // 2、创建socket连接客户端
            //============================================================================//        
            // 创建Socket并连接到服务器
            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            // 连接到服务器
            client.Connect(ipe);

            string sendStr = I am a Client!;
            Console.WriteLine(发送消息给服务端 : {0}, sendStr);
            // 将字符串消息转为字节数组
            byte[] bytes = Encoding.ASCII.GetBytes(sendStr);
            //发送消息给客户端
            client.Send(bytes, bytes.Length, 0);

            bytes = new byte[1024];
            //从客户端接收消息
            int len = client.Receive(bytes, bytes.Length, 0);
            //将消息转为字符串
            string recvStr = Encoding.ASCII.GetString(bytes, 0, len);
            Console.WriteLine(接收到的服务端响应的消息 : {0}, recvStr);

            //============================================================================//
            // 4、关闭连接
            //============================================================================//
            if (client != null)
            {
                client.Close();
                client = null;
            }

            Console.WriteLine(Press any key to continue . . . );
            Console.ReadKey(true);
        }
    }
}

运行结果

以上两个代码,分别建立两个控制台的项目,使用.net framework 4.0及以上的版本即可正常编译,运行结果如下:
服务端:

客户端:

1

站心网

使用C#实现TCP通信有多个类可以使用,最简单的是直接使用TcpListener+TcpClient类,但有时候这两个类并不方..

为您推荐

代码照进现实:对公司管理策略的技术性解构

上学的时候觉得计算机专业的一些理论晦涩难懂,跟现实世界的关联太少,每当遇到一些精妙的设计时都会发出一种感叹:究竟是什么脑袋才能想出这么有意思的东西。一晃工作十年,阅历渐丰,隐约发现其实社会中的一些现象..

编写优秀 CSS 代码的 8 个策略

编写基本的CSS和HTML是我们作为Web开发人员学习的首要事情之一。然而,我遇到的很多应用程序显然没有人花时间真正考虑前端开发的长久性和可维护性。我认为这主要是因为许多开发人员对组织CSS / HTML和JavaScript的策..

天天写业务代码,如何成为技术大牛?

不管是开发、测试、运维,每个技术人员心理多多少少都有一个成为技术大牛的梦,毕竟"梦想总是要有的,万一实现了呢"!正是对技术梦的追求,促使我们不断地努力和提升自己。然而"梦想是美好的,现实却是残酷的",很多..

记我经历的一次公司破产经历,一行代码害死一家公司

前言这是一篇亲身经历的真实记录,事情发生在2010年。狗血剧情一再上演,使我的程序员生涯变得跌宕起伏,也从中学到了很多。在写这篇文章之前,我还专门去查了这家公司的资料。有如下事实:1.官网已经打不开了。2.天..

如何处理前任程序员留下的代码

作为软件工程师不可避免会遇到的一个场景是:我们在改变或添加一个功能到不是我们创建的、我们不熟悉的、与我们负责的系统部分无关的代码中时,会遇到麻烦。虽然这可能会是一个繁琐而艰巨的任务,但是由于使用其他开..

mysql分表简单介绍

一、Mysql分表的原因1、当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会停在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。2、mysql中有一种机制是表锁定..

对码农而言什么样的代码才能叫做好代码?

好的代码,就像是好的笑话——无需解释就能让别人明白。如果你的代码能够做到不解自明,在大多数时候,你根本无需为其配备说明文档。好的代码,就像是一辆配备了优秀音响和杯架的汽车,这辆车在行驶到最高速度的时候..

当一个程序员写不出代码了,该怎么办?

你已经对着电脑n个小时了。不知道该写什么代码,或者一种摔键盘的冲动正在你的胸中酝酿。咖啡一杯接着一杯。不敢再喝了,因为搞不好要有副作用了,心跳加速,身体不由自主地颤抖,出冷汗,但还是无法产出任何代码。..

一个简单的 C# 异步日志记录器

Clearcove.Logging是一个非常简单的日志库,旨在通过直接许可条款满足大多数日志记录需求。介绍我知道你在想什么——代码世界真的需要另一个日志库吗?如果你在.NET中寻找一个日志库,那么你有很多选择。有NLog,Log..

使用 html2canvas 实现截图功能

html2canvas 是一个开源的 JavaScript 库,用于将网页上的 HTML 元素渲染成图像。它通过遍历页面的 DOM 树和计算样式,然后将其绘制到 <canvas> 元素上,最终生成图片。该库不依赖服务器端,而是通过浏览器端的 Java..

一个简单的大转盘抽奖程序(附.NetCore Demo源码)

最近闲下来在做一些demo,现在讲一下做的一个简单的大转盘抽奖demo,前端lottery,layui,后端.net core,sqlsugar,数据库用的mysql1.前端实现:前端用的是基于开源的lottery,其中有些改动的,使得前端可以自适应pc端..

网站统计中的访问信息收集的前端实现

网站数据统计分析工具是网站站长和运营人员经常使用的一种工具,比较常用的有谷歌分析、百度统计和腾讯分析等等。所有这些统计分析工具的第一步都是网站访问数据的收集。目前主流的数据收集方式基本都是基于javascri..

使用SuperWebSocket实现Web消息推送

在大部分Web系统中,我们可能遇到需要向客户端推送消息的需求。SuperWebSocket第三方库能让我们轻松的完成任务。SuperWebSocket第三方库可以从网上下载,不过通过Visual Studio Nuget安装更快。引用SuperWebSocket相..

.NET C# 使用Hook钩子实现全局监听键盘和鼠标

C# 是一种面向对象的编程语言,具有丰富的类库和工具支持,适用于各种类型的应用程序开发。Windows 提供了一种称为"钩子"(Hook)的机制,允许拦截并处理系统级别的事件,如键盘按键和鼠标移动。通过结合 C# 和 Hook..

.NET C#连接FTP实现文件上传下载

在 .NET 中可以使用 System.Net.FtpWebRequest 类来连接 FTP 服务器,实现文件上传和下载。以下是实现文件上传和下载的完整代码示例。1. 上传文件到 FTP 服务器using System;using System.IO;using System.Net;class..

C#使用 Attribute 实现 AOP 功能

在 C# 中,通过自定义 Attribute 并结合一些技术(如动态代理、反射等)可以实现 AOP(面向切面编程)。AOP 通常用于日志记录、性能监控、权限验证等横切关注点。以下是一个使用 C# Attribute 实现 AOP 功能的示例。..

ABP.Net Core使用教程(一)启动模版项目

只需要简单的3步:1,到官网下载模版项目 https://aspnetboilerplate.com/Templates2,用VS2017打开,将Web.Host设置为启动项3,在程序包管理器控制台(Nuget控制台)里设定默认项目为EntityFrameworkCore,执行命令..

C#中的线程安全的集合ConcurrentQueue使用示例

在多线程编程中,如何安全地在不同线程之间共享数据是一个非常重要的问题。C# 为我们提供了一些专门设计的线程安全集合,其中之一就是 ConcurrentQueue<T>。它是一种先进先出(FIFO)的数据结构,专门为多线程环境设..

CSS砌体布局示例和使用场景

CSS砌体布局(Masonry Layout)CSS砌体布局是一种网页布局技术,它的灵感来源于砖石墙的排列方式,类似于“拼图”或“拼砖”的效果。在砌体布局中,元素的排列并不完全遵循传统的网格布局规则,..

使用CSS columns-visibility实现砌体布局

CSS的 columns 属性(如 columns、column-count 和 column-width)通常用于多列文本布局,而不是直接用于砌体布局。然而,结合 columns 和 visibility 属性,可以在某些情况下实现类似砌体布局的效果,虽然它并不完..

发表回复

返回顶部