没有合适的资源?快使用搜索试试~ 我知道了~
首页C#网络编程基础:Socket、TCP及应用实例
C#网络编程是一系列深入浅出的教程,旨在引导初学者理解基于套接字(Socket)的网络编程基础。该系列以C#语言为核心,讲解了TCP(Transmission Control Protocol,传输控制协议)这一关键的面向连接的传输协议,它在远程主机(或进程)间通信中扮演重要角色。 第一部分,作者介绍了网络编程的基本概念,包括TCP的特点,如其需要先建立连接(通过发送和接收握手报文来确认)以及全双工的特性,即数据可以在两个方向自由流动。重点介绍了套接字,它是网络编程中的核心组件,用于实现进程间的通信。 第二篇和第三篇主要通过实践案例展开教学,第二篇构建了一个简单的示例,演示了客户端如何发送字符串到服务端,服务端接收后处理(如转换大小写),再返回给客户端。第二篇中可能存在的问题在第三篇中被优化,采用了异步传输的方式,提高了程序的响应速度和效率。 第四篇内容升级,探讨了文件传输,让读者了解到在C#中如何在客户端和服务端之间传输文件,这对于实际应用中的文件共享和下载等场景至关重要。 最后一部分,第五篇则是整个系列的高潮,实现了一个功能丰富的在线聊天程序,集成了文本传输和文件传输功能,是对前面所学知识的综合运用,不仅锻炼了编程技巧,也展示了实际应用场景的设计思路。 在整个系列中,读者不仅能学到C#语言的基础网络编程知识,还能了解到如何设计和实现简单的即时通讯系统,这对于希望进入IT行业特别是网络编程领域的人来说是非常有价值的资源。对于进阶者,虽然文章强调自己不是"学院派",但仍建议结合更深入的理论学习以提升技术深度。
资源详情
资源推荐
端的 Socket,而我们在客户端创建的 TcpClient 则是由客户端去往服务端的。这个方法是
一个
同步方法
(或者叫阻断方法,block method),意思就是说,当程序调用它以后,它会
一直等待某个客户端连接,然后才会返回,否则就会一直等下去。这样的话,在调用它以后,
除非得到一个客户端连接,不然不会执行接下来的代码。一个很好的类比就是
Console.ReadLine()方法,它读取输入在控制台中的一行字符串,如果有输入,就继续执行
下面代码;如果没有输入,就会一直等待下去。
class Server {
static void Main(string[] args) {
Console.WriteLine("Server is running ... ");
IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 });
TcpListener listener = new TcpListener(ip, 8500);
listener.Start(); // 开始侦听
Console.WriteLine("Start Listening ...");
// 获取一个连接,中断方法
TcpClient remoteClient = listener.AcceptTcpClient();
// 打印连接到的客户端信息
Console.WriteLine("Client Connected!{0} <-- {1}",
remoteClient.Client.LocalEndPoint,
remoteClient.Client.RemoteEndPoint);
// 按 Q 退出
}
}
运行这段代码,会发现服务端运行到 listener.AcceptTcpClient()时便停止了,并不
会执行下面的 Console.WriteLine()方法。为了让它继续执行下去,必须有一个客户端连接
到它,所以我们现在运行客户端,与它进行连接。简单起见,我们只在客户端开启一个端口
与之连接:
class Client {
static void Main(string[] args) {
Console.WriteLine("Client Running ...");
TcpClient client = new TcpClient();
try {
client.Connect("localhost", 8500); // 与服务器连接
} catch (Exception ex) {
Console.WriteLine(ex.Message);
return;
}
// 打印连接到的服务端信息
Console.WriteLine("Server Connected!{0} --> {1}",
client.Client.LocalEndPoint,
client.Client.RemoteEndPoint);
// 按 Q 退出
}
}
此时,服务端、客户端的输出分别为:
// 服务端
Server is running ...
Start Listening ...
Client Connected!127.0.0.1:8500 <-- 127.0.0.1:5188
// 客户端
Client Running ...
Server Connected!127.0.0.1:5188 --> 127.0.0.1:8500
3.2
获取多个客户端连接
现在我们再接着考虑,如果有多个客户端发动对服务器端的连接会怎么样,为了避免你
将浏览器向上滚动,来查看上面的代码,我将它拷贝了下来,我们先看下客户端的关键代码:
TcpClient client;
for (int i = 0; i <=2; i++) {
try {
client = new TcpClient();
client.Connect("localhost", 8500); // 与服务器连接
} catch (Exception ex) {
Console.WriteLine(ex.Message);
return;
}
// 打印连接到的服务端信息
Console.WriteLine("Server Connected!{0} --> {1}",
client.Client.LocalEndPoint, client.Client.RemoteEndPoint);
}
如果服务端代码不变,我们先运行服务端,再运行客户端,那么接下来会看到这样的输
出:
// 服务端
Server is running ...
Start Listening ...
Client Connected!127.0.0.1:8500 <-- 127.0.0.1:5226
// 客户端
Client Running ...
Server Connected!127.0.0.1:5226 --> 127.0.0.1:8500
Server Connected!127.0.0.1:5227 --> 127.0.0.1:8500
Server Connected!127.0.0.1:5228 --> 127.0.0.1:8500
就又回到了本章第 2.2 小节“多个客户端与服务端连接”中的处境:
尽管有三个客户端
连接到了服务端,但是服务端程序只接收到了一个。这是因为服务端只调用了一次
listener.AcceptTcpClient(),而它只对应一个连往客户端的 Socket。
但是操作系统是知
道连接已经建立了的,只是我们程序中没有处理到,所以我们当我们输入“netstat -a”时 ,
仍然会看到 3 对连接都已经建立成功。
为了能够接收到三个客户端的连接,我们只要对服务端稍稍进行一下修改,将
AcceptTcpClient 方法放入一个 do/while 循环中就可以了:
Console.WriteLine("Start Listening ...");
while (true) {
// 获取一个连接,同步方法
TcpClient remoteClient = listener.AcceptTcpClient();
// 打印连接到的客户端信息
Console.WriteLine("Client Connected!{0} <-- {1}",
remoteClient.Client.LocalEndPoint,
remoteClient.Client.RemoteEndPoint);
}
这样看上去是一个死循环,但是并不会让你的机器系统资源迅速耗尽。因为前面已经说
过了,AcceptTcpClient()再没有收到客户端的连接之前,是不会继续执行的,它的大部分
时间都在等待。另外,服务端几乎总是要保持在运行状态,所以这样做并无不可,还可以省
去“按 Q 退出”那段代码。此时再运行代码,会看到服务端可以收到 3 个客户端的连接了。
Server is running ...
Start Listening ...
Client Connected!127.0.0.1:8500 <-- 127.0.0.1:5305
Client Connected!127.0.0.1:8500 <-- 127.0.0.1:5306
Client Connected!127.0.0.1:8500 <-- 127.0.0.1:5307
Part.2 同步传输字符串
服务端客户端通信
剩余57页未读,继续阅读
talktozk
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 多模态联合稀疏表示在视频目标跟踪中的应用
- Kubernetes资源管控与Gardener开源软件实践解析
- MPI集群监控与负载平衡策略
- 自动化PHP安全漏洞检测:静态代码分析与数据流方法
- 青苔数据CEO程永:技术生态与阿里云开放创新
- 制造业转型: HyperX引领企业上云策略
- 赵维五分享:航空工业电子采购上云实战与运维策略
- 单片机控制的LED点阵显示屏设计及其实现
- 驻云科技李俊涛:AI驱动的云上服务新趋势与挑战
- 6LoWPAN物联网边界路由器:设计与实现
- 猩便利工程师仲小玉:Terraform云资源管理最佳实践与团队协作
- 类差分度改进的互信息特征选择提升文本分类性能
- VERITAS与阿里云合作的混合云转型与数据保护方案
- 云制造中的生产线仿真模型设计与虚拟化研究
- 汪洋在PostgresChina2018分享:高可用 PostgreSQL 工具与架构设计
- 2018 PostgresChina大会:阿里云时空引擎Ganos在PostgreSQL中的创新应用与多模型存储
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功