网络编程
网络编程
1.1、概述
计算机网络:
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
网络编程的目的:
无线电台,传播交流信息
数据交换,通信
想达到的效果:
如何定位网络主机
ip,端口,定位到计算机某个资源
如何传输数据
javaweb: 网页编程 B/S 架构
网络编程: TCP/IP C/S架构 客户端
1.2、网络通信的要素
通信双方的地址:
- ip
- 端口号
规则: 网络通信的协议
TCP/IP参考模型:
小结:
-
网络编程中有两个主要的问题
- 如何准确的定位到网络上的一台或者多台主机。
- 找到主机之后如何进行通信
-
网络编程中的要素
-
IP和端口号 ip
-
网络通信协议 udp,tcp
-
-
万物皆对象
1.3、IP
ip地址: InetAddress
-
唯一定位一台网络上计算机
-
127.0.0.1: 本机localhost
-
ip地址的分类
- ipv4 / ipv6
- IPV4 127.0.0.1 ,4个字节组成。, 255,42亿 ; 30亿都在北美,亚洲4亿。
- ipv6 128位。8个无符号整数!
- ipv4 / ipv6
-
公网(互联网)-私网(局域网)
-
ABCD类地址
-
192.168.xx.xx,专门给组织内部使用的
-
IPv4 地址:就是自己电脑的本地IP地址
package com.liang.lessonIp;import java.net.InetAddress;
import java.net.UnknownHostException;//测试ip
public class TestnetAddress {public static void main(String[] args) {try {//查询本机地址InetAddress inetAddress = InetAddress.getByName("127.0.0.1");InetAddress localhost = InetAddress.getByName("localhost");InetAddress host = InetAddress.getLocalHost();System.out.println(localhost);System.out.println(host);System.out.println(inetAddress);//查询网站ip地址InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com");System.out.println(inetAddress2);//常用方法System.out.println(inetAddress2.getAddress());System.out.println(inetAddress2.getHostAddress());//ipSystem.out.println(inetAddress2.getCanonicalHostName());//规范的名字System.out.println(inetAddress2.getHostName());//域名,或者自己电脑的名字} catch (UnknownHostException e) {throw new RuntimeException(e);}}
}
1.4、端口
端口表示计算机上的一个程序的进程;
-
不同的进程有不同的端口号!用来区分软件
-
被规定 0~65535
-
TCP,UDP : 65535* 2 tcp: 80,udp: 80吗,单个协议下,端口号不能冲突
-
端口分类
-
公有端口 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 “8080” 查看指定端口
Ctrl+shift+esc
-
package com.liang.lessonIp;import java.net.InetSocketAddress;public class TestInetSocketAddress {public static void main(String[] args) {InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1",8080);System.out.println(inetSocketAddress);System.out.println(inetSocketAddress.getAddress());System.out.println(inetSocketAddress.getPort());}
}
1.5、通信协议
协议: 约定,就好比我们现在说的是普通话。
网络通信协议: 速率,传输码率,代码结构,传输控制…
问题: 非常的复杂?
大事化小: 分层!
TCP/IP协议簇重要:
。TCP : 用户传输协议
。UDP: 用户数据报协议
TcP udp 对比
TCP: 打电话
-
连接,稳定
-
三次握手四次挥手
最少需要三次,保证稳定连接!
A: 你瞅啥?
B: 瞅你咋地?
A: 干一场!四次挥手,断开连接
A: 我要走了
B: 你真的要走了吗?
B: 你真的真的要走了吗?
A: 我的真的要走了
-
客户端、服务端
-
传输完成,释放连接,效率低
UDP : 发短信
- 不连接,不稳定
- 客户端、服务端:没有明确的界限。
- 不管有没有准备好,都可以发给你.
- 导弹
- ddos:洪水攻击(饱和攻击)
1.6、TCP
先起服务端再起客户端
客户端:
1.连接服务器 Socket
2.发送消息package com.liang.lessonIp;import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException;//客户端 public class TcpClientDemo1 {public static void main(String[] args) {Socket socket = null;OutputStream os = null;//1.要知道服务器地址try {InetAddress inetAddress = InetAddress.getByName("127.0.0.1");int port = 9999;//2.创建一个socket连接socket = new Socket(inetAddress, port);//3.发送消息io流os = socket.getOutputStream();os.write("hello world+++梁伟浩".getBytes());} catch (Exception e) {throw new RuntimeException(e);}finally {if (os!=null){try {os.close();} catch (IOException e) {throw new RuntimeException(e);}}if (socket!=null){try {socket.close();} catch (IOException e) {throw new RuntimeException(e);}}}} }
服务器:
1.建立服务的端口 ServerSocket
2.等待用户的链接 accept
3.接收用的消息
package com.liang.lessonIp;import javax.swing.text.StyledEditorKit;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;//服务端
public class TcpClientDemo2 {public static void main(String[] args) throws IOException {//1.我有一个地址ServerSocket serverSocket = new ServerSocket(9999);//2.等待客户端链接Socket accept = serverSocket.accept();//3.读取客户端信息InputStream is = accept.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());//关闭资源is.close();accept.close();serverSocket.close();baos.close();}
}
输出:
D:\\JavaEnvironment\\jdk1.8\\bin\\java.exe "-javaagent:D:\\工作软件\\idea2022\\IntelliJ IDEA 2022.2.3\\lib\\idea_rt.jar=52945:D:\\工作软件\\idea2022\\IntelliJ IDEA 2022.2.3\\bin" -Dfile.encoding=UTF-8 -classpath D:\\JavaEnvironment\\jdk1.8\\jre\\lib\\charsets.jar;D:\\JavaEnvironment\\jdk1.8\\jre\\lib\\deploy.jar;D:\\JavaEnvironment\\jdk1.8\\jre\\lib\\ext\\access-bridge-64.jar;D:\\JavaEnvironment\\jdk1.8\\jre\\lib\\ext\\cldrdata.jar;D:\\JavaEnvironment\\jdk1.8\\jre\\lib\\ext\\dnsns.jar;D:\\JavaEnvironment\\jdk1.8\\jre\\lib\\ext\\jaccess.jar;D:\\JavaEnvironment\\jdk1.8\\jre\\lib\\ext\\jfxrt.jar;D:\\JavaEnvironment\\jdk1.8\\jre\\lib\\ext\\localedata.jar;D:\\JavaEnvironment\\jdk1.8\\jre\\lib\\ext\\nashorn.jar;D:\\JavaEnvironment\\jdk1.8\\jre\\lib\\ext\\sunec.jar;D:\\JavaEnvironment\\jdk1.8\\jre\\lib\\ext\\sunjce_provider.jar;D:\\JavaEnvironment\\jdk1.8\\jre\\lib\\ext\\sunmscapi.jar;D:\\JavaEnvironment\\jdk1.8\\jre\\lib\\ext\\sunpkcs11.jar;D:\\JavaEnvironment\\jdk1.8\\jre\\lib\\ext\\zipfs.jar;D:\\JavaEnvironment\\jdk1.8\\jre\\lib\\javaws.jar;D:\\JavaEnvironment\\jdk1.8\\jre\\lib\\jce.jar;D:\\JavaEnvironment\\jdk1.8\\jre\\lib\\jfr.jar;D:\\JavaEnvironment\\jdk1.8\\jre\\lib\\jfxswt.jar;D:\\JavaEnvironment\\jdk1.8\\jre\\lib\\jsse.jar;D:\\JavaEnvironment\\jdk1.8\\jre\\lib\\management-agent.jar;D:\\JavaEnvironment\\jdk1.8\\jre\\lib\\plugin.jar;D:\\JavaEnvironment\\jdk1.8\\jre\\lib\\resources.jar;D:\\JavaEnvironment\\jdk1.8\\jre\\lib\\rt.jar;D:\\IdeaStudySpace\\JavaStudy\\target\\classes;D:\\JavaEnvironment\\downloadMaven\\org\\springframework\\boot\\spring-boot-starter-web\\2.0.0.RELEASE\\spring-boot-starter-web-2.0.0.RELEASE.jar;D:\\JavaEnvironment\\downloadMaven\\org\\springframework\\boot\\spring-boot-starter\\2.0.0.RELEASE\\spring-boot-starter-2.0.0.RELEASE.jar;D:\\JavaEnvironment\\downloadMaven\\org\\springframework\\boot\\spring-boot\\2.0.0.RELEASE\\spring-boot-2.0.0.RELEASE.jar;D:\\JavaEnvironment\\downloadMaven\\org\\springframework\\boot\\spring-boot-autoconfigure\\2.0.0.RELEASE\\spring-boot-autoconfigure-2.0.0.RELEASE.jar;D:\\JavaEnvironment\\downloadMaven\\org\\springframework\\boot\\spring-boot-starter-logging\\2.0.0.RELEASE\\spring-boot-starter-logging-2.0.0.RELEASE.jar;D:\\JavaEnvironment\\downloadMaven\\ch\\qos\\logback\\logback-classic\\1.2.3\\logback-classic-1.2.3.jar;D:\\JavaEnvironment\\downloadMaven\\ch\\qos\\logback\\logback-core\\1.2.3\\logback-core-1.2.3.jar;D:\\JavaEnvironment\\downloadMaven\\org\\apache\\logging\\log4j\\log4j-to-slf4j\\2.10.0\\log4j-to-slf4j-2.10.0.jar;D:\\JavaEnvironment\\downloadMaven\\org\\apache\\logging\\log4j\\log4j-api\\2.10.0\\log4j-api-2.10.0.jar;D:\\JavaEnvironment\\downloadMaven\\org\\slf4j\\jul-to-slf4j\\1.7.25\\jul-to-slf4j-1.7.25.jar;D:\\JavaEnvironment\\downloadMaven\\javax\\annotation\\javax.annotation-api\\1.3.2\\javax.annotation-api-1.3.2.jar;D:\\JavaEnvironment\\downloadMaven\\org\\yaml\\snakeyaml\\1.19\\snakeyaml-1.19.jar;D:\\JavaEnvironment\\downloadMaven\\org\\springframework\\boot\\spring-boot-starter-json\\2.0.0.RELEASE\\spring-boot-starter-json-2.0.0.RELEASE.jar;D:\\JavaEnvironment\\downloadMaven\\com\\fasterxml\\jackson\\core\\jackson-databind\\2.9.4\\jackson-databind-2.9.4.jar;D:\\JavaEnvironment\\downloadMaven\\com\\fasterxml\\jackson\\core\\jackson-annotations\\2.9.0\\jackson-annotations-2.9.0.jar;D:\\JavaEnvironment\\downloadMaven\\com\\fasterxml\\jackson\\core\\jackson-core\\2.9.4\\jackson-core-2.9.4.jar;D:\\JavaEnvironment\\downloadMaven\\com\\fasterxml\\jackson\\datatype\\jackson-datatype-jdk8\\2.9.4\\jackson-datatype-jdk8-2.9.4.jar;D:\\JavaEnvironment\\downloadMaven\\com\\fasterxml\\jackson\\datatype\\jackson-datatype-jsr310\\2.9.4\\jackson-datatype-jsr310-2.9.4.jar;D:\\JavaEnvironment\\downloadMaven\\com\\fasterxml\\jackson\\module\\jackson-module-parameter-names\\2.9.4\\jackson-module-parameter-names-2.9.4.jar;D:\\JavaEnvironment\\downloadMaven\\org\\springframework\\boot\\spring-boot-starter-tomcat\\2.0.0.RELEASE\\spring-boot-starter-tomcat-2.0.0.RELEASE.jar;D:\\JavaEnvironment\\downloadMaven\\org\\apache\\tomcat\\embed\\tomcat-embed-core\\8.5.28\\tomcat-embed-core-8.5.28.jar;D:\\JavaEnvironment\\downloadMaven\\org\\apache\\tomcat\\embed\\tomcat-embed-el\\8.5.28\\tomcat-embed-el-8.5.28.jar;D:\\JavaEnvironment\\downloadMaven\\org\\apache\\tomcat\\embed\\tomcat-embed-websocket\\8.5.28\\tomcat-embed-websocket-8.5.28.jar;D:\\JavaEnvironment\\downloadMaven\\org\\hibernate\\validator\\hibernate-validator\\6.0.7.Final\\hibernate-validator-6.0.7.Final.jar;D:\\JavaEnvironment\\downloadMaven\\javax\\validation\\validation-api\\2.0.1.Final\\validation-api-2.0.1.Final.jar;D:\\JavaEnvironment\\downloadMaven\\org\\jboss\\logging\\jboss-logging\\3.3.2.Final\\jboss-logging-3.3.2.Final.jar;D:\\JavaEnvironment\\downloadMaven\\com\\fasterxml\\classmate\\1.3.4\\classmate-1.3.4.jar;D:\\JavaEnvironment\\downloadMaven\\org\\springframework\\spring-web\\5.0.4.RELEASE\\spring-web-5.0.4.RELEASE.jar;D:\\JavaEnvironment\\downloadMaven\\org\\springframework\\spring-beans\\5.0.4.RELEASE\\spring-beans-5.0.4.RELEASE.jar;D:\\JavaEnvironment\\downloadMaven\\org\\springframework\\spring-webmvc\\5.0.4.RELEASE\\spring-webmvc-5.0.4.RELEASE.jar;D:\\JavaEnvironment\\downloadMaven\\org\\springframework\\spring-aop\\5.0.4.RELEASE\\spring-aop-5.0.4.RELEASE.jar;D:\\JavaEnvironment\\downloadMaven\\org\\springframework\\spring-context\\5.0.4.RELEASE\\spring-context-5.0.4.RELEASE.jar;D:\\JavaEnvironment\\downloadMaven\\org\\springframework\\spring-expression\\5.0.4.RELEASE\\spring-expression-5.0.4.RELEASE.jar;D:\\JavaEnvironment\\downloadMaven\\org\\slf4j\\slf4j-api\\1.7.25\\slf4j-api-1.7.25.jar;D:\\JavaEnvironment\\downloadMaven\\org\\springframework\\spring-core\\5.0.4.RELEASE\\spring-core-5.0.4.RELEASE.jar;D:\\JavaEnvironment\\downloadMaven\\org\\springframework\\spring-jcl\\5.0.4.RELEASE\\spring-jcl-5.0.4.RELEASE.jar com.liang.lessonIp.TcpClientDemo2
hello world+++梁伟浩Process finished with exit code 0
1.6、TCP
文件上传
- 发送文件(服务端)
package com.liang.lessonIp;import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
//发送文件(再开启)
public class TcpClientDemo3 {public static void main(String[] args) throws Exception {//1.创建一个socket连接Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);//2.创建一个输出流OutputStream os = socket.getOutputStream();//3.读取文件FileInputStream fis = new FileInputStream(new File("D:\\\\IdeaStudySpace\\\\JavaStudy\\\\src\\\\猪.gif"));//4.写出文件byte[] bytes = new byte[1024];int len;while ((len=fis.read(bytes))!=-1){os.write(bytes,0,len);}//通知服务器,我已经结束了socket.shutdownOutput();//我已经传输完了//确认服务器接收完毕,才能够断开连接InputStream inputStream = socket.getInputStream();//string byte[] 管道流ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] bytes1 = new byte[1023];int len2;while ((len2=inputStream.read(bytes1))!=-1){baos.write(bytes1,0,len2);}System.out.println(baos.toString());//关闭资源,先开后关baos.close();inputStream.close();fis.close();os.close();socket.close();}
}
- 接收文件(客户端)
package com.liang.lessonIp;import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;//接收文件(先开启)
public class TcpClientDemo4 {public static void main(String[] args) throws Exception {//1.创建服务ServerSocket serverSocket = new ServerSocket(9000);//2.监听客户端的连接Socket socket = serverSocket.accept();//阻塞式监听,会一直等待客户端连接//3.获取输入流InputStream is = socket.getInputStream();//4.文件输出FileOutputStream fos = new FileOutputStream(new File("lwh.gif"));byte[] bytes = new byte[1024];int len;while ((len=is.read(bytes))!=-1){fos.write(bytes,0,len);}//通知客户端我接受完毕了OutputStream os = socket.getOutputStream();os.write("我接受完毕了,你可以断开了".getBytes());//关闭资源,先开后关is.close();fos.close();os.close();socket.close();serverSocket.close();}
}
Tomcat
服务端
-
自定义S
-
Tomcat服务器 S
客户端
- 自定义 C
- 浏览器 B
1.7、UDP
发送消息
服务端
package com.liang.lessonIp;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;//不需要连接服务器
public class UdpClient {public static void main(String[] args) throws Exception{//1.建立一个socketDatagramSocket socket = new DatagramSocket();//2.建个包String msg = "你好,服务器";//发送给谁InetAddress localhost = InetAddress.getByName("localhost");int port = 9090;//数据,数据的长度起始,要发送给谁DatagramPacket packet = new DatagramPacket(msg.getBytes(),0, msg.getBytes().length, localhost,port);//3.发送包socket.send(packet);//关闭流socket.close();}
}
接收端
package com.liang.lessonIp;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;//还是要等待客户端的连接
public class UdpServer {public static void main(String[] args) throws Exception{//1.开放端口DatagramSocket socket = new DatagramSocket(9090);//2.接收数据包byte[] bytes = new byte[1024];DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length);//阻塞接收socket.receive(packet);System.out.println(packet.getAddress().getHostAddress());System.out.println(new String(packet.getData(),0,packet.getLength()));//关闭流socket.close();}
}
咨询
循环发送消息
package com.liang.lessonIp;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;public class UdpSenderChat {public static void main(String[] args) throws Exception {DatagramSocket socket = new DatagramSocket(8888);//准备数据,从控制台获取 system.inBufferedReader reader = new BufferedReader(new InputStreamReader(System.in));while (true) {String data = reader.readLine();byte[] bytes = data.getBytes();DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, new InetSocketAddress("localhost", 6666));socket.send(packet);if (data.equals("bye")) {break;}}socket.close();}
}
循环接收信息
package com.liang.lessonIp;import java.net.DatagramPacket;
import java.net.DatagramSocket;public class UdbReceiveChat {public static void main(String[] args) throws Exception {DatagramSocket socket = new DatagramSocket(6666);
while (true) {//准备接收包裹byte[] container = new byte[1024];DatagramPacket packet = new DatagramPacket(container, 0, container.length);socket.receive(packet);//阻塞式接收包裹//断开连接 byebyte[] data = packet.getData();String s = new String(data, 0, data.length);System.out.println(s);if (s.equals("bye")) {break;}
}
socket.close();}
}
多线程咨询
发送端
package com.liang.lessonIp;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.Socket;public class TaskSend implements Runnable{DatagramSocket socket= null;BufferedReader reader = null;private int fromPort;private String toIP;private int toPort;public TaskSend(int fromPort, String toIP, int toPort) {this.fromPort = fromPort;this.toIP = toIP;this.toPort = toPort;try {socket = new DatagramSocket(fromPort);reader = new BufferedReader(new InputStreamReader(System.in));}catch (Exception e) {e.printStackTrace();}}@Overridepublic void run() {while (true) {String data = null;try {data = reader.readLine();byte[] bytes = data.getBytes();DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, new InetSocketAddress(this.toIP, this.toPort));socket.send(packet);if (data.equals("bye")) {break;}} catch (IOException e) {throw new RuntimeException(e);}}socket.close();}
}
接收端
package com.liang.lessonIp;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;public class TaskReceive implements Runnable{DatagramSocket socket= null;private int port;private String msgFrom;public TaskReceive(int port,String msgFrom) {this.port = port;this.msgFrom = msgFrom;try {socket = new DatagramSocket(port);} catch (SocketException e) {e.printStackTrace();}}@Overridepublic void run() {while (true) {//准备接收包裹try {byte[] container = new byte[1024];DatagramPacket packet = new DatagramPacket(container, 0, container.length);socket.receive(packet);//阻塞式接收包裹//断开连接 byebyte[] data = packet.getData();String s = new String(data, 0, data.length);System.out.println(s);System.out.println(msgFrom+s);if (s.equals("bye")) {break;}} catch (IOException e) {throw new RuntimeException(e);}}socket.close();}
}
开启学生线程
package com.liang.lessonIp;public class TalkStudent {public static void main(String[] args) {//开启两个线程new Thread(new TaskSend(7777,"localhost",9999)).start();new Thread(new TaskReceive(8888, "老师")).start();}}
开启老师线程
package com.liang.lessonIp;public class TalkTeacher {public static void main(String[] args) {new Thread(new TaskSend(5555,"localhost",8888)).start();new Thread(new TaskReceive(9999, "学生")).start();}
}
1.8、URL
https://www.baidu.com/
统一资源定位符:定位资源的,定位互联网上的某一个资源DNS 域名解析www.baidu.com xxx.X…x…x
1 协议: //ip地址:端口/ 项目名/资源
package com.liang.lessonIp;import java.net.MalformedURLException;
import java.net.URL;public class URL01 {public static void main(String[] args) throws MalformedURLException {URL url = new URL("http://localhost:8080");System.out.println(url.getProtocol());//协议System.out.println(url.getPort());//端口System.out.println(url.getHost());//主机IPSystem.out.println(url.getQuery());//静态资源}
}