为热爱编程的你点赞!
学习SpringBoot实战课程 https://edu.csdn.net/course/detail/31433
学习SpringCloud入门课程 https://edu.csdn.net/course/detail/31451
网络编程也是Java的拿手好戏,本文带大家了解网络的相关概念,然后实现HTTP和UDP的网络通信。
网络编程,指的就是在同一个网络中不同计算机之间的数据通信
计算机网络,就是把分布在不同区域的计算机与专门的外部设备用通信线路相互连接成一个规模大,而且功能强的网络系统,从而使得计算机之间可以相互传递信息,共享数据、软件等资源。
计算机网络按地理位置分为:
IP地址指的是互联网地址(Internet Protocol Address ,是联网设备与互联网之间的唯一标识,在同一个网段中,IP地址是唯一的
IP地址是数字型的,是一个32位的二进制,通常将其分成4个8位的二进制数,每8位之间用圆点隔开,每个8位整数可以转换为一个0~255的十进制整数,例如:202.9.128.88
IP地址可以唯一的确定网络上的一个通信实体,但一个通信实体可以有多个通信程序同时提供网络服务,此时还需要使用端口
数据的发送和接收都需要通过端口出入计算机,端口号用于唯一标识通信实体上进行网络通讯的程序,同一台机器上不能两个程序占用同一个端口
端口号的取值范围:0 ~ 65535
端口分类:
常用端口:
网络通信协议
是计算机网络中互相通信的对等实体之间交换信息时所必须遵守的规则的集合。
超文本传输协议(Hyper Text Transfer Protocol)用于规范在网络中对文本数据的传输,属于应用层协议,底层是基于TCP/IP协议。
服务器告诉浏览器的响应结果
代码 | 说明 |
---|---|
1xx消息 | 请求已被服务器接收,继续处理 |
2xx成功 | 请求已成功被服务器接收、理解、并接受 |
3xx重定向 | 需要后续操作才能完成这一请求 |
4xx请求错误 | 请求含有词法错误或者无法被执行 |
5xx服务器错误 | 服务器在处理某个正确请求时发生错误 |
常见响应码:
代码 | 说明 |
---|---|
200 | OK 请求成功 |
400 | Bad Request 请求有语法错误 |
401 | Unauthorized 请求未经授权 |
403 | Forbidden 服务器拒绝提供服务 |
404 | Not Found 请求资源不存在 |
500 | Internal Server Error 服务器发生错误 |
503 | Server Unavailable 服务器不能处理 |
主要的API:
URL
统一资源定位系统(Uniform Resource Locator)是网络上用于指定信息位置的表示方法。
创建方法
URL url = new URL("资源的地址");
主要方法
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() | 获得资源的长度 |
案例:从网络下载图片
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是数据报协议,类似于广播,不需要三次握手来创建连接,传输数据速度快但是不可靠
应用场景:语音、视频聊天
DatagramSocket 可以做UDP的客户端也可以做服务器端
创建方法:
服务器端
new DatagramSocket(端口号)
客户端
new DatagramSocket()
主要方法:
DatagramPacket是UDP数据包,用于接收和发送数据
创建方法:
用于接收数据的数据包
DatagramPacket(byte[] 数据字节 ,int 数据长度)
用于发送数据的数据包
DatagramPacket(byte[] 数据字节 ,int 数据长度,InetAddress 地址,int 端口)
常用方法:
使用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知识点汇总