7-1 网络编程技术(下)-1

简介:

7-3-3   Socket类

在前面的例子中,我们还使用了Socket类,即套接字类。套接字是支持TCP/IP协议的网络通信的基本操作单元。可以将套接字看作不同主机间的进程进行双向通信的端点(EndPoint)。在通信时,至少需要一对套接字,其中一个运行于客户端,另一个运行于服务器端。一个Socket实例包含了一个本地或者一个远程端点的套接字信息,Socket类的主要成员,如下表7-8所示:
方法
说明
Connect
建立与远程主机的连接
关闭 Socket 连接并释放所有关联的资源。
将 Socket 置于侦听状态。
接收来自绑定的 Socket 的数据。
将数据发送到连接的 Socket。
属性
说明
获取 Socket 的地址族。
获取已经从网络接收且可供读取的数据量。
Connected
获取一个值,该值表明套接字是否与最后完成发送或接收操作的远程设备得到连接
获取 Socket 的协议类型。
获取远程终结点。
获取或设置一个值,该值指定之后同步 Send 调用将超时的时间长度。
获取 Socket 的类型。
获取或设置一个值,它指定 Socket 接收缓冲区的大小。
表7-8 Socket类
Socket类的构造函数为:
public Socket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType);其中几个参数均为枚举类型,可按需要选择不同类型。在网络连接时,某些方法均提供了相应的异步方法,可避免等待过程较长的情况无响应。

1.   案例学习:使用套接字的通信程序

本次实验目标是掌握Socket类的基本方法,同样需要建立两个应用程序,第一个是服务端,启动监听;第二个是客户端,向服务端请求连接。
u  实验步骤(1):
创建服务端控制台应用程序Server,运行中显示连接的个数,对方地址及端口号。
u   实验步骤(2):添加功能源代码:
static void  Main (string[] args)
        {
       int recvLength;// 用于表示客户端发送的信息长度
       byte[] data=new byte[1024];// 用于缓存客户端所发送的信息,通过socket传递的信息必须为字节数组
            IPEndPoint iend=new IPEndPoint(IPAddress.Any,9999);// 本机预使用的IP和端口
            Socket newsock=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            newsock.Bind(iend);
            newsock.Listen(10);
            Console.WriteLine("waiting for a client  ");
            Socket client=newsock.Accept();
           // 当有可用的客户端连接尝试时执行,并返回一个新的socket,用于与客户端之间的通信
            IPEndPoint clientAdd=(IPEndPoint)client.RemoteEndPoint;
            Console.WriteLine(" 连接:"+clientAdd.Address+" 端口:"+clientAdd.Port);
            string welcome="welcome here!";
            data=Encoding.ASCII.GetBytes(welcome);
            client.Send(data,data.Length,SocketFlags.None);// 发送信息
            while(true)
            {
                data=new byte[1024];
                recvLength=client.Receive(data);
                if (recvLength==0)// 当信息长度为0,说明客户端连接断开
                    break;
                Console.WriteLine(Encoding.ASCII.GetString(data,0,recvLength));
                client.Send(data,recvLength,SocketFlags.None);
            }
            Console.WriteLine(" 断开连接"+clientAdd.Address);
            client.Close();
            newsock.Close();
       }
 
                                  
图7-6 使用Socket通信(服务端)
u 实验步骤(3):
    创建客户端控制台应用程序Client,输入向服务端发送的数据:
static void  Main (string[] args)
        {
            byte[] data=new byte[1024];
            Socket newclient=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            Console.Write(" 输入服务器地址:");
            string ipadd=Console.ReadLine();
            Console.WriteLine();
            Console.Write(" 输入服务器端口:");
            int port=Convert.ToInt32(Console.ReadLine());
            IPEndPoint ie=new IPEndPoint(IPAddress.Parse(ipadd),port);// 服务器的IP和端口
            try
            {
             // 因为客户端只是用来向特定的服务器发送信息,所以不需要绑定本机的IP和端口。不需要监听。
                newclient.Connect(ie);
            }
            catch(SocketException e)
            {
                Console.WriteLine(" 不能连接");
                Console.WriteLine(e.ToString());
                return;
            }
            int recv = newclient.Receive(data);
            string stringdata=Encoding.ASCII.GetString(data,0,recv);
            Console.WriteLine(stringdata);
            while(true)
            {
                string input=Console.ReadLine();
                if(input=="exit")
                    break;
                newclient.Send(Encoding.ASCII.GetBytes(input));
                data=new byte[1024];
                recv=newclient.Receive(data);
                stringdata=Encoding.ASCII.GetString(data,0,recv);
                Console.WriteLine(stringdata);
            }
            Console.WriteLine(" 断开连接 ");
            newclient.Shutdown(SocketShutdown.Both);
            newclient.Close();
        }
 
                       
图7-7 使用Socket通信(客户端)
这里的运行结果与前面类似,区别在于内部实现完全使用套接字进行通信而没有使用Tcp相关类。在这个例子中,启动监听时设定了最大连接数:sock.Listen(10);可以启动多个连接。
问题讨论:
1 、 While(true){} ?
不断接收客户端的数据流实现消息的自动接收,直到网络流中没有数据则退出循环。




本文转自 qianshao 51CTO博客,原文链接:http://blog.51cto.com/qianshao/231844,如需转载请自行联系原作者

目录
相关文章
|
11月前
|
机器学习/深度学习 人工智能 监控
上海拔俗AI软件定制:让技术真正为你所用,拔俗网络这样做
在上海,企业正通过AI软件定制破解通用化难题。该模式以业务场景为核心,量身打造智能解决方案,涵盖场景化模型开发、模块化架构设计与数据闭环优化三大技术维度,推动技术与业务深度融合,助力企业实现高效、可持续的数字化转型。
346 0
|
监控 前端开发 安全
Netty 高性能网络编程框架技术详解与实践指南
本文档全面介绍 Netty 高性能网络编程框架的核心概念、架构设计和实践应用。作为 Java 领域最优秀的 NIO 框架之一,Netty 提供了异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。本文将深入探讨其 Reactor 模型、ChannelPipeline、编解码器、内存管理等核心机制,帮助开发者构建高性能的网络应用系统。
818 0
|
机器学习/深度学习 算法 PyTorch
Perforated Backpropagation:神经网络优化的创新技术及PyTorch使用指南
深度学习近年来在多个领域取得了显著进展,但其核心组件——人工神经元和反向传播算法自提出以来鲜有根本性突破。穿孔反向传播(Perforated Backpropagation)技术通过引入“树突”机制,模仿生物神经元的计算能力,实现了对传统神经元的增强。该技术利用基于协方差的损失函数训练树突节点,使其能够识别神经元分类中的异常模式,从而提升整体网络性能。实验表明,该方法不仅可提高模型精度(如BERT模型准确率提升3%-17%),还能实现高效模型压缩(参数减少44%而无性能损失)。这一革新为深度学习的基础构建模块带来了新的可能性,尤其适用于边缘设备和大规模模型优化场景。
593 16
Perforated Backpropagation:神经网络优化的创新技术及PyTorch使用指南
|
监控 算法 安全
基于 C# 基数树算法的网络屏幕监控敏感词检测技术研究
随着数字化办公和网络交互迅猛发展,网络屏幕监控成为信息安全的关键。基数树(Trie Tree)凭借高效的字符串处理能力,在敏感词检测中表现出色。结合C#语言,可构建高时效、高准确率的敏感词识别模块,提升网络安全防护能力。
374 2
|
调度 Python
探索Python高级并发与网络编程技术。
可以看出,Python的高级并发和网络编程极具挑战,却也饱含乐趣。探索这些技术,你将会发现:它们好比是Python世界的海洋,有穿越风暴的波涛,也有寂静深海的奇妙。开始旅途,探索无尽可能吧!
383 15
|
存储 双11 数据中心
数据中心网络关键技术,技术发明一等奖!
近日,阿里云联合清华大学与中国移动申报的“性能可预期的大规模数据中心网络关键技术与应用”项目荣获中国电子学会技术发明一等奖。该项目通过端网融合架构,实现数据中心网络性能的可预期性,在带宽保障、时延控制和故障恢复速度上取得重大突破,显著提升服务质量。成果已应用于阿里云多项产品及重大社会活动中,如巴黎奥运会直播、“双十一”购物节等,展现出国际领先水平。
|
监控 算法 JavaScript
基于 JavaScript 图算法的局域网网络访问控制模型构建及局域网禁止上网软件的技术实现路径研究
本文探讨局域网网络访问控制软件的技术框架,将其核心功能映射为图论模型,通过节点与边表示终端设备及访问关系。以JavaScript实现DFS算法,模拟访问权限判断,优化动态策略更新与多层级访问控制。结合流量监控数据,提升网络安全响应能力,为企业自主研发提供理论支持,推动智能化演进,助力数字化管理。
402 4
|
安全 网络安全 定位技术
网络通讯技术:HTTP POST协议用于发送本地压缩数据到服务器的方案。
总的来说,无论你是一名网络开发者,还是普通的IT工作人员,理解并掌握POST方法的运用是非常有价值的。它就像一艘快速,稳定,安全的大船,始终为我们在网络海洋中的冒险提供了可靠的支持。
484 22
|
机器学习/深度学习 算法 文件存储
YOLOv11改进策略【模型轻量化】| MoblieNetV3:基于搜索技术和新颖架构设计的轻量型网络模型
YOLOv11改进策略【模型轻量化】| MoblieNetV3:基于搜索技术和新颖架构设计的轻量型网络模型
1312 10
YOLOv11改进策略【模型轻量化】| MoblieNetV3:基于搜索技术和新颖架构设计的轻量型网络模型