UDP是数据报协议,类似于广播,不需要三次握手来创建连接,传输数据速度快但是不可靠。
TCP是传输控制协议。类似于打电话,需要一直保持连接状态。
TCP和UDP的区别
UDP编程
UDP使用DatagramSocket这个类来实现,DatagramSocket可以做UDP的客户端也可以做服务器端。
//创建方法
//服务器端
new DatagramSocket(端口号)
//客户端
new DatagramSocket()
//常用的API
send(DatagramPacket) //发送数据包
receive(DatagramPacket) //接收数据包
方法中出现了一个DatagramPacket UDP数据包,它主要用于接收和发送数据。
//创建方法
//用于接收数据的数据包
DatagramPacket(byte[] 数据字节 ,int 数据长度)
用于发送数据的数据包
DatagramPacket(byte[] 数据字节 ,int 数据长度,InetAddress 地址,int 端口)
//常用的API
byte[] getData() //获得数据
HTTP协议
超文本传输协议(Hyper Text Transfer Protocol)用于规范在网络中对文本数据的传输,属于应用层协议,底层是基于TCP/IP协议。
特点:
1.简单和快速
2.支持客户端和服务器之间的通信
3.无连接,一旦客户端完成访问后,和服务器的连接就会断开
4.无状态,服务器不会保留客户端的数据
5.采用请求和响应模式,客户端向服务器发送请求,服务器发送响应给浏览器。
HTTP的报文
请求报文:
响应报文:
HTTP常见的状态码
HTTP编程
URL:统一资源定位系统(Uniform Resource Locator)是网络上用于指定信息位置的表示方法。
创建方法:
URL url = new URL("资源的地址");
主要的API:
URLConnection openConnection() //打开网络连接
HttpURLConnection
是URLConnection的子类。用来建立http的连接。主要的方法:
使用HTTP编程实现文件下载
/**
* 文件下载
*/
public class Download {
//文件下载路径
private static final String DIR="D:\\files\\";
public void download(String path){
try {
//创建一个url对象
URL url = new URL(path);
//打开连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//设置超时时间
connection.setConnectTimeout(5000);
//设置请求方式
connection.setRequestMethod("GET");
//设置文件名
String fileName = UUID.randomUUID().toString().replace("-", "")+"jpg";
//创建文件输出流和网络输入流
try(InputStream in = connection.getInputStream();
FileOutputStream out = new FileOutputStream(DIR+fileName)){
byte[] data = new byte[1024];
int len = -1;
while((len = in.read(data))!=-1){
out.write(data,0,len);
}
}catch (IOException e){
e.printStackTrace();
}
System.out.println("文件下载完成");
//打开方式
Runtime.getRuntime().exec("mspaint "+DIR+fileName);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Download download = new Download();
download.download("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.jj20.com%2Fup%2Fallimg%2F1113%2F031320114545%2F200313114545-2-1200.jpg&refer=http%3A%2F%2Fimg.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1662259963&t=74bc43d725c6ee24c59fe20957236d99");
}
}
如何自定义一个的服务器
服务器要实现的步骤:
/**
* 自定义服务器
*/
public class HttpServer {
private static final int PORT=9898;
private static final String DIR="D:\\html\\";
public void start(){
//创建服务端serverSocket对象
try ( ServerSocket serverSocket = new ServerSocket(PORT)){
while (true){
//获取浏览器连接
Socket socket = serverSocket.accept();
//通过io流获取客服端请求的报文的第一行
try(BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))){
String line = in.readLine();
//解析url
String url = null;
if(line!=null){
String[] lines = line.split(" ");
if(lines.length>2){
url = lines[1];
}
}
System.out.println(url);
//判断文件是否存在
File file = new File(DIR + url);
if(file.exists()){
//文件存在,读取html代码
BufferedReader reader = new BufferedReader(new FileReader(file));
StringBuilder builder = new StringBuilder();
String str=null;
while ((str = reader.readLine())!= null){
builder.append(str);
}
reader.close();
//发送响应报文给客户端,带html代码
StringBuilder builder1 = new StringBuilder();
builder1.append("\"HTTP/1.1 200 OK\r\n");
builder1.append("Content-Type:text/html;charset=UTF-8\r\n");
builder1.append("Content-length:"+builder.toString().getBytes().length+"\r\n");
builder1.append("\r\n");
builder1.append(builder);
out.write(builder1.toString());
}else{
//文件不存在,返回报文404
out.write("HTTP/1.1 404 NOT FOUND");
}
out.flush();
}catch (IOException ex){
ex.printStackTrace();
}
}
}catch (IOException ex){
ex.printStackTrace();
}
}
public static void main(String[] args) {
HttpServer server = new HttpServer();
server.start();
}
}