热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Socket的三个功能类TCPClient、TCPListener和UDPClient(转)

应用程序可以通过TCPClient、TCPListener和UDPClient类使用传输控制协议(TCP)和用户数据文报协议(UDP)服务。这些协议类建立在System.Net

应用程序可以通过 TCPClient、TCPListener 和 UDPClient 类使用传输控制协议 (TCP) 和用户数据文报协议 (UDP)
服务。这些协议类建立在 System.Net.Sockets.Socket
类的基础之上,负责数据传送的细节。(也就是说TCPClient、TCPListener 和 UDPClient 类是用来简化Socket)

    TcpClient >和 TcpListener 使用 NetworkStream 类表示网络。使用 GetStream
方法返回网络流,然后调用该流的 Read 和 Write 方法。NetworkStream
不拥有协议类的基础套接字,因此关闭它并不影响套接字。

    UdpClient >类使用字节数组保存 UDP 数据文报。使用 Send 方法向网络发送数据,使用 Receive
方法接收传入的数据文报。

>1.TcpClient>     TcpClient 类提供了一些简单的方法,用于在同步阻止模式下通过网络来连接、发送和接收流数据。为使
TcpClient 连接并交换数据,使用 TCP ProtocolType
创建的 TcpListener
或 Socket
必须侦听是否有传入的连接请求。可以使用下面两种方法之一连接到该侦听器:    (1)创建一个 TcpClient,并调用三个可用的 Connect
方法之一。    (2)使用远程主机的主机名和端口号创建 TcpClient。此构造函数将自动尝试一个连接。
    给继承者的说明要发送和接收数据,请使用 GetStream
方法来获取一个 NetworkStream。调用
NetworkStream 的 Write
和 Read
方法与远程主机之间发送和接收数据。使用 Close
方法释放与 TcpClient 关联的所有资源。
   
下面的例子给出怎么利用TcpClient连接到服务器:

>using
System;

>using
System.Collections.Generic;

>using
System.Text;

>using
System.Net.Sockets;

>using
System.Net;

 

>namespace> tcpclient

{

>    class
Program

>    {

>       
private >static int portNum
= 11000;

>       
private >static string
hostName = >Dns.GetHostName().ToString();

>       
public >static void
Main(String[] args)

>       
{

>           
try

>           
{

>               
Console.WriteLine(>"
主机名字:">+ >Dns.GetHostName());

>               
Console.WriteLine(>"
主机IP地址:">+ >Dns.GetHostAddresses(>Dns.GetHostName())[0]);

>               > >TcpClient client = >new >TcpClient(hostName, portNum);

>               
NetworkStream ns =
client.GetStream();

>               
byte[] bytes = >new >byte[1024];

>               
int bytesRead = ns.Read(bytes, 0,
bytes.Length);

>               
//
将字节流解码为字符串

>               
Console.WriteLine(>Encoding.ASCII.GetString(bytes, 0,
bytesRead));

>               
client.Close();

>           
}

>           
catch (>Exception e)

>           
{

>               
Console.WriteLine(e.ToString());

>           
}

>    

>       
}

>    }

}

>2.TcpListener>    TcpListener 类提供一些简单方法,用于在阻止同步模式下侦听和接受传入连接请求。可使用
TcpClient
或 Socket
来连接 TcpListener。可使用 IPEndPoint、本地
IP 地址及端口号或者仅使用端口号,来创建 TcpListener。可以将本地 IP 地址指定为 Any,将本地端口号指定为
0(如果希望基础服务提供程序为您分配这些值)。如果您选择这样做,可在连接套接字后使用 LocalEndpoint
属性来标识已指定的信息。

    Start
方法用来开始侦听传入的连接请求。Start 将对传入连接进行排队,直至您调用
Stop
方法或它已经完成 MaxConnections 排队为止。可使用 AcceptSocket
或 AcceptTcpClient
从传入连接请求队列提取连接。这两种方法将阻止。如果要避免阻止,可首先使用
Pending
(注:TcpListener类才有)方法来确定队列中是否有可用的连接请求。

调用 Stop 方法来关闭 TcpListener。

>下面的例子给出怎么利用TcpListener监听客户端的请求:
using> System;

>using
System.Collections.Generic;

>using
System.Text;

>using
System.Net.Sockets;

>using
System.Net;

>namespace> tcpclient

{

>    class
Program

>    {

>       
private >const int portNum
= 11000;

>       
static void
Main(string[] args)

>       
{

>           
bool dOne= >false;

>           
//TcpListener listener = new TcpListener(portNum);
//
>根据VS2005 MSDN
此方法已经过时,不再使用

>           
// IPEndPoint
类将网络标识为IP地址和端口号

>           
TcpListener listener = new
TcpListener(>new >IPEndPoint(>IPAddress.Any, portNum));

>           
listener.Start();

>           
while (!done)

>           
{

>               
Console.Write(>"Waiting for connection...");

>               
TcpClient client =
listener.AcceptTcpClient();

>               
Console.WriteLine(>"Connection accepted.");

>               
NetworkStream ns =
client.GetStream();

>               
byte[] byteTime = >Encoding.ASCII.GetBytes(>DateTime.Now.ToString());

>               
try

>        
       {

>                   
ns.Write(byteTime, 0, byteTime.Length);

>                   
ns.Close();

>                   
client.Close();

>               
}

>               
catch (>Exception e)

>               
{

>                   
Console.WriteLine(e.ToString());

>               
}

>           
}

>           
listener.Stop();

>        
}

>    }

}

 

>3.UdpClient>    UdpClient 类提供了一些简单的方法,用于在阻止同步模式下发送和接收无连接
UDP 数据报。因为 UDP
是无连接传输协议,所以不需要在发送和接收数据前建立远程主机连接。但您可以选择使用下面两种方法之一来建立默认远程主机:

·Times New Roman"; font-size-adjust: none; font-stretch: normal;‘>        
使用远程主机名和端口号作为参数创建 UdpClient
类的实例。

·Times New Roman"; font-size-adjust: none; font-stretch: normal;‘>        
创建 UdpClient 类的实例,然后调用 Connect
方法。

   可以使用在
UdpClient 中提供的任何一种发送方法将数据发送到远程设备。使用 Receive
方法可以从远程主机接收数据。    UdpClient 方法还允许发送和接收多路广播数据报。使用 JoinMulticastGroup
方法可以将 UdpClient 预订给多路广播组。使用 DropMulticastGroup
方法可以从多路广播组中取消对 UdpClient 的预订。

   下面的例子演示同一主机不同端口之间的UDP通信:

监听端: using> System;

>using
System.Net.Sockets;

>using
System.Text;

>using
System.Net;

>using
System.Threading;

>namespace> Udpclient2

{

>    class
Program

>    {

>       
static void
Main(string[] args)

>       
{

>           
try

>           
{

>               
UdpClient udpClient = new
UdpClient(12000);

>               
string returnData = "client_end";

>               
do

>               
{

>                   
Console.WriteLine(>"
服务器端接收数据:.............................">);

>                   
IPEndPoint RemoteIpEndPoint = new
IPEndPoint(>IPAddress.Any, 0);

>                   
//
此处通过引用传值,获得客户端的IP地址及端口号

>                   
Byte[] receiveBytes = udpClient.Receive(>ref RemoteIpEndPoint);

>                   
//
此处获得客户端的数据

>                   
returnData = >Encoding.UTF8.GetString(receiveBytes);

>                   
//Encoding.ASCII.GetString(receiveBytes);
>此处若用ASCII,不能正确处理中文

>                   
Console.WriteLine(>"This is the message server received: " +
returnData.ToString());

 

>                   
Thread.Sleep(3000);

>                

>                   
Console.WriteLine(>"
向客户端发送数据:.............................">);

>                   
udpClient.Connect(>Dns.GetHostName().ToString(), 11000);

>     
              >// Sends a message to the host to which you have
connected.

>                   
string sendStr = >"
我来自服务器端:"> + >DateTime.Now.ToString();

>                   
Byte[] sendBytes = >Encoding.UTF8.GetBytes(sendStr);

>                   
//Byte[] sendBytes =
Encoding.ASCII.GetBytes(sendStr);
此处若用ASCII,不能正确处理中文

>                   
udpClient.Send(sendBytes, sendBytes.Length);

>                   
Console.WriteLine(>"This is the message server send: " +
sendStr);

 

>                
} while (returnData != "client_end");

>               

>           
}

>           
catch (>Exception e)

>           
{

>               
Console.WriteLine(e.ToString());

>           
}

>       
}

>    }

}

 

客户端: using> System;

>using
System.Net.Sockets;

>using
System.Text;

>using
System.Net;

>namespace> Udpclient

{

>    class
Program

>    {

>       
static void
Main(string[] args)

>       
{

>          
try

>           
{

>              
UdpClient udpClient = new
UdpClient(11000);

>              

>              
//
向服务器发送数据

>              
udpClient.Connect(>Dns.GetHostName().ToString(), 12000);

>              
// Sends a message to the host to which you have
connected.

>              
string sendStr = >"
我来自客户端:"> + >DateTime.Now.ToString();

>              
Byte[] sendBytes = >Encoding.UTF8.GetBytes(sendStr);

>       
       //Byte[]
sendBytes = Encoding.ASCII.GetBytes(sendStr);
此处若用ASCII,不能正确处理中文

>              
udpClient.Send(sendBytes, sendBytes.Length);

>              
Console.WriteLine(>"This is the message client send: " +
sendStr);

>               

>              

>              
//
等待服务器的答复,收到后显示答复,并结束对话

>              
IPEndPoint RemoteIpEndPoint = new
IPEndPoint(>IPAddress.Any, 0);

>              
//
此处通过引用传值,获得客户端的IP地址及端口号

>              
Byte[] receiveBytes = udpClient.Receive(>ref RemoteIpEndPoint);

>              
//
此处获得服务器端的数据

>              
string returnData = >Encoding.UTF8.GetString(receiveBytes);

>              
//Encoding.ASCII.GetString(receiveBytes);
>此处若用ASCII,不能正确处理中文

>              
Console.WriteLine(>"This is the message come from server: " +
returnData.ToString());

>              
udpClient.Close();

>           
}

>           
catch (>Exception e)

>           
{

>               
Console.WriteLine(e.ToString());

>           
}

>       
}

>    }

>}

Socket的三个功能类TCPClient、TCPListener 和 UDPClient (转),布布扣,bubuko.com


推荐阅读
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
author-avatar
我是曰照人_692
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有