前言
网络编程也是Java的拿手好戏,本文带大家了解网络的相关概念,然后实现HTTP和UDP的网络通信。
网络相关概念
网络编程,指的就是在同一个网络中不同计算机之间的数据通信
计算机网络
计算机网络,就是把分布在不同区域的计算机与专门的外部设备用通信线路相互连接成一个规模大,而且功能强的网络系统,从而使得计算机之间可以相互传递信息,共享数据、软件等资源。
计算机网络按地理位置分为:
- 局域网
- 城域网
- 广域网
IP地址
IP地址指的是互联网地址(Internet Protocol Address ,是联网设备与互联网之间的唯一标识,在同一个网段中,IP地址是唯一的
IP地址是数字型的,是一个32位的二进制,通常将其分成4个8位的二进制数,每8位之间用圆点隔开,每个8位整数可以转换为一个0~255的十进制整数,例如:202.9.128.88
IP地址分类
- A类:保留给政府结构,1.0.0.1 ~ 126.255.255.254
- B类:分配给中型企业,128.0.0.1 ~ 191.255.255.254
- C类:分配给任何需要的个人,192.0.0.1 ~ 223.255.255.254
- D类:用于组播,224.0.0.1 ~ 239.255.255.254
- E类:用于实验,240.0.0.1 ~ 255.255.255.254
- 回收地址:127.0.0.1,指本地机,一般用于测试使用
端口
IP地址可以唯一的确定网络上的一个通信实体,但一个通信实体可以有多个通信程序同时提供网络服务,此时还需要使用端口
数据的发送和接收都需要通过端口出入计算机,端口号用于唯一标识通信实体上进行网络通讯的程序,同一台机器上不能两个程序占用同一个端口
端口号的取值范围:0 ~ 65535
端口分类:
- 公认端口:0~1023
- 注册端口:1025~49151
- 动态或私有端口:1024~65535
常用端口:
- mysql:3306
- oracle:1521
- tomcat:8080
- 浏览器:80
通信协议
网络通信协议
是计算机网络中互相通信的对等实体之间交换信息时所必须遵守的规则的集合。
网络分为7层
常用的通信协议:
- 传输层协议:TCP、UDP等
- 网络层协议:IPV4、IPV6等
- 应用层协议:HTTP、FTP、SMTP、POP3等
HTTP协议
超文本传输协议(Hyper Text Transfer Protocol)用于规范在网络中对文本数据的传输,属于应用层协议,底层是基于TCP/IP协议。
HTTP协议的特点
- 简单和快速
- 支持客户端和服务器之间的通信
- 无连接,一旦客户端完成访问后,和服务器的连接就会断开
- 无状态,服务器不会保留客户端的数据
- 采用请求和响应模式,客户端向服务器发送请求,服务器发送响应给浏览器。
HTTP请求的方法
- GET 数据会包含在URL里,不安全,对数据的长度有限制,适合于进行查询和搜索
- POST 数据在后台发送,更加安全,对数据长度没有限制,适合于发送敏感数据
- PUT 更新服务器资源
- DELETE 请求删除资源
- TRACE 跟踪服务器信息
- OPTIONS 允许查看服务器的性能
- HEAD 用于获取报头
- CONNECT 将连接改为管道方式的代理服务器
HTTP的响应码
服务器告诉浏览器的响应结果
代码 | 说明 |
---|---|
1xx消息 | 请求已被服务器接收,继续处理 |
2xx成功 | 请求已成功被服务器接收、理解、并接受 |
3xx重定向 | 需要后续操作才能完成这一请求 |
4xx请求错误 | 请求含有词法错误或者无法被执行 |
5xx服务器错误 | 服务器在处理某个正确请求时发生错误 |
常见响应码:
代码 | 说明 |
---|---|
200 | OK 请求成功 |
400 | Bad Request 请求有语法错误 |
401 | Unauthorized 请求未经授权 |
403 | Forbidden 服务器拒绝提供服务 |
404 | Not Found 请求资源不存在 |
500 | Internal Server Error 服务器发生错误 |
503 | Server Unavailable 服务器不能处理 |
HTTP网络连接
主要的API:
- URL 资源地址
- HttpURLConnection 网络连接
URL
统一资源定位系统(Uniform Resource Locator)是网络上用于指定信息位置的表示方法。
创建方法
URL url = new URL("资源的地址");
主要方法
- URLConnection openConnection() 打开网络连接
HttpURLConnection
主要方法
方法 | 作用 |
---|---|
void disconnect() | 关闭连接 |
setRequestMethod(String method) | 设置请求方法 |
int getResponseCode() | 返回响应码 |
void setConnectTimeout(long time) | 设置连接超时 |
void setRequestProperty(String key,String value) | 设置请求头属性 |
InputStream getInputStream() | 获得输入流 |
OutputStream getOutputStream() | 获得输出流 |
void setDoOutput(boolean output) | 设置是否发送数据 |
long getContentLength() | 获得资源的长度 |
案例:从网络下载图片
- 创建URL对象,传入网络文件的地址
- 调用openConnection打开连接,获得HttpURLConnection对象
- 设置连接的各种属性
- 调用getInputStream获得输入流
- 创建文件输出流
- 从网络输入流读取数据,写入到文件输出流
- 关闭连接
public class DownloadTest {
/**
* 下载文件
* @param urlStr 资源的地址
* @param savePath 保存的路径
*/
public static void download(String urlStr,String savePath){
try {
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(3000); //连接超时
conn.setRequestMethod("GET");
System.out.println("文件长度是:"+conn.getContentLength());
if(conn.getResponseCode() == HttpURLConnection.HTTP_OK){
try(
InputStream in = conn.getInputStream();
OutputStream out = new FileOutputStream(savePath);){
byte[] buffer = new byte[1024];
int len = 0;
while((len = in.read(buffer)) != -1){
out.write(buffer, 0, len);
}
System.out.println("文件下载完毕");
Runtime.getRuntime().exec("mspaint "+savePath); //用画图打开
}catch(IOException ex){
ex.printStackTrace();
}
}
conn.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
download("http://hbimg.b0.upaiyun.com/a09289289df694cd6157f997ffa017cc44d4ca9e288fb-OehMYA_fw658",
"D:\\mm.jpg");
}
}
UDP编程
UDP是数据报协议,类似于广播,不需要三次握手来创建连接,传输数据速度快但是不可靠
应用场景:语音、视频聊天
DatagramSocket
DatagramSocket 可以做UDP的客户端也可以做服务器端
创建方法:
服务器端
new DatagramSocket(端口号)
客户端
new DatagramSocket()
主要方法:
- send(DatagramPacket) 发送数据包
- receive(DatagramPacket) 接收数据包
DatagramPacket
DatagramPacket是UDP数据包,用于接收和发送数据
创建方法:
用于接收数据的数据包
DatagramPacket(byte[] 数据字节 ,int 数据长度)
用于发送数据的数据包
DatagramPacket(byte[] 数据字节 ,int 数据长度,InetAddress 地址,int 端口)
常用方法:
- byte[] getData() 获得数据
UDP通信
使用UDP发送简单的消息
UDP服务器端
public class UDPServer {
public static final int PORT = 8888;
public void start(){
System.out.println("server started!");
try {
//创建UDP服务端
DatagramSocket server = new DatagramSocket(PORT);
//创建数据包
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
//接收数据包
server.receive(packet);
String str = new String(packet.getData());
System.out.println("收到消息:" + str);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new UDPServer().start();
}
}
UDP客户端
public class UDPClient {
public void sendMsg(String ip,int port,String msg){
try {
//创建UDP客户端
DatagramSocket client = new DatagramSocket();
//创建数据包
byte[] buf = msg.getBytes();
DatagramPacket packet = new DatagramPacket(buf,buf.length,InetAddress.getByName(ip),port);
//发送数据包
client.send(packet);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new UDPClient().sendMsg("127.0.0.1", 8888, "Hello UDP!");
}
}
结束
大家如果需要学习其他Java知识点,戳这里 超详细的Java知识点汇总