ToB企服应用市场:ToB评测及商务社交产业平台

标题: Java网络编程 [打印本页]

作者: 天空闲话    时间: 2024-6-21 14:51
标题: Java网络编程
1. 常见的软件架构

1.1 CS布局

常见的CS布局的软件有QQ、微信、Steam等

1.2 BS架构


2. 网络编程三要素


3.InetAddress利用

InetAddress 是 Java 中用于表示 IP 地点的类,位于 java.net 包中。它可以表示一个 IP 地点(IPv4 或 IPv6),并提供用于解析主机名的静态方法。以下是 InetAddress 类的详细介绍及其常用方法:
InetAddress 类的根本概念

  1. import java.net.InetAddress;
  2. import java.net.UnknownHostException;
  3. public class InetAddressStudy {
  4.     public static void main(String[] args) throws UnknownHostException {
  5.         // 获取本地主机地址
  6.         InetAddress localHost = InetAddress.getLocalHost();
  7.         System.out.println("Local host: " + localHost.getHostName() + " (" + localHost.getHostAddress() + ")");
  8.         // 根据主机名获取 InetAddress 对象
  9.         InetAddress address = InetAddress.getByName("www.baidu.com");
  10.         System.out.println("Host: " + address.getHostName() + ", IP Address: " + address.getHostAddress());
  11.         // 根据主机名获取所有关联的 InetAddress 对象
  12.         InetAddress[] addresses = InetAddress.getAllByName("www.baidu.com");
  13.         for (InetAddress addr : addresses) {
  14.             System.out.println("Host: " + addr.getHostName() + ", IP Address: " + addr.getHostAddress());
  15.         }
  16.         // 获取本地回环地址
  17.         InetAddress loopbackAddress = InetAddress.getLoopbackAddress();
  18.         System.out.println("Loopback Address: " + loopbackAddress.getHostAddress());
  19.         // 判断地址是否为多播地址
  20.         boolean isMulticast = address.isMulticastAddress();
  21.         System.out.println("Is multicast address: " + isMulticast);
  22.     }
  23. }
  24. 结果:
  25. Local host: fanzhendembp-2 (192.168.1.4)
  26. Host: www.baidu.com, IP Address: 39.156.66.14
  27. Host: www.baidu.com, IP Address: 39.156.66.14
  28. Host: www.baidu.com, IP Address: 39.156.66.18
  29. Host: www.baidu.com, IP Address: 2409:8c00:6c21:104f:0:ff:b03f:3ae
  30. Host: www.baidu.com, IP Address: 2409:8c00:6c21:1051:0:ff:b0af:279a
  31. Loopback Address: 127.0.0.1
  32. Is multicast address: false
复制代码
4. 端标语


端口(Port)是计算机网络中的一个重要概念,用于标识传输层协议(如 TCP 或 UDP)所利用的通信端点。端标语是一个 16 位的数字,范围从 0 到 65535,每个端标语代表一个特定的网络服务或应用程序。以下是关于端口的详细介绍:
端口的根本概念
端口的分类
端口的作用
端口用于在同一台计算机上区分多个网络服务。例如,一台服务器可以同时运行 Web 服务(HTTP,80 端口)和邮件服务(SMTP,25 端口),客户端可以通过差别的端标语连接到相应的服务。
端口的工作原理
当一个程序必要通过网络进行通信时,它会绑定到一个特定的端标语并监听来自其他计算机的连接请求。以下是一个简单的例子:
5. 协议


5.1 UDP协议


UDP(用户数据报协议,User Datagram Protocol)是一种面向无连接的传输层协议,属于TCP/IP协议族中的一个重要组成部分。UDP提供了一种简单但不可靠的服务,主要用于对速度和效率要求高,而对数据传输的正确性和可靠性要求相对较低的应用场景。
主要特点
应用场景
优缺点
长处:

缺点:

5.1.1 代码演示

  1. import java.io.IOException;
  2. import java.net.*;
  3. public class SendMessageDemo {
  4.     public static void main(String[] args) throws IOException {
  5.         //发送数据
  6.         //1.创建DatagramSocket对象(快递公司)
  7.         //细节:
  8.         //绑定端口,以后我们就是通过这个端口往外发送
  9.         //空参:所有可用的端口中随机一个进行使用
  10.         //有参:指定端口号进行绑定
  11.         DatagramSocket ds = new DatagramSocket();
  12.         //2.打包数据
  13.         String str = "你好威啊!!!";
  14.         byte[] bytes = str.getBytes();
  15.         InetAddress address = InetAddress.getByName("127.0.0.1");
  16.         int port = 10086;
  17.         DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
  18.         //3.发送数据
  19.         ds.send(dp);
  20.         //4.释放资源
  21.         ds.close();
  22.     }
  23. }
复制代码
  1. import java.io.IOException;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. import java.net.InetAddress;
  5. public class ReceiveMessageDemo {
  6.     public static void main(String[] args) throws IOException {
  7.         //接收数据
  8.         //1.创建DatagramSocket对象(快递公司)
  9.         //细节:
  10.         //在接收的时候,一定要绑定端口
  11.         //而且绑定的端口一定要跟发送的端口保持一致
  12.         DatagramSocket ds = new DatagramSocket(10086);
  13.         //2.接收数据包
  14.         byte[] bytes = new byte[1024];
  15.         DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
  16.         //该方法是阻塞的
  17.         //程序执行到这一步的时候,会在这里死等
  18.         //等发送端发送消息
  19.         System.out.println(11111);
  20.         ds.receive(dp);
  21.         System.out.println(2222);
  22.         //3.解析数据包
  23.         byte[] data = dp.getData();
  24.         int len = dp.getLength();
  25.         InetAddress address = dp.getAddress();
  26.         int port = dp.getPort();
  27.         System.out.println("接收到数据" + new String(data,0,len));
  28.         System.out.println("该数据是从" + address + "这台电脑中的" + port + "这个端口发出的");
  29.         //4.释放资源
  30.         ds.close();
  31.     }
  32. }
复制代码
5.2 UDP的三种通信方式

单播、组播、广播
5.2.1 单播


5.2.2 组播

组播地点:224.0.0.0 ~ 239.255.255.255
此中 224.0.0.0. ~ 224.0.0.255 为预留的组播地点

  1. 组播发送端代码
  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.InetAddress;
  5. import java.net.MulticastSocket;
  6. public class SendMessageDemo {
  7.     public static void main(String[] args) throws IOException {
  8.          /*
  9.             组播发送端代码
  10.         */
  11.         //创建MulticastSocket对象
  12.         MulticastSocket ms = new MulticastSocket() ;
  13.         // 创建DatagramPacket对象
  14.         String s = "你好,你好!" ;
  15.         byte[] bytes = s.getBytes();
  16.         InetAddress address = InetAddress.getByName("224.0.0.1");
  17.         int port = 10000;
  18.         DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, address, port) ;
  19.         // 调用MulticastSocket发送数据方法发送数据
  20.         ms.send(datagramPacket);
  21.         // 释放资源
  22.         ms.close();
  23.     }
  24. }
复制代码
  1. 接收端1
  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.InetAddress;
  5. import java.net.MulticastSocket;
  6. public class ReceiveMessageDemo1 {
  7.     public static void main(String[] args) throws IOException {
  8.         /*
  9.             组播接收端代码
  10.         */
  11.         //1. 创建MulticastSocket对象
  12.         MulticastSocket ms = new MulticastSocket(10000);
  13.         //2. 将将当前本机,添加到224.0.0.1的这一组当中
  14.         InetAddress address = InetAddress.getByName("224.0.0.1");
  15.         ms.joinGroup(address);
  16.         //3. 创建DatagramPacket数据包对象
  17.         byte[] bytes = new byte[1024];
  18.         DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
  19.         //4. 接收数据
  20.         ms.receive(dp);
  21.         //5. 解析数据
  22.         byte[] data = dp.getData();
  23.         int len = dp.getLength();
  24.         String ip = dp.getAddress().getHostAddress();
  25.         String name = dp.getAddress().getHostName();
  26.         System.out.println("ip为:" + ip + ",主机名为:" + name + "的人,发送了数据:" + new String(data,0,len));
  27.         //6. 释放资源
  28.         ms.close();
  29.     }
  30. }
复制代码
  1. 接收端2
  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.InetAddress;
  5. import java.net.MulticastSocket;
  6. public class ReceiveMessageDemo2 {
  7.     public static void main(String[] args) throws IOException {
  8.         /*
  9.             组播接收端代码
  10.         */
  11.         //1. 创建MulticastSocket对象
  12.         MulticastSocket ms = new MulticastSocket(10000);
  13.         //2. 将将当前本机,添加到224.0.0.1的这一组当中
  14.         InetAddress address = InetAddress.getByName("224.0.0.1");
  15.         ms.joinGroup(address);
  16.         //3. 创建DatagramPacket数据包对象
  17.         byte[] bytes = new byte[1024];
  18.         DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
  19.         //4. 接收数据
  20.         ms.receive(dp);
  21.         //5. 解析数据
  22.         byte[] data = dp.getData();
  23.         int len = dp.getLength();
  24.         String ip = dp.getAddress().getHostAddress();
  25.         String name = dp.getAddress().getHostName();
  26.         System.out.println("ip为:" + ip + ",主机名为:" + name + "的人,发送了数据:" + new String(data,0,len));
  27.         //6. 释放资源
  28.         ms.close();
  29.     }
  30. }
复制代码
  1. 接收端3
  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.InetAddress;
  5. import java.net.MulticastSocket;
  6. public class ReceiveMessageDemo3 {
  7.     public static void main(String[] args) throws IOException {
  8.         /*
  9.             组播接收端代码
  10.         */
  11.         //1. 创建MulticastSocket对象
  12.         MulticastSocket ms = new MulticastSocket(10000);
  13.         //2. 将将当前本机,添加到224.0.0.1的这一组当中
  14.         InetAddress address = InetAddress.getByName("224.0.0.1");
  15.         ms.joinGroup(address);
  16.         //3. 创建DatagramPacket数据包对象
  17.         byte[] bytes = new byte[1024];
  18.         DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
  19.         //4. 接收数据
  20.         ms.receive(dp);
  21.         //5. 解析数据
  22.         byte[] data = dp.getData();
  23.         int len = dp.getLength();
  24.         String ip = dp.getAddress().getHostAddress();
  25.         String name = dp.getAddress().getHostName();
  26.         System.out.println("ip为:" + ip + ",主机名为:" + name + "的人,发送了数据:" + new String(data,0,len));
  27.         //6. 释放资源
  28.         ms.close();
  29.     }
  30. }
复制代码
5.2.3 广播

广播地点255.255.255.255

只必要修改为255.255.255.255

5.3 TCP通信


TCP(传输控制协议,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的通信协议,它是Internet协议栈中的核心协议之一。TCP提供了可靠的数据传输、流量控制和拥塞控制等功能,广泛用于网络应用,如HTTP、FTP、SMTP等。
5.3.1 TCP的根本特性


5.3.2 TCP的工作原理

5.3.2.1 三次握手(建立连接)

TCP连接的建立必要三次握手过程:
5.3.2.2 数据传输


5.3.2.3 四次挥手(断开连接)

TCP连接的断开必要四次挥手过程:
5.3.2 TCP报文布局

TCP报文段的布局主要包括以下字段:

5.3.3 TCP应用场景

TCP广泛用于必要可靠传输的网络应用,如:

5.3.4 代码演示

  1. import java.io.IOException;
  2. import java.io.OutputStream;
  3. import java.net.Socket;
  4. public class Client {
  5.     public static void main(String[] args) throws IOException {
  6.         //TCP协议,发送数据
  7.         //1.创建Socket对象
  8.         //细节:在创建对象的同时会连接服务端
  9.         //      如果连接不上,代码会报错
  10.         Socket socket = new Socket("127.0.0.1",10000);
  11.         //2.可以从连接通道中获取输出流
  12.         OutputStream os = socket.getOutputStream();
  13.         //写出数据
  14.         os.write("aaa".getBytes());
  15.         //3.释放资源
  16.         os.close();
  17.         socket.close();
  18.     }
  19. }
复制代码
  1. import java.io.IOException;
  2. import java.io.InputStream;
  3. import java.net.ServerSocket;
  4. import java.net.Socket;
  5. public class Server {
  6.     public static void main(String[] args) throws IOException {
  7.         //TCP协议,接收数据
  8.         //1.创建对象ServerSocker
  9.         ServerSocket ss = new ServerSocket(10000);
  10.         //2.监听客户端的链接
  11.         Socket socket = ss.accept();
  12.         //3.从连接通道中获取输入流读取数据
  13.         InputStream is = socket.getInputStream();
  14.         int b;
  15.         while ((b = is.read()) != -1){
  16.             System.out.print((char) b);
  17.         }
  18.         //4.释放资源
  19.         socket.close();
  20.         ss.close();
  21.     }
  22. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4