网络编程
1.1概述
网络编程的目的:
实现信息交互
达到目的需要什么条件?
-
如何准确定位一台主机:IP
-
如何定位计算机上资源:端口
-
如何传输数据:
java web: B/S架构
应用:C/S架构
1.2网络通讯的要素
1.通信双方的地址:
- IP
- 端口号
2.网络通信协议
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xyhxaGwg-1587999171269)(C:%5CUsers%5CAdministrator%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200413205720049.png)]
1.3 IP
ip地址:
-
唯一定位一台网络上的计算机
-
分类
- IPV4 :4个字节组成, 0~255, 约42亿个(亚洲只有4亿,不公平)
- IPV6 :128位 , 8个无符号整数
fe80::c0c0:ba57:fe79:a2a913
- 公网:用于互联网
- 私网:用于局域网
- 192.168.xxx.xxx属于局域网
- 域名:用于记忆IP(越短越贵,超贵)
-
package com.mrh.net; import java.net.InetAddress; import java.net.UnknownHostException; /** * TestInetAddress * 测试IP * 2020/4/13 21:18 **/ public class TestInetAddress { public static void main(String[] args) { try{ //根据域名或IP查询地址 InetAddress inetAddress1 = InetAddress.getByName("www.baidu.com"); System.out.println(inetAddress1); //www.baidu.com/183.232.231.174 System.out.println(inetAddress1.getHostAddress()); //183.232.231.174 System.out.println(inetAddress1.getHostName()); //www.baidu.com } catch (UnknownHostException e) { e.printStackTrace(); } } }
1.4 端口
端口标识计算机上得一个程序的进程
-
不同的进程有不同的端口号,同来区分软件
-
0~65535
-
端口分类
- 公用端口0~1023
- HTTP : 80
- HTTPS : 443
- FTP : 21
- Telent : 23
- 程序注册端口:1024~49151,分配用户或程序
- tomcat : 8080
- Mysql : 3306
- Oracle : 1521
- 动态/私有: 49152~65535
netstat -ano #查看所有端口 netstat -ano|findstr “5900” #查看指定端口 tasklist|findstr “8696” #查看指定端口进程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M4t714x5-1587999171271)(C:%5CUsers%5CAdministrator%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200413214805088.png)]
- 公用端口0~1023
1.5 通信协议
协议:约定的规则
TCP/IP协议簇
- TCP : 用户传输协议
- UDP:数据报传输协议
- IP:网络互连协议
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9GRj7YLY-1587999171272)(C:%5CUsers%5CAdministrator%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200413215244643.png)]
TCP UDP对比
TCP:打电话
- 连接,稳定
- 传输完成,释放连接,效率低
三次握手,四次挥手
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8flK62Xv-1587999171273)(C:%5CUsers%5CAdministrator%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200413220117551.png)]
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6MH0oUDi-1587999171275)(C:%5CUsers%5CAdministrator%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200413220139037.png)]
- 客户端,服务端
UDP:发短信
- 不链接,不稳定
- 客户端,服务端没有明确界限
- 不管有没有准备都可以发给你
- 不安全(饱和攻击)
1.6 TCP
TCP实现聊天
package com.mrh.net;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
/**
* TestSocketAddress
* 测试客户端
* 2020/4/13 21:38
**/
public class TestClientDemo1 {
public static void main(String[] args) throws IOException {
//1.要知道服务器地址
InetAddress inetAddress = InetAddress.getByName("localhost");
int port = 9999;
//2.创建一个socket连接
Socket socket = new Socket(inetAddress, port);
//3.发送消息 IO流
OutputStream os = socket.getOutputStream();
os.write("你好,我是帅比".getBytes());
//关闭流
if(os != null) {
os.close();
}
if(socket != null) {
socket.close();
}
}
}
package com.mrh.net;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* TestServerDemo1
* 2020/4/13 22:05
* 测试服务端
**/
public class TestServerDemo1 {
public static void main(String[] args) throws IOException {
//1.要有一个地址
ServerSocket serverSocket = new ServerSocket(9999);
//等待客户端
Socket socket = serverSocket.accept();
//读取客户端信息
InputStream is = socket.getInputStream();
//管道流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1){
baos.write(buffer ,0, len);
}
System.out.println(baos.toString());
//关闭流
if(baos != null) {
baos.close();
}
if(is != null) {
is.close();
}
if(socket != null) {
socket.close();
}
if(serverSocket != null) {
serverSocket.close();
}
}
}
文件上传
Tomcat
服务端
- 自定义
- Tomcat
客户端
- 自定义
- 浏览器
1.7 UDP
UDP实现聊天
package com.mrh.net;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
* TalkReceive
* 接收线程
* 2020/4/16 21:48
**/
public class TalkReceive implements Runnable{
DatagramSocket socket = null;
private int myPort;
private String msgFrom;
public TalkReceive(int myPort, String msgFrom) throws SocketException {
this.myPort = myPort;
this.msgFrom = msgFrom;
socket = new DatagramSocket(myPort);
}
@Override
public void run() {
while (true){
try {
byte[] container = new byte[1024];
DatagramPacket packet = new DatagramPacket(container,0,container.length);
socket.receive(packet);
byte[] data = packet.getData();
String receiveData = new String(data,0,data.length);
System.out.println(msgFrom +": "+ receiveData);
if("bye".equals(receiveData)){
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
socket.close();
}
}
package com.mrh.net;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
/**
* TalkSend
* 发送线程
* 2020/4/16 21:26
**/
public class TalkSend implements Runnable{
DatagramSocket socket = null;
BufferedReader reader = null;
private int myPort;
private int toPort;
private String toIp;
public TalkSend(int myPort, int toPort, String toIp) throws SocketException {
this.myPort = myPort;
this.toPort = toPort;
this.toIp = toIp;
socket = new DatagramSocket(myPort);
reader = new BufferedReader(new InputStreamReader(System.in));
}
@Override
public void run() {
while (true){
try {
String data = reader.readLine();
byte[] datas = data.getBytes();
DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress(this.toIp,this.toPort));
socket.send(packet);
if("bye".equals(data)){
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
socket.close();
}
}
1.8 URL
https://www.baidu.com/
统一资源定位器:定位互联网上的某一资源
DNS域名解析 : 域名–>ip
1.协议://ip:端口/项目/资源
下载网络资源
package com.mrh.net;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* URLDemo01
* 下载网络资源
* 2020/4/16 22:15
**/
public class URLDemo01 {
public static void main(String[] args) throws IOException {
//1.下载地址
URL url = new URL("https://m10.music.126.net/20200416230043/5e6b78442733cd0c96f06481229c7948/yyaac/0052/005b/020f/788cff545371798931095e7e20a8d781.m4a");
//2.连接网络资源
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = urlConnection.getInputStream();
FileOutputStream fos = new FileOutputStream("1.m4a");
//输出数据
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer))!= -1){
fos.write(buffer,0,buffer.length);
}
//关闭流
fos.close();
inputStream.close();
urlConnection.disconnect(); // 断开连接
/*System.out.println(url.getFile());
System.out.println(url.getHost());
System.out.println(url.getPath());
System.out.println(url.getFile());*/
}
}