# Java 中的网络编程
# 1 - 概述
# 1.1 - 网络编程的三要素
1、IP 地址
2、端口
3、协议
# 1.2 - IP 地址
IP 地址就是设备(电脑、手机、ipad、空调、冰箱)在网络中的唯一标识(通过 IP 地址访问的设备)
- IP 地址的两大分类
- IPV4(主流的网络地址格式)
- IPV6(未来 10 年够呛能普及)
- 常用 DOS 命令
- ipconfig -all (查看当前计算机网卡 IP 地址)
- ping xxx.xxx.xxx.xxx (测试网络是否畅通)
- netstat -ano (查看本机端口占用情况)
- 特殊的 IP 地址
# 1.3 - InetAddress
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import java.net.InetAddress; import java.net.UnknownHostException;
public class Demo03 { public static void main(String[] args) throws UnknownHostException {
InetAddress address = InetAddress.getByName("LAPTOP-93CBHP2O");
System.out.println(address); System.out.println(address.getHostName()); System.out.println(address.getHostAddress()); } }
|
# 1.4 - 端口
端口是一个应用程序(进程 / 线程)在设备中的唯一标识
端口号:用两个字节的整数来表示(unsigned short : 0 ~ 65535), 其中 0 ~ 1024 之间的端口进行不要使用,因为很多知名网络服务商和应用程序都会在这个区间选择端口(被占用的几率大),建议使用 10000 以上端口号,如果被占用,再换一个。
# 1.5 - 协议
计算机网络中,连接和通信的规则
- UDP
- User Datagram Protocol 用户数据包协议
- UDP 协议是一种无连接的通信协议,即在数据传输的时候,数据的发送端和接收端不会建立所谓的逻辑连接,简单来说就是当一台计算机向另计算机发送数据时,发送端不会确认接收端是否存在,都会将数据发出。同样接收端也不会再接收到数据后做任何的反馈。
- UDP 协议消耗资源相对小,通信效率高,但是不安全。一般情况下使用在在线的音乐、视频。
- TCP
- Transmission Control Protoclol 传输控制协议
- TCP 协议是一种面向连接 / 安全的数据通信协议,在数据传输之前,会在发送端和接收端各自创建一个逻辑对象,然后再进行数据的传输。
- 传输之前会做 “三次握手”
- 传输之后断开连接会做 “四次挥手”
# 2 - UDP 通信
# 2.1 - 通信原理
UDP 在通信的时候在两端各自创建一个 Socekt(套接字)对象,但是这个两个 Socket(对象)只是用来发送和接收数据的对象,因此对于 UDP 协议通信的双方而言,没有所谓的客户端和服务器端的概念。
# 2.2 - UDP 发送
- 发送步骤
1、创建发送端的 Socket 对象 - DatagramSocket
2、创建数据,并打包数据
3、调用发送方法
4、关闭发送
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| package demo04;
import java.io.IOException; import java.net.*;
public class UDPSend { public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket();
byte[] bytes = "Hello UDP Send Messages!~".getBytes(); int length = bytes.length; InetAddress address = InetAddress.getByName("127.0.0.1"); int port = 9527; DatagramPacket dp = new DatagramPacket(bytes, length, address, port);
ds.send(dp);
ds.close(); } }
|
# 2.3 - UDP 接收
- 接收数据的步骤
1、创建接收端 Socket 对象 - DatagramSoket
2、创建一个数据包,用于接收数据
3、调用接收方法
4、解析数据包
5、关闭接收
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| package demo04;
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException;
public class UDPReceive { public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(9527);
byte[] bytes = new byte[1024]; int length = bytes.length; DatagramPacket dp = new DatagramPacket(bytes, length);
ds.receive(dp);
byte[] data = dp.getData(); int length1 = dp.getLength(); System.out.println(new String(data,0,length1));
ds.close(); } }
|
# 2.4 - 案例
需求:
UDP 发送数据:数据来源于键盘输入,直到输入 over 的时候就结束发送
UDP 接收数据:因为不知道发送端发送多少次,所以接收端采用死循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| package demo05;
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException;
public class UDPReceive { public static void main(String[] args) throws IOException { DatagramSocket ds = new DatagramSocket(9527);
while (true){ byte[] bytes = new byte[1024]; DatagramPacket dp = new DatagramPacket(bytes, bytes.length); ds.receive(dp); System.out.println("接收到-" + new String(bytes,0,dp.getLength())); }
} } ---------------------------------------------------- package demo05;
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException;
public class UDPSend { public static void main(String[] args) throws IOException { DatagramSocket ds = new DatagramSocket(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line; while ((line = br.readLine()) != null){ if("over".equals(line)) break;
byte[] bytes = line.getBytes(); InetAddress address = InetAddress.getByName("127.0.0.1"); DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, 9527); ds.send(dp); }
ds.close(); } }
|