Java 网络编程 学习笔记

owo

CS/BS

  • 常见软件架构

C/S

  • Client/Server

B/S

  • Browser/Server

网络编程三要素

  • IP

  • 端口号

  • 协议

java.net包

表示IP地址

InetAddress类

方法

  • static InetAddress getByName(String host):确定主机的IP。主机名可以是机器名,也可以是IP
  • String getHostName():获取此IP的主机名
  • String getHostAddress():返回文本显示中的IP地址字符串

协议

UDP

  • 面向无连接
  • 用户数据包协议(User Datagram Protocol)
  • 速度快、一次最多发64K,易丢失
发送数据
  • 创建发送端的DatagramSocket
  • 数据打包
  • 发送数据
  • 释放资源
//创建对象时底层绑定端口,作为发出的端口
//空参:所有可用端口中随机一个使用
//有参:指定端口
DatagramSocket ds = new DatagramSocket();

//打包数据
String str = "Hello";
byte[] bytes = str.getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 10086;
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);//发到 port 这个端口

//发送数据
ds.send(dp);

//释放资源
ds.close();
接收数据
  • 创建接收端的DatagramSocket对象
  • 接收打包好的数据
  • 解析数据包
  • 释放资源
//接收的时候一定要绑定端口
DatagramSocket ds = new DatagramSocket(10086);

//接收数据包
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);

//这个方法是阻塞的
//执行到这一步会死等
ds.receive(dp);

//解析数据包
byte[] data = dp.getData();
int len = dp.getLength();
InetAddress address = dp.getAddress();
int port = dp.getPort();

System.out.println(new String(data, 0, len));
System.out.println(address + " " + port);

//释放资源
ds.close();
三种通信方式
  • 单播
  • 组播
  • 广播

TCP

  • 面向连接
  • 传输控制协议(Transmission Control Protocol)
  • 速度慢、没大小限制,数据安全
  • 通过Socket产生IO流进行网络通信
客户端
  • 创建客户端的Socket对象(Socket),与指定服务端连接
  • 获取输出流,写数据
  • 释放资源
//在创建对象的同时会连接服务器
//连接不上会报错
Socket socket = new Socket("127.0.0.1", 10000);

//可以从连接通道中获取输出流
OutputStream os = socket.getOutputStream();

//写数据
os.write("Hello".getBytes());

//释放资源
os.close();
socket.close();
服务器
  • 创建服务器端的Socket对象(ServerSocket
  • 监听客户端连接,返回一个Socket对象
  • 获取输入流,读数据,并把数据显示在控制台
  • 释放资源
ServerSocket ss = new ServerSocket(10000);

//如果没有连接就会死等
Socket socket = ss.accept();

InputStream is = socket.getInputStream();
int b;
while((b = is.read()) != -1) {
    System.out.println((cahr)b);
}

socket.close();//断开连接
ss.close();//关闭服务器

注意:这里是字节流,会出现中文乱码。类比之前的字符流可以解决

三次握手
  • 客户端向服务器发出连接请求,等待服务器确认
  • 服务器向客户端返回一个响应,告诉客户端收到了请求
  • 客户端向服务端再次发出确认,连接建立
四次挥手
  • 客户端向服务端发出取消连接请求
  • 服务端向客户端返回一个请求,表示收到客户端取消请求
  • 服务端将最后的数据处理完毕之后,再次向客户端发出确认取消信息
  • 客户端再次发送确认消息,连接断开
img_show