34. java与网络编程😍
34.1 基础网络知识🏡
IPV4 由四个字节二进制组成 总共由32位组成 🍨
IPV6 由16个字节二进制组成 总共由128位组成(冒分十六进制)🍨
ip地址的组成 = 网络地址 + 主机地址 🍦
InetAddress对象的使用🍧
public class ConnectionCreat {
public static void main(String[] args) throws UnknownHostException {
// -- 获取本机的InetAddress 对象
InetAddress inetAddress = InetAddress.getLocalHost();
System.out.println(inetAddress);
// -- 根据本机的主机名获取InetAddress 对象
System.out.println("host :" + InetAddress.getByName("LAPTOP-RD663NNS"));
// -- 根据域名返回 InetAddress 对象
System.out.println("HOST :" + InetAddress.getByName("yikeshuoguo.top"));
}
}
/*
LAPTOP-RD663NNS/172.21.64.1
host :LAPTOP-RD663NNS/172.21.64.1
HOST :yikeshuoguo.top/124.221.189.77
*/
34.2 Socket套接字编程🏡
网络通信其实就是socket之间通信👬
端口号 用于表示计算机上某个特定的网络程序🔗
客户端和服务端都会有一个端口进行通信☎️
TCP :可靠 指需要先建立再进行发送文件等数据报✋
UDP:不可靠 不需要先建立连接,直接可以发送文件等数据🤚
TCP可靠传输🚚
// ----------------服务端等待连接并接收信息----------------------------
public class server {
public static void main(String[] args) throws IOException {
// -- 监听本机9999号端口
ServerSocket serverSocket = new ServerSocket(9999);
// -- 当有客户端进行连接时,进行接收
Socket accept = serverSocket.accept();
System.out.println("服务端创建连接~~~~" + accept.getClass());
InputStream inputStream = accept.getInputStream();
byte[] bytes = new byte[1024];
int readLen = 0;
while ((readLen = inputStream.read(bytes)) != -1) {
System.out.println(new String(bytes, 0, readLen));
}
// 关闭等待接收信息
accept.shutdownInput();
OutputStream outputStream = accept.getOutputStream();
// -- 通过输出流,输出数据到数据通道
outputStream.write("hello~client".getBytes());
// -- 关闭输入流
outputStream.close();
inputStream.close();
// 这里的accept相当于服务器分配的接收端口
accept.close();
// serverSocket相当于服务器
serverSocket.close();
System.out.println("服务端停止等待~~~~~");
}
}
// ----------------客户端请求连接并发送信息------------------------
public class client {
public static void main(String[] args) throws IOException {
// -- 先获取本机对象信息,然后连接9999号端口
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
System.out.println("客户端进行连接~~~~" + socket.getClass());
OutputStream outputStream = socket.getOutputStream();
// -- 通过输出流,输出数据到数据通道
outputStream.write("hello~server".getBytes());
// 设置输出结束标记
socket.shutdownOutput();
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int readLen = 0;
while ((readLen = inputStream.read(bytes)) != -1) {
System.out.println(new String(bytes, 0, readLen));
}
// -- 关闭流和对象,否则会发生拥塞
outputStream.close();
inputStream.close();
socket.close();
System.out.println("客户端退出连接");
}
}
/*
服务端创建连接~~~~class java.net.Socket
hello~server
服务端停止等待~~~~~
客户端进行连接~~~~class java.net.Socket
hello~client
客户端退出连接
*/
netstat -an | more
分页查看本机端口占用情况
netstat -anb
查看端口连接状态
UDP不可靠传输🚜
public class Sender {
public static void main(String[] args) throws IOException {
// -- 创建一个端口用于 接收或者发送一个数据报
DatagramSocket datagramSocket = new DatagramSocket(9998);
byte[] bytes = "hello~明天吃火锅!".getBytes();
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("192.168.43.219"), 9999);
datagramSocket.send(datagramPacket);
byte[] bytes1 = new byte[1024];
DatagramPacket datagramPacket1 = new DatagramPacket(bytes1, bytes1.length);
System.out.println("等待消息的回复~~");
datagramSocket.receive(datagramPacket1);
byte[] byt = datagramPacket1.getData();
System.out.println(new String(byt, 0, datagramPacket1.getLength()));
// -- 关闭
datagramSocket.close();
System.out.println("发送端结束~~~");
}
}
//-------
public class Sender {
public static void main(String[] args) throws IOException {
// -- 创建一个端口用于 接收或者发送一个数据报
DatagramSocket datagramSocket = new DatagramSocket(9998);
byte[] bytes = "hello~明天吃火锅!".getBytes();
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("192.168.43.219"), 9999);
datagramSocket.send(datagramPacket);
byte[] bytes1 = new byte[1024];
DatagramPacket datagramPacket1 = new DatagramPacket(bytes1, bytes1.length);
System.out.println("等待消息的回复~~");
datagramSocket.receive(datagramPacket1);
byte[] byt = datagramPacket1.getData();
System.out.println(new String(byt, 0, datagramPacket1.getLength()));
// -- 关闭
datagramSocket.close();
System.out.println("发送端结束~~~");
}
}
/*
等待数据报的传输~~~~~
hello~明天吃火锅!
等待消息的回复~~
好的~明天一起吃火锅哦!
发送端结束~~~
*/