Java网络编程_TCP编程以及UDP编程

      最后更新:2022-07-18 15:13:23 手机定位技术交流文章

      首先理清一个概念: 网络编程 不等于网站编程,网络编程即使用套接字来达到进程间通信,现在一般称为 TCP/IP编程

      计算机网络

      计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

      1. TCP

      传输控制协议(Transmission Control Protocol)。
      TCP是一种面向连接的通信协议,它在传输数据之前建立发送者与接收者之间的逻辑连接,然后再传输数据。它提供了两个计算机之间的可靠和无误的数据传输。
      在TCP连接中,客户端和服务器必须清楚地标识,客户端向服务器发送连接请求,每个连接创建需要“三个手”。

      2. UDP
      用户数据报协议(User Datagram Protocol)。
      数据报(Datagram):网络传输的基本单位
      UDP是一个不连接的通信协议,即在数据传输时,数据的发送者和接收者不建立逻辑连接.简单来说,当一个计算机向另一个发送数据时,发送者不会确认接收者的存在,就会发出数据,当同一接收器接收数据时,无论数据是否收到,它将无法返回发送器。
      由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。
      然而,当使用UDP协议传输数据时,由于UDP不面向连接,不能保证数据的完整性,因此在传输重要数据时,不建议使用UDP协议。
      特点: 数据仅限于64kb,不能超过此限度.

      TCP编程

      首先我们先要了解什么是 Socket ?Socket是一个抽象概念,一个应用程序通过一个Socket来建立一个远程连接,而Socket内部通过TCP/IP协议把数据传输到网络。

      服务器端

      客户端

      当接口连接成功创建时,无论是服务器端,还是客户端,我们都使用索克特的例子来在线交流。因为TCP是一个基于流程的协议,因此,Java标准库使用InputStream和OutputStream来封装索克数据流,所以我们使用插座电流,和普通IO流类似:

      为了写网络数据,你必须打电话flush()方法。如果不调用flush(),我们很可能会发现,客户端和服务器不接收数据,这不是Java标准库设计问题,相反,当我们把数据写成流形时,这不是直接向网络发送的只写信,相反,先写到内存缓冲器上,直到缓冲区填满,只有一次才能真正发送到网络上,该设计的目的是提高传输效率。如果缓冲区数据小,我们还想强迫这些数据发送到网络上,就必须调用flush()迫使缓冲数据发送出去。

      案例:基于TCP编程的聊天实现

      服务端:

      客户端:

      UDP编程(与TCP编程相比,UDP编程要简单得多,因为UDP不创建连接,包是一对一,所以没有流程概念。

      JAVA中的UDP API类:

      1.InetAddress:用于描述和包装互联网IP地址

      方法名 返回值
      getLocalhost() 返回本地地址包装的实例
      getAllByName(String host) 返回一组InetAddress实例以将主机地址封入
      getByName(String host) 返回一个包装的主机地址的例子。 主机可以是一个域名或合法的IP地址。
      InetAddress.getByAddress(addr) 返回基于地址字符串的InetAddress实例

      2.DatagramSocket:接收和发送UDP的索克例。

      DatagramSocket()
      通常用于客户端编程,它没有特定的监视端口,只使用临时的。 该程序将可用的端口分配给操作系统
      DatagramSocket(int port) 创建一个实例并修正端口端口的报告。 通常在服务结束时使用
      DatagramSocket(int port, InetAddress localAddr) 这是一个非常有用的建模器,因为当机器有多个IP地址时,它创建的实例只能从LocalAddr接收消息。
      receive(DatagramPacket d) 接收数据报文到d中。receive方法产生一个“阻塞”。“阻塞”是一个专业名词,它会产生一个内部循环,使程序暂停在这个地方,直到一个条件触发。
      send(DatagramPacket dp) 发送dp消息到目的地
      setSoTimeout(int timeout) 将加班时间单位设置为毫秒。
      close() 应用程序退出的时候,通常会主动释放资源,关闭Socket,但是由于异常地退出可能造成资源无法回收。所以,应该在程序完成时,主动使用此方法关闭Socket,或在捕获到异常抛出后关闭Socket。

      3.DatagramPacket:用于处理消息,它将数据如字节集、目标地址、目标端口等包入消息中,或者将消息切入字节集。

      DatagramPacket(byte[] buf, int length) 在包中插入长度数据到Buf阵列中,通常用于接收由客户端发送的数据
      DatagramPacket(byte[] buf, int offset, int length) 将数据包中从Offset开始、Length长的数据装进Buf数组
      DatagramPacket(byte[] buf, int length, InetAddress clientAddress, int clientPort) 从Buf阵列中,长度长度数据被用来创建一个包对象,目标是 clientAddress地址, clientPort端口,通常用于发送数据给客户端。
      DatagramPacket(byte[] buf, int offset, int length, InetAddress clientAddress, int clientPort) 从Buf数组中,取出Offset开始的、Length长的数据创建数据包对象,目标是clientAddress地 址,clientPort端口,通常用来发送数据给客户端。
      getData() 从实例中获取消息的字节组编码。
      setDate(byte[] buf) 将一组字节插入到发送的邮件中。

      服务器端

      客户端

      当创建DatagramSocket实例时,客户端不需要指定端口,未使用端口由操作系统自动指定。紧接着,调用setSoTimeout(100)来设置1秒超时,这意味着当UDP包随后收到时,等待时间不得超过一秒。否则,如果未收到UDP包,客户将无限期等待.这与服务器端不同,服务器端可以无限期等待,因为它最初被设计为在生长期间运行。注意,客户端的DatagramSocket还调用Connect()方法来“连接”指定的服务器端。UDP不是未连接的协议吗?你为什么要在这里联系?这个连接()方法不是真正的连接,它旨在在客户端的DatagramSocket实例中存储服务器端的IP和端口号码,确保此DatagramSocket实例只发送UDP包到指定地址和端口,不能发送到其他地址和端口。这不是UDP的限制,相反,Java有内置的安全检查。如果客户端想向两个不同的服务器发送UDP包,然后它必须创建两个DatagramSocket实例。随后的输入和输出数据与服务器端一致。通常来说,客户端必须先发送UDP包,因为客户端不发布UDP包,服务器根本不知道客户端的地址和端口号码。如客户认为该通讯应终止,你可以调用 disconnect()来切断连接。注: disconnect()不是真正的切断,它简单地清除在客户端Datagram Socket实例中记录的远程服务器地址和端口号码。DatagramSocket实例可以连接到另一个服务器端。

      案例实现

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/30005.html

          热门文章

          文章分类