当前位置: 首页 > 编程日记 > 正文

socket与TcpListener/TcpClient/UdpClient 的区别及联系


点击此处下载源代码

    应用程序可以通过 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 方法来确定队列中是否有可用的连接请求。

调用 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 是无连接传输协议,所以不需要在发送和接收数据前建立远程主机连接。但您可以选择使用下面两种方法之一来建立默认远程主机:

·         使用远程主机名和端口号作为参数创建 UdpClient 类的实例。

·         创建 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());

            }

        }

    }

}

转载于:https://www.cnblogs.com/qqhfeng/archive/2009/10/08/1578943.html

相关文章:

Sql Server 中锁的概念

锁的类型:(1) 共享锁:共享锁用于所有的只读数据操作.(2) 修改锁:修改锁在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享锁造成的死锁现象(3) 独占锁:独占锁是为修改数据而保留的。它所锁定的资源,其他事务不能读取也不能修改。独…

Java的Clone

Clone 就是重写clone()方法 两种办法进行深拷贝,一种是Clonable接口,一种是Serializable接口 实现代码如下 package Clone;public class Student implements Cloneable {private String name;public String getName() {return name; }public void setNam…

MySQL登录时ERROR 1045:Access denied for user ‘root’@’localhost’ (using password: YES)

MySQL登录时ERROR 1045错误win10_x64系统中登录MySQL时出现1045错误 错误描述: ERROR 1045:Access denied for user ‘root’’localhost’ (using password: YES) 解决方法: 1、停止MySQL服务 方法:在DOS窗口使用net stop mysql…

对L2和B2的阐述

根据英特尔官方称,之所以把B2步进E6300改产成L2步进的原生2M的E6300,原因在于B2在生产上和高端6800属一类型的内制芯片,在针脚面都拥有7颗主晶体,是很容易让E6300超到很高,E6300面临着以后的中端市场不得不将其价格低下…

江西省移动物联网发展战略新闻发布会举行-2017年10月江西IDC排行榜与发展报告...

编者按:当人们在做技术创新时,我们在做“外包产业“;当人们在做制造产业,我们在做”服务产业“;江人们在做AI智能时,我们在做”物联网“崛起,即使有一个落差,但红色热土从不缺少成长…

获取Linux/Unix文件系统信息

设计一套SAP监控系统http://blog.csdn.net/bayaci/archive/2009/10/13/4666456.aspx显示系统df(linux )/ bdf (hpunix)的信息执行代码,获取诸如bdf /usr命令后的信息:DiskInfo diskInfo new DiskInfo();diskInfo.info(directory)…

MySQL数据库相关命令

MySQL数据库 1、MySQL导出命令 mysqldump -h IP -u 用户名 -p 数据库名 > 导出的文件名 注:mysqldump命令是在cmd窗口初始目录下的命令,不是进入mysql执行的命令。 或者使用如下命令 mysqldump -u 用户名 -p 数据库名称 > 导出的文件名 2、MyS…

docker(3)docker下的centos7下安装jdk

1、将jdk-8u65-linux-x64.tar.gz文件传到docker的宿主机上 rz 2、将宿主机上的jdk-8u65-linux-x64.tar.gz复制到centos7的容器下 #在宿主机上执行 [rootcent7-zuoys ~]# docker cp /root/jdk-8u65-linux-x64.tar.gz a3b489cec243:/software#a3b489cec243是指定的centos7容器id …

请问,关闭子窗口提示错误,大家遇到这样的问题吗?

请问,关闭子窗口提示错误,大家遇到这样的问题吗? Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiBase/html/delphi_20061207133720244.html关闭子窗口时总是提示下面的错误: Access violation at address 00000008. Read of address 00000008 …

Hadoop学习笔记一 简要介绍

Hadoop学习笔记一 简要介绍 这里先大致介绍一下Hadoop. 本文大部分内容都是从官网Hadoop上来的。其中有一篇介绍HDFS的pdf文档,里面对Hadoop介绍的比较全面了。我的这一个系列的Hadoop学习笔记也是从这里一步一步进行下来的,同时又参考了网上的很多文…

Struts 2(八):文件上传

第一节 基于Struts 2完成文件上传 Struts 2框架中没有提供文件上传,而是通过Common-FileUpload框架或COS框架来实现的,Struts 2在原有上传框架的基础上进行了进一步封装,从而大大简化了文件上传的开发应用。 1.1 下载并安装Common-FileUpload…

LA3177 - Beijing Guards(二分+贪心【更优美的解法)

简介:同皇帝的烦恼 分析: 如果n是偶数,那么答案就是相邻两个人的r值之和的最大值 即ansmax{r(i)r(i1)} (i1,2,3,…,n),规定r(n1)r1 这时的ans实际上是答案的下限 一个合法的方案就是,对于编号为i的人来说&#xff0c…

Redis数据库设置密码

Redis数据库的默认打开方式为无密码打开,现在要将其设置为以密码形式打开。 Redis文件夹内容1、修改配置文件 在redis.windows.conf文件中设置密码的命令中添加requirepass 123456一行,将Redis数据库的密码设置为123456 2、运行redis-server.exe程序 3…

沉甸甸的证书,沉甸甸的心情

今天收到了由电子工业出版社易飞思公司转寄的我在由51CTO、中国图书商报、互动出版网等单位联办的“2008年度最佳技术图书和原创作者评选”活动(这是第二届了)中所获得的“2008年度最佳原创作者”证书(证书见下,非常精美&#xff…

windows :Tomcat免安装版环境变量配置 + jdk配置

1. 下载后解压,我解压的目录为:D:\Tomcat\apache-tomcat-9.0.1-windows-x64 2. 安装jdk和jre, 并配置环境变量; 2.1 用户变量新建JAVA_HOME; 2.2 系统变量CLASSPATH中添加:.;C:\Program Files\Java\jdk1.8.0_144\lib…

将数据库查询结果导出成Excel表格

使用Java代码,从数据库中获取结果集,将结果集导出成Excel表格形式。 从数据库中查询学生表所有数据,将其导出成Excel表格,点击查看学生表表结构 。 package com.test.test.test1;import com.test.test.db.StudentDb; import com.…

【Java_基础】Java中Native关键字的作用

本篇博文转载与:Java中Native关键字的作用转载于:https://www.cnblogs.com/leiblog/p/10529056.html

在SQL Server 2000 和SQL Server 2005中导出表结构

SQL Server 2000 SELECT 表名 case when a.colorder1 then d.name else end, 表说明 case when a.colorder1 then isnull(f.value,) else end, 字段名 a.name, 主键 case when exists(SELECT 1 FROM sysobjects where xtypePK and p…

百度、谷歌理念对对碰

尽管百度和谷歌哪个更好用是用户自己说了算,但它们对搜索引擎的理解和理念到底有多少异同?它们将带给用户一个怎样的搜索未来? 为了更好地看清这些问题,《第一财经日报》分别向两公司提出了如下问题,且听它们的回答.1.搜索结果提供得尽可能多,是否会提升搜索质量? 并不是搜索…

2019 GDUT Rating Contest I : Problem H. Mixing Milk

题面: H. Mixing Milk Input file: standard inputOutput file: standard outputTime limit: 1 secondMemory limit: 256 megabytesFarming is competitive business – particularly milk production. Farmer John figures that if he doesn’t innovate in his mi…

托管调试助手报错

今天在调试程序时出现下面的异常: 其他信息: CLR 无法从COM 上下文0x1a0e50 转换为COM 上下文0x1a0fc0,这种状态已持续60 秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送Windows 消息的情况下处理一个运行时间非常长的操作。这种情况通常会影…

在文件中查找指定字符串

1. 在指定文件中查看指定字符串的行数 cat file_name | grep -n "String" 2. 在多个文件中查找指定字符串 在多个指定文件中查找指定字符串,命令如下:grep -l "String" file1 file2 file3-l : 列出包含特定字符串的文件名称&#…

FPGA研发之道(25)-管脚

管脚是FPGA重要的资源之一,FPGA的管脚分别包括,电源管脚,普通I/O,配置管脚,时钟专用输入管脚GCLK等。 本文引用地址:http://www.eepw.com.cn/article/266429.htm (1)电源管脚: 通常来说&#xf…

函数组:SDIFRUNTIME

函数组:SDIFRUNTIME;Interfaces for Type Runtime Objects,获得与表相关的数据信息。 包含函数模块: DDIF_FIELDINFO_GET:DD:读取表格字段信息的接口,获得一个表中全部或部分字段的信息。DDIF_F…

原来AGILE就是这么一回事啊!

仅仅还在几年前, XP 还被认为是方法异教, FDD 属于黑客程序方法。如今,敏捷俨然已经成为主流学说,敏捷方法成为人们学习和讨论的热点。敏捷方法的应用也更加广泛,以至于不少外包项目都要求采用某种敏 捷方法。它不仅仅…

开发微信小程序入门前

开发微信小程序入门前 百牛信息技术bainiu.ltd整理发布于博客园 2016年09月21日晚 微信发不了微信“小程序”的内测版,一时间整个互联网都炸了锅。个大新闻、论坛都在讨论这个事情。 作为互联网的一猿,我们怎能不紧跟时代的脚步。于是第二天上午也对微信…

hive的join

第一:在map端产生join mapJoin的主要意思就是,当链接的两个表是一个比较小的表和一个特别大的表的时候,我们把比较小的table直接放到内存中去,然后再对比较大的表格进行map操作。join就发生在map操作的时候,每当扫描一…

表格在线转换工具

表格在线转换工具 :https://tableconvert.com/ —— END ——

Android之View绘制流程源码分析

版权声明:本文出自汪磊的博客,转载请务必注明出处。 对于稍有自定义View经验的安卓开发者来说,onMeasure,onLayout,onDraw这三个方法都不会陌生,起码多少都有所接触吧。 在安卓中,一个View显示到…

看不懂的生成函数

不得不说这个东西真是妙啊 遭到了降智打击 生成函数又叫做母函数,主要用于解决一些组合数学问题 对于一个数列\(\{f_0,f_1,f_2,...,f_n\}\) 我们定义其生成函数为 \[F(x)f_0f_1xf_2x^2...f_nx^n\] 也就是 \[F(x)\sum_{i0}^nf_ix^i\] 也就是把数列的每一项当成了多项…