1.概述
(1)什么是计算机网络?
计算机网络是通过传输介质、通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来的,实现资源共享和数据传输的系统。
(2)什么是网络编程?
网络编程不等于网站编程,网络编程即使用套接字来达到进程间通信,现在一般称为TCP/IP编程。
(3)OSI网络模型和TCP/IP模型对应的网络协议?
(4)什么是TCP连接的三次握手和四次挥手?
TCP是面向连接的协议,因此每个TCP连接都有3个阶段:连接建立、数据传送和连接释放。连接建立经历三个步骤,通常称为“三次握手”。
确定应答后建立连接,进行数据传输
注意:为什么连接的时候是三次握手,关闭的时候却是四次挥手?
因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭socket,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文,我收到了”。只有等到服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送,故需要四步挥手。
2.IP协议
(1)特点:
- 每个人的电脑都有一个独一无二的IP地址,这样互相通信时就不会传错信息了。
- IP地址是用一个点来分成四段的,在计算机内部IP地址是用四个字节来表示的,一个字节代表一段,每一个字节代表的数最大只能到达255。
(2)IP地址分类
(3)Java中给我们提供可以获取,查询IP地址的类-InetAddress
此类的常用方法 | 概述 |
---|---|
static InetAddress getByName(String host) | 在给定主机名的情况下确定主机的 IP 地址。 |
String getHostName() | 获取此 IP 地址的主机名 |
String getHostAddress() | 返回 IP 地址字符串 |
static InetAddress getLocalHost() | 返回本地主机 |
byte[] getAddress() | 返回此 InetAddress 对象的原始 IP 地址 |
注意:此类没有构造方法
代码演示:
public class Int {
public static void main(String[] args) {
try {
InetAddress ip = InetAddress.getLocalHost();
System.out.println(ip);
//获得主机名
System.out.println(ip.getHostName());
//获得IP地址
System.out.println(ip.getHostAddress());
InetAddress byName = InetAddress.getByName("www.baidu.com");
System.out.println(byName);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
运行结果:
3.端口:端口表示计算机上的一个程序的进程
(1)特点:
- 不同的进程有不同的端口号!用来区分软件!
- 被规定 0~65535
- 单个协议下,端口号不能冲突
(2)端口的分类
- 公有端口 0~1023
HTTP : 80
HTTPS : 443
FTP : 21 - 程序注册端口:1024~49151, 分配用户或者程序
Tomcat : 8080
MySQL : 3306
Oracle :1521 - 动态、私有:49152~ 65535
(3)InetSocketAddress类
此类的方法 | 概述 |
---|---|
InetSocketAddress(InetAddress addr, int port) | 根据 IP 地址和端口号创建套接字地址。 |
InetSocketAddress(String hostname, int port) | 根据主机名和端口号创建套接字地址。 |
String getHostName() | 获取 hostname |
int getPort() | 获取端口号 |
InetAddress getAddress() | 获取 InetAddress |
代码演示:
import java.net.InetSocketAddress;
public class TestInetSocketAddress {
public static void main(String[] args) {
InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1", 8080);
InetSocketAddress socketAddress2 = new InetSocketAddress("localhost", 8080);
System.out.println(socketAddress);
System.out.println(socketAddress2);
System.out.println(socketAddress.getAddress());
System.out.println(socketAddress.getHostName()); //地址
System.out.println(socketAddress.getPort()); //端口
}
}
运行结果:
4.TCP编程
特点:
- 连接稳定,三次握手,四次挥手。
- 传输完成,释放连接,效率低
- 在网络通讯中,第一次主动发起通讯的程序被作为客户端程序,第一次通讯中等待连接的程序被称作服务器程序
客户端:
- 连接服务器Socket
- 发送消息
public class ChuanShu {
public static void main(String[] args) throws Exception {
InetAddress byName = InetAddress.getByName("127.0.0.1");
int port=9900;
Socket socket = new Socket(byName, port);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("数据传输".getBytes());
socket.close();
}
}
服务端:
- 建立服务的端口 ServerSocket
- 接收accept
- 接受消息
public class FuWu {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(9900);
Socket accept = serverSocket.accept();
InputStream inputStream = accept.getInputStream();
byte[] aByte = new byte[1024];
int len=0;
while ((len=inputStream.read(aByte))!=-1){
String s = new String(aByte, 0, len);
System.out.println(s);
}
accept.close();
serverSocket.close();
}
}
注意:先启动服务端,再启动客户端
5.UDP编程
特点:
- 发短信:不用连接,需要知道对方的地址!不稳定
- 客户端、服务端:没有明确的界限
- 不管有没有准备好,都可以发给你
客户端:
public class ChuanShu {
public static void main(String[] args) throws Exception {
InetAddress byName = InetAddress.getByName("127.0.0.1");
int port=9900;
//建一个包
DatagramSocket datagramSocket = new DatagramSocket();
String msg="你好地球村";
//数据,数据的长度起始,要发送给谁
DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, byName, port);
//发送给谁
datagramSocket.send(datagramPacket);
datagramSocket.close();
}
}
服务端:
public class FuWu {
public static void main(String[] args) throws Exception {
//开放端口
DatagramSocket datagramSocket = new DatagramSocket(9900);
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
//接受消息
datagramSocket.receive(datagramPacket);
System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength()) );
}
}
6.URL
特点:
- URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。
- 也可认为由4部分组成:协议、主机、端口、路径
- 格式:协议://ip地址:端口/项目名/资源
方法实现:
import java.net.MalformedURLException;
import java.net.URL;
//http://localhost:8080/qinjiang/SecurityFile.txt
public class Int {
public static void main(String[] args) throws MalformedURLException {
URL url = new URL("http://localhost:8080/helloworld/index.jsp?username=kuangshen&password=123");
System.out.println(url.getProtocol()); //协议
System.out.println(url.getHost()); //主机ip
System.out.println(url.getPort()); //端口
System.out.println(url.getPath()); //文件
System.out.println(url.getFile()); //全路径
System.out.println(url.getQuery()); //参数
}
}
下载资源:
public class Int {
public static void main(String[] args) throws Exception {
//1. 下载地址
URL url = new URL("https://m10.music.126.net/20191205204321/b3fff75901c4115b40a340c1ce0ffaaf/yyaac/0708/0652/0508/0b9b6827b718aa223af92bd52aa2424f.m4a");
//2. 连接到这个资源 HTTP
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = urlConnection.getInputStream();
FileOutputStream fos = new FileOutputStream("f.m4a");
byte[] buffer = new byte[1024];
int len;
while ((len=inputStream.read(buffer))!=-1){
fos.write(buffer,0,len); //写出这个数据
}
fos.close();
inputStream.close();
urlConnection.disconnect(); //断开连接
}
}