- ip:用于在计算机网络中定位设备
- IPV4,四段0-255,192.168.1.1
- IPV6,128bit,八段,每段四个十六进制数,:分隔
- port:逻辑端口:0-65535
- 0-1023:OS占用
- 1024-65535,一般应用程序使用
两台机器通讯就是通过ip+port
- 保留IP:127.0.0.1本机
- tracert [目标IP] :可以查看与目标机器的访问中继
- 传输层协议:TCP、UDP
一、 TCP(Transmission Control Protocol)
- 传输控制协议,面向连接的协议
- 可靠无差错传输
- 双向字节流传递
4. TCP编程步骤:
- 服务器:创建一个ServerSocket,等待连接
- 客户机:创建一个Socket,连接到服务器
- 服务器:ServerSocket接收到连接后,创建一个Socket和客户Socket建立专线连接,后续服务器与客户机的对话(这一对Socket)会在一个单独的线程上(服务器端)运行
- 服务器的ServerSocket继续等待连接,返回第一步
(服务器指的是:软件服务器——实现一定功能、在一个公开的地址上对外提供服务)
-
重要类
- ServerSocket,服务器
- 需要绑定port
- 如果有多个网卡,需要绑定一个IP地址
- Socket:通道
- 客户端需要绑定服务端的IP地址和端口Port
- 客户端向Socket输出流写入数据,送到服务端
- 客户端从Socket输入流取服务器端传来的数据
-
服务端反之亦然
- 服务端可以响应多个客户端:
- 服务端每接受一个客户端,就启动一个独立的线程与之对应
- 客户端或者服务端都可以选择关闭这对Socket通道。
- 主要方法:
socket s = serverSocket.accept() //会等待客户端连接,阻塞
s.getInputStream()、s.getOutputStream()
//写数据是字节数据
outPutStream.write(String.getBytes());
使用共享线程池,优化反复创建线程带来的系统开销
二、 UDP(User Datagram Protocol)
- 用户数据报协议,面向无连接协议
- 不保证可靠的数据传输
- 速度快,可以在较差网络下使用
- UDP:无连接无状态通讯协议
- 发送方发送消息,当接收方恰好在目的地,则可以接收;当接收方不在,则消息就直接被丢失
- 发送方无法得知消息是都发送成功
- 好处:简单、经济、节省
-
主要方法:
- DatagramSocket:通讯的数据管道
- 方法:send、receive方法(双向)
- 绑定在IP和Port上
- DatagramPacket
- 集装箱:封装传输的数据
- 地址标签:要写明目的地的IP+Port
实例:
UdpRec:
package UDP;
import java.net.*;
public class UdpRec {
public static void main(String[] args) throws Exception {
//接收方,端口号为3000
DatagramSocket ds = new DatagramSocket(3000);
byte [] buf = new byte[1024];
//DatagramPacket用来封装接收到的数据
DatagramPacket dp = new DatagramPacket(buf,1024);
System.out.println("UdpRec:正在等待消息");
//调用方法接收消息,当没有接收到消息时会阻塞。
ds.receive(dp);
System.out.println("UdpRec:接收到消息");
String mes = new String(dp.getData(),0,dp.getLength())+" from " + dp.getAddress().getHostAddress()+" : "+ dp.getPort();
System.out.println(mes);
String str = "Hello World2";
DatagramPacket dp2 = new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName("127.0.0.1"),dp.getPort());
System.out.println("发送消息:");
ds.send(dp2);
System.out.println("结束");
}
}
UdpSend:
package UDP;
import java.io.IOException;
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, InterruptedException {
DatagramSocket ds = new DatagramSocket();
String str = "Hello World";
//DatagramPacket用来封装接收到的数据
DatagramPacket dp = new DatagramPacket(str.getBytes(),str.length(), InetAddress.getByName("127.0.0.1"),3000);
System.out.println("UdpSend:正在发送消息");
//调用方法接收消息,当没有接收到消息时会阻塞。
ds.send(dp);
System.out.println("UdpSend:发送结束");
Thread.sleep(1000);
// DatagramSocket ds2 = new DatagramSocket(1024);
byte [] buf = new byte[1024];
//DatagramPacket用来封装接收到的数据
DatagramPacket dp2 = new DatagramPacket(buf,1024);
System.out.println("接收消息...");
ds.receive(dp2);
System.out.println("结束");
String mes = new String(dp2.getData(),0,dp2.getLength())+" from " + dp2.getAddress().getHostAddress()+" : "+ dp2.getPort();
System.out.println(mes);
}
}
三、 HTTP编程
- 网页访问:
- 客户端浏览器连接到远程服务器(IP+port)
- 浏览器请求下载一个HTML文件,放到本地临时文件夹
- 在浏览器显示本地文件
- HTTP协议
- 超文本传输协议
- 用于从WWW服务器传输超文本到本地浏览器的传输协议
- 提姆伯纳斯李
- 访问方式:
a. GET:从服务器获取资源到到客户端。
b. POST:从客户端向服务器发送数据
- Java HTTP编程:Java.net包
- 支持模拟成浏览器的方式去访问网页
- URL(Uniform Resource Locator:统一资源定位符)
关键类URLConnection: - 获取资源连接的连接器
- 根据URL的openConnection方法获得URLConnection
- connect方法,建立与资源的联系通道
-
getInputStream方法,获取资源的内容
四、 HTTP Client
- JDK9之后,自带JDK HTTP Client
- Apache HttpComponents的HttpClient
- java.net.http包,java11正式发布
- 主要类:
HttpClient
HttpRequest
HttpResponse
五、 NIO编程(Non-Blocking I/O)
以上HTTP、TCP、UDP都是同步阻塞的,性能较差
- 何为阻塞I/O?在服务器端接收客户端输入时,服务器端就陷入了阻塞,性能就会比较差