应用程序可以通过 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 创建的 TcpListenerSocket 必须侦听是否有传入的连接请求。可以使用下面两种方法之一连接到该侦听器:    (1)创建一个 TcpClient,并调用三个可用的 Connect 方法之一。    (2)使用远程主机的主机名和端口号创建 TcpClient。此构造函数将自动尝试一个连接。     给继承者的说明要发送和接收数据,请使用 GetStream 方法来获取一个 NetworkStream。调用 NetworkStream 的 WriteRead 方法与远程主机之间发送和接收数据。使用 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 类提供一些简单方法,用于在阻止同步模式下侦听和接受传入连接请求。可使用 TcpClientSocket 来连接 TcpListener。可使用 IPEndPoint、本地 IP 地址及端口号或者仅使用端口号,来创建 TcpListener。可以将本地 IP 地址指定为 Any,将本地端口号指定为 0(如果希望基础服务提供程序为您分配这些值)。如果您选择这样做,可在连接套接字后使用 LocalEndpoint 属性来标识已指定的信息。

Start 方法用来开始侦听传入的连接请求。Start 将对传入连接进行排队,直至您调用 Stop 方法或它已经完成 MaxConnections 排队为止。可使用 AcceptSocketAcceptTcpClient 从传入连接请求队列提取连接。这两种方法将阻止。如果要避免阻止,可首先使用 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 是无连接传输协议,所以不需要在发送和接收数据前建立远程主机连接。但您可以选择使用下面两种方法之一来建立默认远程主机:

·         使用远程主机名和端口号作为参数创建 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());

}

}

}

}

Socket的三个功能类TCPClient、TCPListener 和 UDPClient (转)的更多相关文章

  1. 【socket】Socket的三个功能类TCPClient、TCPListener 和 UDPClient

    Socket的三个功能类TCPClient.TCPListener 和 UDPClient (转) 应用程序可以通过 TCPClient.TCPListener 和 UDPClient 类使用传输控制 ...

  2. C#编程 socket编程之TcpClient,TcpListener,UdpClient

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

  3. winform网络编程之TcpClient类,TcpListener类和UdpClient类

    TcpClient类和TcpListener类 (1)TcpClient的用途: 用于在同步阻止模式下通过网络来链接.发送和接受流数据,在此情况下,必须有侦听此连接的请求,而侦听的任务就交给TcpLi ...

  4. 第三篇 功能实现(3) (Android学习笔记)

    第三篇 功能实现(3) ●发一个广播和启动一个隐式的Intent非常像,那么它们之间有什么区别呢? Implicit Intents (sent via startActivity( )) and B ...

  5. React与ES6(三)ES6类和方法绑定

    React与ES6系列: React与ES6(一)开篇介绍 React和ES6(二)ES6的类和ES7的property initializer React与ES6(三)ES6类和方法绑定 React ...

  6. C#_02.13_基础三_.NET类基础

    C#_02.13_基础三_.NET类基础 一.类概述: 类是一个能存储数据和功能并执行代码的数据结构,包含数据成员和函数成员.(有什么和能够干什么) 运行中的程序是一组相互作用的对象的集合. 二.为类 ...

  7. 第三篇 功能实现(2) (Android学习笔记)

    第三篇 功能实现(2) ●Activity的四种启动模式 Activity的启动模式有四种,分别是standard.singleTop.singleTask和singleInstance. 在Andr ...

  8. 第三篇 功能实现(1) (Android学习笔记)

    第三篇 功能实现(1) 第8章 Android应用程序组成 ●Android的一些中.底层基础知识 ※ Android Framework 启动过程 Android手机系统本质上是一个基于Linux的 ...

  9. 为什么我在css里使用功能类优先

    前言 我想在我们开始的学CSS语法的时候,都是从以下的流程开始的: 1.写一个CSS类选择器: .my-class { } 2.往选择器里填充CSS语法: .my-class { display fl ...

随机推荐

  1. 9patch边框黑线的含义

    上面黑线或者点表示纵向可拉伸的区域 一般一个点即可 左边黑线或者点表示横向可拉伸的区域 一般一个点即可 下面表示纵向填放内容的区域  一般是一条黑线 右边表示横向填放内容的区域  一般是一条黑线

  2. apache下自定义404错误页面

    404页面的目的是:告诉浏览者其所请求的页面不存在或链接错误,同时引导用户使用网站其他页面而不是关闭窗口离开. 很多开源系统包括CMS系统.Blog系统等不提供404页面或提供的404页面并未达到SE ...

  3. bzoj 1005 1211 prufer序列总结

    两道题目大意都是根据每个点的度数来构建一棵无根树来确定有多少种构建方法 这里构建无根树要用到的是prufer序列的知识 先很无耻地抄袭了一段百度百科中的prufer序列的知识: 将树转化成Prufer ...

  4. Allegro建立引脚封装概念名词梳理

    首先感谢于博士的60讲的Cadence教学视频,老师讲的还是很有耐心,很细致,谢谢! 目前还只是看到建立PCB封装这一块,正好手头上有个案子在做,边做边学的进度还是要好很多.以前的工作对原理图这一块的 ...

  5. windows在当前位置打开终端

    1) 在此文件夹窗口内空白区域右键单击(需要同时按住Shift),从菜单中选择"在此处打开命令行窗口"的项:2) 在此窗口地址栏里直接输入cmd,回车即可.

  6. OWL,以及XML,RDF

    Ontology来源于哲学词汇:存在论(也有翻译成本体论).RDF是一种不错的本体描述方式,我们可以定义根据对现实世界的理解针对某个领域定义词汇来描述这个领域的知识.但RDF与RDF不能定义同义词.反 ...

  7. C++ Daily 《3》----构造函数可否是虚函数

    C++ 中构造函数可否是虚函数? 绝不要!! 而且,在构造函数中调用虚函数也是不提倡的行为,因为会引发预想不到的结果. 因为,在 derived class 对象构造的过程中,首先调用的是基类的构造函 ...

  8. 更新包地址安装新版node.js

    # apt-get update # apt-get install -y python-software-properties software-properties-common # add-ap ...

  9. React Native中的网络请求fetch和简单封装

    React Native中的网络请求fetch使用方法最为简单,但却可以实现大多数的网络请求,需要了解更多的可以访问: https://segmentfault.com/a/1190000003810 ...

  10. 在maven项目中解决第三方jar包依赖的问题

    在maven项目中,对于那些在maven仓库中不存在的第三方jar,依赖解决通常有如下解决方法: 方法1:直接将jar包拷贝到项目指定目录下,然后在pom文件中指定依赖类型为system,如: < ...