用C#如何将两个界面程序连接到一个服务器上并可以实时通信

用C#如何将两个界面程序连接到一个服务器上并可以实时通信,第1张

一、摘要

总结基于C#的UDP协议的同步通信。

二、实验平台

Visual Studio 2010

三、实验原理

UDP传输协议同TCP传输协议的区别可查阅相关文档,此处不再赘述。

四、实例

41 采用socket实现UDP

由于UDP是一种无连接的协议。因此,为了使服务器应用能够发送和接收UDP数据包,则需要做两件事情:

(1) 创建一个Socket对象;

(2) 将创建的套接字对象与本地IPEndPoint进行绑定。

完成上述步骤后,那么创建的套接字就能够在IPEndPoint上接收流入的UDP数据包,或者将流出的UDP数据包发送到网络中其他任意设备。使用UDP进行通信时,不需要连接。因为异地的主机之间没有建立连接,所以UDP不能使用标准的Send()和Receive()t套接字方法,而是使用两个其他的方法:SendTo()和ReceiveFrom()。

SendTo()方法指定要发送的数据,和目标机器的IPEndPoint。该方法有多种不同的使用方法,可以根据具体的应用进行选择,但是至少要指定数据包和目标机器。如下:

SendTo(byte[] data,EndPoint Remote)

ReceiveFrom()方法同SendTo()方法类似,但是使用EndPoint对象声明的方式不一样。利用ref修饰,传递的不是一个EndPoint对象,而是将参数传递给一个EndPoint对象。

UDP应用不是严格意义上的真正的服务器和客户机,而是平等的关系,即没有主与次的关系。为了简便起见,仍然把下面的这个应用叫做UDP服务器。

服务器端代码:

复制代码

using System;

using SystemCollectionsGeneric;

using SystemText;

using SystemNet;

using SystemNetSockets;

namespace UDP

{

class Program

{

static void Main(string[] args)

{

int recv;

byte[] data = new byte[1024];

//得到本机IP,设置TCP端口号

IPEndPoint ip = new IPEndPoint(IPAddressAny, 8001);

Socket newsock = new Socket(AddressFamilyInterNetwork, SocketTypeDgram, ProtocolTypeUdp);

//绑定网络地址

newsockBind(ip);

ConsoleWriteLine("This is a Server, host name is {0}", DnsGetHostName());

//等待客户机连接

ConsoleWriteLine("Waiting for a client");

//得到客户机IP

IPEndPoint sender = new IPEndPoint(IPAddressAny, 0);

EndPoint Remote = (EndPoint)(sender);

recv = newsockReceiveFrom(data, ref Remote);

ConsoleWriteLine("Message received from {0}: ", RemoteToString());

ConsoleWriteLine(EncodingASCIIGetString(data, 0, recv));

//客户机连接成功后,发送信息

string welcome = "你好 ! ";

//字符串与字节数组相互转换

data = EncodingASCIIGetBytes(welcome);

//发送信息

newsockSendTo(data, dataLength, SocketFlagsNone, Remote);

while (true)

{

data = new byte[1024];

//发送接收信息

recv = newsockReceiveFrom(data, ref Remote);

ConsoleWriteLine(EncodingASCIIGetString(data, 0, recv));

newsockSendTo(data, recv, SocketFlagsNone, Remote);

}

}

}

}

复制代码

对于接收流入的UDP服务器程序来说,必须将程序与本地系统中指定的UDP端口进行绑定。这就可以通过使用合适的本地IP地址创建一个IPEndPoint对象,以及合适的UDP端口号。上述范例程序中的UDP服务器能够在端口8001从网络上接收任意流入的UDP数据包。

UDP客户机程序与服务器程序非常类似。

因为客户机不需要在指定的UDP端口等待流入的数据,因此,不使用Bind()方法,而是使用在数据发送时系统随机指定的一个UDP端口,而且使用同一个端口接收返回的消息。在开发产品时,要为客户机指定一套UDP端口,以便服务器和客户机程序使用相同的端口号。UDP客户机程序首先定义一个IPEndPoint,UDP服务器将发送数据包到这个IPEndPoint。如果在远程设备上运行UDP服务器程序,在IPEndPoint定义中必须输入适当的IP地址和UDP端口号信息。

客户端代码:

复制代码

using System;

using SystemCollectionsGeneric;

using SystemLinq;

using SystemText;

using SystemNet;

using SystemNetSockets;

namespace UDPClient

{

class Program

{

static void Main(string[] args)

{

byte[] data = new byte[1024];

string input, stringData;

//构建TCP 服务器

ConsoleWriteLine("This is a Client, host name is {0}", DnsGetHostName());

//设置服务IP,设置TCP端口号

IPEndPoint ip = new IPEndPoint(IPAddressParse("127001"), 8001);

//定义网络类型,数据连接类型和网络协议UDP

Socket server = new Socket(AddressFamilyInterNetwork, SocketTypeDgram, ProtocolTypeUdp);

string welcome = "你好! ";

data = EncodingASCIIGetBytes(welcome);

serverSendTo(data, dataLength, SocketFlagsNone, ip);

IPEndPoint sender = new IPEndPoint(IPAddressAny, 0);

EndPoint Remote = (EndPoint)sender;

data = new byte[1024];

//对于不存在的IP地址,加入此行代码后,可以在指定时间内解除阻塞模式限制

int recv = serverReceiveFrom(data, ref Remote);

ConsoleWriteLine("Message received from {0}: ", RemoteToString());

ConsoleWriteLine(EncodingASCIIGetString(data, 0, recv));

while (true)

{

input = ConsoleReadLine();

if (input == "exit")

break;

serverSendTo(EncodingASCIIGetBytes(input), Remote);

data = new byte[1024];

recv = serverReceiveFrom(data, ref Remote);

stringData = EncodingASCIIGetString(data, 0, recv);

ConsoleWriteLine(stringData);

}

ConsoleWriteLine("Stopping Client");

serverClose();

}

}

}

复制代码

上述代码的实现逻辑为:相关设置完成后,服务器端先向客户端发送信息,之后客户端通过键盘发送字符串,服务器端收到后再发送给客户端,如此循环。

42 采用UDPClient类实现

服务器端代码:

复制代码

using System;

using SystemNet;

using SystemNetSockets;

using SystemText;

public class Custom

{

// 设置IP,IPV6

private static readonly IPAddress GroupAddress = IPAddressParse("IP地址");

// 设置端口

private const int GroupPort = 11000;

private static void StartListener()

{

bool done = false;

UdpClient listener = new UdpClient();

IPEndPoint groupEP = new IPEndPoint(GroupAddress, GroupPort);

try

{

//IPV6,组播

listenerJoinMulticastGroup(GroupAddress);

listenerConnect(groupEP);

while (!done)

{

ConsoleWriteLine("Waiting for broadcast");

byte[] bytes = listenerReceive(ref groupEP);

ConsoleWriteLine("Received broadcast from {0} :\n {1}\n", groupEPToString(), EncodingASCIIGetString(bytes, 0, bytesLength));

}

listenerClose();

}

catch (Exception e)

{

ConsoleWriteLine(eToString());

}

}

public static int Main(String[] args)

{

StartListener();

return 0;

}

}

复制代码

客户端代码:

复制代码

using System;

using SystemNet;

using SystemNetSockets;

using SystemText;

public class Client

{

private static IPAddress GroupAddress = IPAddressParse("IP地址");

private static int GroupPort = 11000;

private static void Send(String message)

{

UdpClient sender = new UdpClient();

IPEndPoint groupEP = new IPEndPoint(GroupAddress, GroupPort);

try

{

ConsoleWriteLine("Sending datagram : {0}", message);

byte[] bytes = EncodingASCIIGetBytes(message);

senderSend(bytes, bytesLength, groupEP);

senderClose();

}

catch (Exception e)

{

ConsoleWriteLine(eToString());

}

}

public static int Main(String[] args)

{

Send(args[0]);

return 0;

}

}

复制代码

以上代码需要说明的是:

(1) 上述代码是基于IPV6地址的组播模式。IPv4中的广播(broadcast)可以导致网络性能的下降甚至广播风暴(broadcast storm)。在IPv6中就不存在广播这一概念了,取而代之的是组播(multicast)和任意播(anycast)。

(2) IPV6地址表示方法:

a) X:X:X:X:X:X:X:X(每个X代表16位的16进制数字),不区分大小写;

b) 排头的0可省略,比如09C0就可以写成9C0,0000可以写成0;

c) 连续为0的字段可以以::来代替,但是整个地址中::只能出现一次,比如FF01:0:0:0:0:0:0:1就可以简写成FF01::1。

(3) 如果是采用窗体的形式建议使用这种格式,否则在接收数据时可能会出现死机的现象。

复制代码

// 创建一个子线程

Thread thread = new Thread(

delegate()

{

try

{

//在这里写你的代码

}

catch (Exception )

{

}

}

);

threadStart();

复制代码

UDP的意思是什么 UDP与TCP的区别

udp的意思: 是User Datagram Protocol的简称, 中文名是用户数据包协议,是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP 协议基本上是IP协议与上层协议的接口。它是IETF RFC 768是UDP的正式规范。UDP协议的主要作用是将网络数据流量压缩成数据包的形式。一个典型的数据包就是一个二进制数据的传输单位。

词性 :abbr 用户数据报协议(=User Datagram Protocol)

Uliana Uonuki Ulisso Uzhviy Uliger Uborka Uzurov ugt UGPase uberty

udp的作用:

为了在给定的主机上能识别多个目的地址,同时允许多个应用程序在同一台主机上工作并能独立地进行数据包的发送和接收,设计 用户数据报协议UDP。

使用UDP协议包括: TFTP、 SNMP、NFS、DNS、BOOTP。

UDP使用底层的互联网协议来传送报文,同IP一样提供不可靠的无连接数据包传输服务。它不提供报文到达确认、排序、及流量控制等功能。

UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。比如,我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。例如,在默认状态下,一次“ping” *** 作发送4个数据包(如图2所示)。大家可以看到,发送的数据包数量是4包,收到的也是4包(因为对方主机收到后会发回一个确认收到的数据包)。这充分说明了UDP协议是面向非连接的协议,没有建立连接的过程。正因为UDP协议没有连接的过程,所以它的通信效果高;但也正因为如此,它的可靠性不如TCP协议高。QQ就使用UDP发消息,因此有时会出现收不到消息的情况。

UDP与TCP的区别:

1TCP是面向连接的运输层协议,UDP是无连接的。

2每一条TCP连接只能有两个端点,UDP支持一对一、一对多、多对一和多对多的通信。

3TCP提供可靠交付的服务,UDP使用尽最大努力交付。

4TCP面向字节流,UDP面向报文。

5TCP有拥塞控制,UDP没有拥塞控制。

6TCP首部开销较大最少20个字节,UDP首部开销较小只有8个字节。

TCP与UDP基本区别

1基于连接与无连接

2TCP要求系统资源较多,UDP较少;

3UDP程序结构较简单

4流模式(TCP)与数据报模式(UDP);

5TCP保证数据正确性,UDP可能丢包

6TCP保证数据顺序,UDP不保证

UDP应用场景:

1面向数据报方式

2网络数据大多为短消息

3拥有大量Client

4对数据安全性无特殊要求

5网络负担非常重,但对响应速度要求高

具体编程时的区别

1socket()的参数不同

2UDP Server不需要调用listen和accept

3UDP收发数据用sendto/recvfrom函数

4TCP:地址信息在connect/accept时确定

5UDP:在sendto/recvfrom函数中每次均 需指定地址信息

6UDP:shutdown函数无效

编程区别

通常我们在说到网络编程时默认是指TCP编程,即用前面提到的socket函数创建一个socket用于TCP通讯,函数参数我们通常填为SOCK_STREAM。即socket(PF_INET, SOCK_STREAM, 0),这表示建立一个socket用于流式网络通讯。

SOCK_STREAM这种的特点是面向连接的,即每次收发数据之前必须通过connect建立连接,也是双向的,即任何一方都可以收发数据,协议本身提供了一些保障机制保证它是可靠的、有序的,即每个包按照发送的顺序到达接收方。

而SOCK_DGRAM这种是User Datagram Protocol协议的网络通讯,它是无连接的,不可靠的,因为通讯双方发送数据后不知道对方是否已经收到数据,是否正常收到数据。任何一方建立一个socket以后就可以用sendto发送数据,也可以用recvfrom接收数据。根本不关心对方是否存在,是否发送了数据。它的特点是通讯速度比较快。大家都知道TCP是要经过三次握手的,而UDP没有。

基于上述不同,UDP和TCP编程步骤也有些不同,如下:

TCP:

TCP编程的服务器端一般步骤是:

1、创建一个socket,用函数socket();

2、设置socket属性,用函数setsockopt(); 可选

3、绑定IP地址、端口等信息到socket上,用函数bind();

4、开启监听,用函数listen();

5、接收客户端上来的连接,用函数accept();

6、收发数据,用函数send()和recv(),或者read()和write();

7、关闭网络连接;

8、关闭监听;

TCP编程的客户端一般步骤是:

1、创建一个socket,用函数socket();

2、设置socket属性,用函数setsockopt(); 可选

3、绑定IP地址、端口等信息到socket上,用函数bind(); 可选

4、设置要连接的对方的IP地址和端口等属性;

5、连接服务器,用函数connect();

6、收发数据,用函数send()和recv(),或者read()和write();

7、关闭网络连接;

UDP:

与之对应的UDP编程步骤要简单许多,分别如下:

UDP编程的服务器端一般步骤是:

1、创建一个socket,用函数socket();

2、设置socket属性,用函数setsockopt(); 可选

3、绑定IP地址、端口等信息到socket上,用函数bind();

4、循环接收数据,用函数recvfrom();

5、关闭网络连接;

UDP编程的客户端一般步骤是:

1、创建一个socket,用函数socket();

2、设置socket属性,用函数setsockopt(); 可选

3、绑定IP地址、端口等信息到socket上,用函数bind(); 可选

4、设置对方的IP地址和端口等属性;

5、发送数据,用函数sendto();

6、关闭网络连接;

TCP和UDP是OSI模型中的运输层中的协议。TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。

UDP补充:

UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。并且它是将应用程序发来的数据在收到的那一刻,立刻按照原样发送到网络上的一种机制。即使是出现网络拥堵的情况下,UDP也无法进行流量控制等避免网络拥塞的行为。此外,传输途中如果出现了丢包,UDO也不负责重发。甚至当出现包的到达顺序乱掉时也没有纠正的功能。如果需要这些细节控制,那么不得不交给由采用UDO的应用程序去处理。换句话说,UDP将部分控制转移到应用程序去处理,自己却只提供作为传输层协议的最基本功能。UDP有点类似于用户说什么听什么的机制,但是需要用户充分考虑好上层协议类型并制作相应的应用程序。、

传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的运输层通信协议,通常由IETF的RFC 793说明。在简化的计算机网络OSI模型中,它完成运输层所指定的功能。

与 TCP 不同, UDP 并不提供对 IP 协议的可靠机制、流控制以及错误恢复功能等。由于 UDP 比较简单, UDP 头包含很少的字节,比 TCP 负载消耗少。

UDP 适用于不需要 TCP 可靠机制的情形,比如,当高层协议或应用程序提供错误和流控制功能的时候。 UDP 是传输层协议,服务于很多知名应用层协议,包括网络文件系统(NFS)、简单网络管理协议(SNMP)、域名系统(DNS)以及简单文件传输系统(TFTP)。

TCP补充:

TCP充分实现了数据传输时各种控制功能,可以进行丢包的重发控制,还可以对次序乱掉的分包进行顺序控制。而这些在UDP中都没有。此外,TCP作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。TCP通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。

TCP与UDP区别总结:

1UDP速度比TCP快

2UDP有消息边界

3UDP可以一对多传输

4UDP可靠性不如TCP

5UDP不像TCP那样能保证有序传输

UDP速度比TCP快

由于UDP不需要先与对方建立连接,也不需要传输确认,因此其数据传输速度比TCP快得多。

UDP有消息边界

使用UDP不需要考虑消息边界问题,使用上比TCP简单

UDP可以一对多传输

利用UDP可以使用广播或组播的方式同时向子网上的所有客户发送信息。这一点也比TCP方便。

UDP可靠性不如TCP

与TCP不同,UDP并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示。因此,通常人们把UDP称为不可靠的传输协议。

UDP不像TCP那样能保证有序传输

UDP不能确保数据的发送和接收顺序。对于突发性的数据报,有可能会乱序。事实上,UDP的这种乱序性基本上很少出现,通常只会在网络非常拥挤的情况下才有可能发生。

1、UDP

UDP(User Datagram Protocol,用户数据报协议)不提供复杂的控制机制,利用IP提供面向无连接的通信服务。它是将应用程序发来的数据在收到的那一刻,立即按照原样发送到网络上的一种机制。

UDP的特点

UDP是一个非连接的协议,传输数据之前,源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段;由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息;UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小;UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表(有许多参数);UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。

2、TCP

TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也可是说是对“传输、发送、通信”进行“控制”的协议。

TCP作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。且TCP实现了数据传输时各种控制功能,可以进行丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。TCP通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。

TCP与UDP的区别

TCP面向连接(如打电话要先拨号建立连接)。UDP是无连接的,即发送数据之前不需要建立连接;TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达。UDP尽最大努力交付,即不保证可靠交付;TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流。UDP是面向报文的;每一条TCP连接只能是点到点的。UDP支持一对一、一对多、多对一和多对多的交互通信;对系统资源的要求TCP较多,UDP少。TCP首部开销20字节,UDP的首部开销小,只有8个字节;TCP的逻辑通信信道是全双工的可靠信道。UDP则是不可靠信道。

TCP建立连接的3次握手过程

主机A通过向主机B发送一个含有同步序列号的标志位的数据段给主机B,向主机B请求建立连接,通过这个数据段,主机A告诉主机B两件事:我想要和你通信;你可以用哪个序列号作为起始数据段来回应我;主机B收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事:我已经收到你的请求了,你可以传输数据了;你要用哪个序列号作为起始数据段来回应我;主机A收到这个数据段后,再发送一个确认应答,确认已收到主机B的数据段:“我已收到回复,我现在要开始传输实际数据了”。

这样3次握手就完成了,主机A和主机B就可以传输数据了。

TCP断开连接的4次确认

当主机A完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求;主机B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1;由B端再提出反方向的关闭请求,将FIN置1;主机A对主机B的请求进行确认,将ACK置1,双方向的关闭结束。

由TCP的3次握手和4次断开确认可以看出,TCP使用面向连接的通信方式,大大提高了数据通信的可靠性,使发送数据端和接收端在数据正式传输前就有了交互,为数据正式传输打下了可靠的基础。

我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。

本文介绍了网络通讯中通用的传输控制协议(TCP)和用户数据包协议(UDP) 并 且利用Java语言设计了一个简单的基于UDP 数据广播的局域网络会议程序 展示了 在Java语言中进行UDP 数据发送和接收的一般步骤 由于Java语言卓越的跨平台特 性 本系统能够不加修改的运行在Windows Linux Mac OS等一系列不同平台上 介绍随着网络技术的普及 网络会议在公司 企业和单位中的应用也越来越广 一 个网络会议系统通常包括一个服务器程序和一个客户端程序 其中服务器端负责进 行用户管理 信息交互以及表决统计 客户端则实现收听发言 公开发言 私下讨 论 投票表决等功能 在一个网络会议系统的设计和实现中 通常涉及到图形用户 界面设计 TCP/IP连接 UDP 数据广播 多线程等一系列技术 本文通过一个简单 示例程序 展示了在Java语言中进行UDP 数据发送和接收的一般步骤以及UDP 数据 广播在局域网络会议系统中的作用 TCP (Tran ission Control Protocol 传输控制协议) 是一种基于连接的通 讯协议 当两台计算机之间需要进行可靠的数据传输时 它们通过网络建立起一个 稳定的连接 这种连接通常也被称为数据链 与电话网络相类似 这种数据链是点 对点的 通讯的双方则通过这条数据链来回传输数据 在这条稳定的数据链的基础 上 TCP 协议通过信息校验能够保证接收方所接收到的数据和发送方所发送的数据 在内容和顺序上是完全一致的 从而实现了数据的可靠传输 UDP (User Datagram Protocol 用户数据包协议)与TCP 协议之间的不同在于 UDP 不是一种基于稳定连接的通讯协议 UDP 协议将独立的数据包从一台计算机传 输到另外一台计算机 但是并不保证接受方能够接收到该数据包 也不保证接收方 所接收到的数据和发送方所发送的数据在内容和顺序上是完全一致的 因此 UDP 协议更类似于普通邮政服务 寄信人不能够保证所寄出去的信能够被收信人及时收 到 后发出的信也许会比先发出的信更早到达 对于很多应用程序来说 在互相通讯的两台计算机之间保证一个可靠与稳定的 数据链是至关重要的 在这种情况下 就应该首先考虑使用TCP 协议在凉台计算机 之间建立起TCP/IP连接 在>

以上就是关于用C#如何将两个界面程序连接到一个服务器上并可以实时通信全部的内容,包括:用C#如何将两个界面程序连接到一个服务器上并可以实时通信、UDP的意思是什么 UDP与TCP的区别、TCP和UDP中怎么加入多线程、多进程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10102186.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存