背景知识
-
计算机网络
-
互联网
-
IP
-
端口
-
URL
-
B/S,C/S
-
分层
- ISO标准(物理,数据链路,网络,传输,会话,表示,应用)
- TCP/IP协议集(网络接口,网络层、传输层、应用层)
-
应用层:HTTP、FTP、DNS、SMTP、Telnet
-
传输层:TCP、UDP
-
数据包
知识点
- HTTP
- InetAddress
- InetSocketAddress
- URL
- HttpURLConnection
- TCP协议
- ServerSocket
- Socket
- UDP协议
- DatagramPacket
- DatagramSocket
命题
- 计算机网络是计算机之间建立的通信网络。
- 通信网络是个体之间传递信息的网络,比如邮政网络、快递网络、手机网络。
- 计算机信息是通过网络设备进行传输。
- 计算机信息是二进制的数字信息。
- 计算机在网络中需要用IP作为身份标识。
- 计算机中有多个应用,端口是应用在网络中的标识。
- 应用拥有多个资源,URI是应用资源的标识。
- URI(统一资源标志符)分为URL(统一资源定位符)和URN(统一资源名称)。
- 计算机网路分为局域网和互联网。
- 局域网是封闭的私有网络,私有IP。
- 互联网是开放的公共网络,共有IP。
- 网络中传输的是数据包,类似于快递包裹。
- 数据包传输过程需要底层网络设备支持,比如网线、集线器、路由器。
- 数据传输必须保证数据的完整性,就要求网络可用性、高效性、稳定性,所以将传输过程通过分层进行解耦,分层来解决可用性、高效性、稳定性、完整性。
- 网络使用的TCP/IP分层方案。
- 应用开发者只关心传输层和应用层。
- 传输层负责数据包的传递工作,类似于快递公司,只负责运输过程,不关心包裹内容。
- 传输层的工具是socket,有TCP和UDP两种传输协议。
- 应用层负责数据内容规范,类似于信件格式,不同信件,格式不同。
- 互联网三大基石:HTTP、HTML、URL。
- TCP传输是安全的,保证数据一定能传递成功,代价是占用资源多、性能低。
- UDP传输是不安全的,只负责数据发送,不关心接收情况,优点是占用资源少,性能高,代价是可能丢包。
实际案例
- 信息订阅
- 点对点传输
- 聊天室
- 爬虫
代码案例
TCP-server
/**
* TCP服务器端,接收和处理客户端信息
* 1、创建服务器socket对象,ServerSocket,侦听1003端口
* 2、侦听端口,
* 3、准备输入和输出对象
* 4、输入对象读取客户端消息
* 5、输出对象返回消息
* 6、释放资源
*
* @author jeadong
*
*/
public class TcpServer {
public static void main(String[] args) throws Exception {
// * 1、创建服务器socket对象,ServerSocket,侦听1003端口
ServerSocket serverSocket = new ServerSocket(1003);
// * 2、侦听端口
System.out.println("服务器接收消息中...");
Socket socket = serverSocket.accept();
// * 3、准备输入和输出对象
DataInputStream reader = new DataInputStream(socket.getInputStream());
// * 4、输入对象读取客户端消息
System.out.println("收到客户端消息,准备处理...");
System.out.println("client:"+reader.readUTF());
// * 5、输出对象返回消息
DataOutputStream writer = new DataOutputStream(socket.getOutputStream());
writer.writeUTF("收到!");
writer.flush();
// * 6、释放资源
reader.close();
writer.close();
socket.close();
serverSocket.close();
}
}
TCP-client
/**
* TCP客户端,向服务器发送消息
* 1、创建socket对象,指定服务器IP+端口
* 2、准备输入和输出对象
* 3、发送消息
* 4、接收消息
* 5、释放资源
*
* @author jeadong
*
*/
public class TcpClient {
public static void main(String[] args) throws Exception {
// * 1、创建socket对象,指定服务器IP+端口、
Socket socket = new Socket(InetAddress.getLocalHost(),1003);
// * 2、准备输入和输出对象
DataOutputStream writer = new DataOutputStream(socket.getOutputStream());
// * 3、发送消息
System.out.println("客户端准备发送消息...");
writer.writeUTF("hello server!");
writer.flush();
System.out.println("发送消息结束");
// * 4、接收消息
System.out.println("准备接收服务器反馈...");
DataInputStream reader = new DataInputStream(socket.getInputStream());
System.out.println("server:"+reader.readUTF());
// * 5、释放资源
reader.close();
writer.close();
socket.close();
}
}
UDP-server
/**
* 消息推送者:给订阅者推送消息
* 1、创建UDP消息发送socket对象,发送端口1002,DatagramSocket
* 2、准备发送信息内容
* 3、创建发送消息容器,DatagramPacket
* 4、准备发送地址
* 5、发送消息
*
* @author jeadong
*
*/
public class UdpServer {
public static void main(String[] args) throws Exception {
// * 1、创建UDP消息发送socket对象,发送端口1002,DatagramSocket
DatagramSocket socket = new DatagramSocket(1002);
// * 2、准备发送信息内容
byte[] b = "hello world!".getBytes();
// * 3、创建接受消息容器,DatagramPacket
DatagramPacket packet = new DatagramPacket(b,b.length);
// * 4、准备发送地址
packet.setSocketAddress(new InetSocketAddress("localhost", 1001));
// * 5、发送消息
System.out.println("消息推送者,准备推送信息...");
socket.send(packet);
System.out.println("消息推送者,推送信息完成。");
socket.close();
}
}
UDP-client
/**
* 消息订阅者:接收服务器推送消息
* 1、创建UDP消息接收socket对象,接收端口1001,DatagramSocket
* 2、创建接收消息容器,DatagramPacket
* 3、接收消息
* 4、收到消息
*
* @author jeadong
*
*/
public class UdpClient {
public static void main(String[] args) throws Exception {
// * 1、创建UDP消息接收对象,接收端口1001,DatagramSocket
DatagramSocket socket = new DatagramSocket(1001);
// * 2、创建接收消息容器,DatagramPacket
byte[] b = new byte[1024];
DatagramPacket packet = new DatagramPacket(b,b.length);
// * 3、接收消息
System.out.println("消息订阅者,接收消息中...");
socket.receive(packet);
// * 4、收到消息
String string = new String(packet.getData(),0,packet.getLength());
System.out.println("收到消息:"+string);
socket.close();
}
}