【网络编程】——UDP和TCP通信方式 缺乏、安全感 2022-06-16 11:26 220阅读 0赞 公司有计划打算做消息推送,自己也是闲着没事稍微了解一下,从基础开始学习以便真正使用的时候不用太过紧张吧。消息推送在各种应用非常的常见,这是网络编程的一种,还是从根本上开始了解吧。 # 一、IP和端口号 # 网络中的计算机能够进行通信,必须为每台计算机指定一个标识号,通过这个标识号来指定接收数据的计算机或者发送数据的计算机。这个标识号就是IP地址,唯一标识计算机,IP地址现在广泛使用版本是IPv4。一张图说明IP地址和端口号的作用。 ![Center][] # 二、InteAddress # JDK中提供一个类InteAddress,该类封装了IP地址,提供与IP地址相关的方法。 <table> <tbody> <tr> <td> <p><span style="font-family:KaiTi_GB2312; font-size:18px">方法声明</span></p> </td> <td> <p><span style="font-family:KaiTi_GB2312; font-size:18px">功能描述</span></p> </td> </tr> <tr> <td> <p><span style="font-family:KaiTi_GB2312; font-size:18px">InetAddress getByName(String host)</span></p> </td> <td> <p><span style="font-family:KaiTi_GB2312; font-size:18px">参数host代表指定主机,给定主机的主机名,确定主机IP</span></p> </td> </tr> <tr> <td> <p><span style="font-family:KaiTi_GB2312; font-size:18px">InetAddress getLocalhost()</span></p> </td> <td> <p><span style="font-family:KaiTi_GB2312; font-size:18px">创建一个本地主机的InetAddress对象</span></p> </td> </tr> <tr> <td> <p><span style="font-family:KaiTi_GB2312; font-size:18px">String getHostName()</span></p> </td> <td> <p><span style="font-family:KaiTi_GB2312; font-size:18px">得到IP地址对于的主机名,若是本机则是计算机名,不是则是域名,没有域名则是IP地址</span></p> </td> </tr> <tr> <td> <p><span style="font-family:KaiTi_GB2312; font-size:18px">boolean isReachable(int timeout)</span></p> </td> <td> <p><span style="font-family:KaiTi_GB2312; font-size:18px">判断指定时间内地址能否到达</span></p> </td> </tr> <tr> <td> <p><span style="font-family:KaiTi_GB2312; font-size:18px">String getHostAddress()</span></p> </td> <td> <p><span style="font-family:KaiTi_GB2312; font-size:18px">得到字符串格式的IP地址</span></p> </td> </tr> </tbody> </table> 用demo说明上述方法 package test; import java.net.InetAddress; public class InetAddressDemo { /** * @Title: main * @Description: InetAddress的常用方法 * @author 贾文静 * @param args * @throws Exception * @throws * @date:2017-5-16.上午9:04:36 */ public static void main(String[] args) throws Exception { // 创建表示本机的InetAddress对象 InetAddress localAddress = InetAddress.getLocalHost(); // 在给定主机名的前提下创建InetAddress对象 InetAddress remoteAddress = InetAddress.getByName("www.baidu.com"); // 获取PC的ip地址 System.out.println("本机的IP地址:" + localAddress.getHostAddress()); // 根据主机名创建的InetAddress获取IP地址 System.out.println("baidu的IP地址:" + remoteAddress.getHostAddress()); // 判断本机在指定时间中能否到底目标主机,demo演示3秒钟本机能否到百度的地址 System.out.println("3秒是否可达:" + remoteAddress.isReachable(3000)); // 得到IP地址的主机名 System.out.println("baidu的主机名:" + remoteAddress.getHostName()); // 获取本地的主机名 System.out.println("本机的主机名:" + localAddress.getHostName()); } } 运行显示: ![Center 1][] # 三、通信 # 通信协议有两种UDP和TCP,从简单的程度来说UDP发送端和接收端不需要建立逻辑连接,一次发送就可以解决。而TCP需要“三次握手”才能完成。所以这两种方式的通信过程是不同的。 ## 1、UDP ## 发送过程需要两个类DatagramPacket和DatagramSocket。 DatagramPacket类似于物流中心两个站点发送的货物,发送的货物一般都在装载到集装箱中。而UDP中发送和接收的数据也需要一个集装箱进行打包,DatagramPacket就承担了这项任务,对数据进行装载。有了集装箱还有需要有站点来接收货物,DatagramSocket就类似于站点接收“集装箱”。 接收端 package test; import java.net.DatagramPacket; import java.net.DatagramSocket; public class DatagramPacketServer { /** * @Title: main * @Description: UDP接收端Demo * @author 贾文静 * @param args * @throws Exception * @throws * @date:2017-5-16.上午9:51:30 */ public static void main(String[] args) throws Exception { // 用于存放接收的数据 byte[] buf = new byte[1024]; // DatagramSocket类似于码头,接收DatagramPacket的数据包 // 定义一个datagramsocket对象,端口号为8954 DatagramSocket ds = new DatagramSocket(8954); // DatagramPacket类似于集装箱,封箱发送端和接收端的数据 // 指定了封装数据字节数组和数据的大小 DatagramPacket dp = new DatagramPacket(buf, 1024); System.out.println("等待接收数据"); // 接收发送端的数据,如果没有则进入堵塞状态 ds.receive(dp); // 获取发送数据的具体内容,长度,获取发送的IP地址字符串格式的ip地址,以及端口号 String str = new String(dp.getData(), 0, dp.getLength()) + "from" + dp.getAddress().getHostAddress() + ":" + dp.getPort(); // 打印获取到的内容 System.out.println(str); // 释放资源 ds.close(); } } 展示一下什么叫做进入堵塞状态,就是在发送端还没有传递数据的时候即发送端没有运行的时候: ![Center 2][] 发送端: package test; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /** * @ClassName: DatagramPacketClient * @Description: 发送端展示 * @author 贾文静 * @date 2017-5-16 上午9:52:02 * */ public class DatagramPacketClient { public static void main(String[] args) throws Exception { // 创建一个datagramsocket对象,指定端口为3000,如果不指定,在运行期间端口随意分配 DatagramSocket ds = new DatagramSocket(3000); // 要发送的数据 String str = "hello world"; // 创建一个要发送的数据包,包括发送数据,数据长度,接收端ip地址以及端口号 DatagramPacket dp = new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName("jiawenjing"), 8954); System.out.println("发送信息"); // 发送数据 ds.send(dp); // 释放资源 ds.close(); } } 此时运行发送端之后再看接收端的显示内容。 ![Center 3][] ## 2、TCP ## TCP和UDP一样都是两台计算机之间的通信,通信端都需要创建Socket对象,区别在于UDP只需要发送端和接收端,不区分客户端和服务端,计算机之间可以任意发送数据。而TCP通信严格区分客户端和服务端,必须由客户端首先去连接服务端才能实现通信。服务端不能主动连接客户端,而且服务端程序需要事先启动,等待客户端连接。 JDK中提供Socket类表示客户端,ServerSocket表示服务端。首先创建一个ServerSocket对象,相当于开启一个线程,等待客户端连接。客户端创建一个Socket对象发送请求连接。 服务端: import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class TcpServer { public static void main(String[] args) throws Exception { // 创建TCPServer对象,调用listen()方法 new TcpServer().listen(); } // 创建一个通信端口 private static final int PORT = 7788; public void listen() throws Exception { // 创建ServerSocket对象,并且指定了端口号 ServerSocket serverSocket = new ServerSocket(PORT); // 调用ServerSocket对象的accept()方法接收数据 Socket client = serverSocket.accept(); // 获取客户端的输出流 OutputStream os = client.getOutputStream(); System.out.println("开始与客户端交换数据"); //输出到客户端 os.write(("欢迎你来访").getBytes()); // 模拟执行其他功能占用的时间 Thread.sleep(5000); System.out.println("结束与客户端交互数据"); os.close(); client.close(); } } 客户端: import java.io.InputStream; import java.net.InetAddress; import java.net.Socket; public class TcpSocket { public static void main(String[] args) throws Exception { // 创建TCPSocket连接,客户端去连接数据 new TcpSocket().connect(); } // 创建通信端口与要连接的服务端一致 private static final int PORT = 7788; public void connect() throws Exception { // 创建Socket对象,连接到给出地址以及端口号 Socket client = new Socket(InetAddress.getLocalHost(), PORT); // 得到接收数据的流 InputStream is = client.getInputStream(); // 定义1024个字节数组的缓冲区 byte[] buf = new byte[1024]; // 将数据读到缓冲区中 int len = is.read(buf); // 将缓冲区中的数据输出 System.out.println(new String(buf, 0, len)); // 关闭socket对象,释放资源 client.close(); } } ![Center 4][] # 总结 # IP和端口是网络编程开始的前提,对常用方法个人认为必须有个很好的认知。网络编程涉及到UDP和TCP通信的几个类,还有相关的方法具体还需要多多练习使用。 [Center]: /images/20220616/b1a8c7e1aba1434bb52ea8b4abd9fdbd.png [Center 1]: /images/20220616/ef364a0394ab45498f1301f30950c143.png [Center 2]: /images/20220616/27f5b83097c541daa2c5cadbf77c5942.png [Center 3]: /images/20220616/45ae672983804938b62dacb54156b937.png [Center 4]: /images/20220616/557bfb66c5ee458586ba58f1c1904464.png
相关 网络编程:TCP/UDP通信问题解析 在计算机科学中,TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是两种主要的互联网通信协议。 1. 我不是女神ヾ/ 2024年09月19日 17:39/ 0 赞/ 1 阅读
相关 Java网络编程问题:TCP和UDP通信示例对比 在Java中,TCP(传输控制协议)是一种面向连接的、可靠的传输层协议。而UDP(用户数据报协议)则是一种无连接的、不可靠的数据报传输层协议。 以下是两种协议的基本通信示例: 叁歲伎倆/ 2024年09月11日 12:27/ 0 赞/ 24 阅读
相关 Java网络编程:TCP和UDP通信的差异 在Java网络编程中,TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是两种主要的通信协议。 1. 电玩女神/ 2024年09月10日 21:51/ 0 赞/ 21 阅读
相关 【网络编程】——UDP和TCP通信方式 公司有计划打算做消息推送,自己也是闲着没事稍微了解一下,从基础开始学习以便真正使用的时候不用太过紧张吧。消息推送在各种应用非常的常见,这是网络编程的一种,还是从根本上开 缺乏、安全感/ 2022年06月16日 11:26/ 0 赞/ 221 阅读
相关 Java网络编程(基于TCP和UDP的通信实现) 简单说一些常见的协议所属的OIS层: 应用层:远程登录协议Telnet、文件传输协议FTP,超文本传输协议HTTP,域名服务DNS,简单邮件传输协议SMTP,邮局协议POP 墨蓝/ 2022年06月01日 06:15/ 0 赞/ 159 阅读
相关 网络通信协议、UDP与TCP协议、UDP通信、TCP通信 计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则。在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传 妖狐艹你老母/ 2021年12月21日 00:47/ 0 赞/ 383 阅读
相关 网络通信协议、UDP与TCP协议、UDP通信、TCP通信 计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则。在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传 约定不等于承诺〃/ 2021年12月20日 15:29/ 0 赞/ 435 阅读
相关 Linux网络编程——TCP和UDP通信 TCP协议流程图、TCP建立即时聊天 TCP即时聊天升级:服务器在客户端断开后不断开,客户端可以多次重连服务器进行即时聊天 UDP协议流程图、UDP建立即时连 亦凉/ 2021年12月04日 06:43/ 0 赞/ 305 阅读
还没有评论,来说两句吧...