B站地址
P2: 网络通信的两个要素如何实现网络通信?
通信双方地址- IP(本机:127.0.0.1)
- 端口号
TCP,UDP
网络协议
小结- 网络编程的两个主要问题
- 如何准确定位到网络的一台主机,(ping www.baidu.com)
- 找到主机后如何通信
- 网络编程中的两个要素
- IP,端口号
- 网络通信协议
重要:
- TCP: 用户传输协议
- UDP: 用户数据报协议
出名的协议
- TCP
- IP:网络互连协议
TCP: 打电话
-
连接,稳定
-
三次握手, 四次挥手
最少需要三次,保证稳定连接: A: 你愁啥? B: 瞅你咋地? C: 干一场! 挥手: A: 我要走了 B: 你真的要走了吗? B: 你真的真的要走了吗? A: 我真的要走了 -
客户端,服务端
-
传输完成,释放连接,效率低
UDP:发短信
- 不连接,不稳定
- 客户端服务端没有明确的界限
- 不管准没准备好,都可以发送
客户端
- 连接服务器 Socket
- 发送消息
服务器
- 建立服务的端口 ServerSocket
- 等待用户的连接 accept
- 接受用户的消息
package net;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.charset.StandardCharsets;
public class TcpClientDemo01 {
public static void main(String[] args) {
InetAddress serverIP = null;
int port;
Socket socket = null;
OutputStream os = null;
try {
// 要知道服务器的地址和端口号
serverIP = InetAddress.getByName("127.0.0.1");
port = 9999;
// 创建socket连接
socket = new Socket(serverIP, port);
// 发送消息IO流
os = socket.getOutputStream();
os.write("你好".getBytes());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (os != null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket != null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
package net;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServerDemo01 {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
try {
// 服务器得有一个地址和端口号
serverSocket = new ServerSocket(9999);
// 等待客户端连接
socket = serverSocket.accept();
// 读取客户端信息
is = socket.getInputStream();
// 管道流
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());
} catch (Exception e) {
e.printStackTrace();
} finally {
if(baos!=null){
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(serverSocket!=null){
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
P7: TCP发送文件
客户端:
- 创建一个Socket连接
- 创建一个输出流
- 读取文件
- 写出文件
- 资源关闭
服务器:
- 创建服务
- 监听客户的连接
- 获取输入流
- 文件输出
- 资源关闭
package net;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
public class TcpClientDemo02 {
public static void main(String[] args) throws Exception{
// 创建一个socket连接
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
// 创建一个输出流
OutputStream os = socket.getOutputStream();
// 读取文件
FileInputStream fis = new FileInputStream(new File("awt.jpg"));
// 写出文件
byte[] buffer = new byte[1024];
int len;
while ((len=fis.read(buffer)) != -1){
os.write(buffer,0,len);
}
// 通知服务器发送完毕
socket.shutdownOutput();
// 确定服务器接收完毕,才能断开连接
InputStream inputStream = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer2 = new byte[1024];
int len2;
while ((len2=inputStream.read(buffer2)) != -1){
baos.write(buffer2,0,len2);
}
// 关闭资源
fis.close();
os.close();
socket.close(); }
}
package net;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServerDemo02 {
public static void main(String[] args) throws Exception{
// 创建服务
ServerSocket serverSocket = new ServerSocket(9000);
// 监听客户的连接
Socket socket = serverSocket.accept();
// 获取输入流
InputStream is = socket.getInputStream();
// 文件输出
FileOutputStream fos = new FileOutputStream(new File("receive.jpg"));
byte[] buffer = new byte[1024];
int len;
while ((len=is.read(buffer)) != -1){
fos.write(buffer,0,len);
}
// 通知客户端已接收完毕
OutputStream outputStream = socket.getOutputStream();
outputStream.write("服务器已接收完毕".getBytes());
// 资源关闭
fos.close();
is.close();
socket.close();
serverSocket.close();
}
}
P10: UDP 聊天
发送方:
- 创建一个Socket
- 创建数据包
- 发送包
- 关闭资源
接收方:
- 开放端口
- 接收包
- 关闭资源
package net;
import java.awt.desktop.SystemEventListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;
public class UdpSenderDemo01 {
public static void main(String[] args) throws Exception{
// 建立一个Socket
DatagramSocket socket = new DatagramSocket(8888);
// 准备数据:控制台读取 System.in
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
// while 持续读入
while (true){
String data = reader.readLine(); // 逐行读
byte[] datas = data.getBytes(StandardCharsets.UTF_8);
// 获得数据包 packet
DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress("localhost", 6666));
// 发送数据包
socket.send(packet);
if (data.equals("bye")){
break;
}
}
socket.close();
}
}
package net;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpReceiverDemo01 {
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);
// 控制台输出
byte[] data = packet.getData();
String receiveData = new String(data, 0, data.length);
System.out.println(receiveData);
// 接收bye,断开连接
if (receiveData.equals("bye")){
break;
}
}
socket.close();
}
}
P12: URL 下载网络资源
package net;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class UrlDemo01 {
public static void main(String[] args) throws Exception{
// 下载地址
//URL url = new URL("https://m701.music.126.net/20211217212830/0551953f3b50d1fa77927d2c9cebb97c/jdyyaac/obj/w5rDlsOJwrLDjj7CmsOj/11761709819/4577/762b/203b/6029dd290fb6ce2b75ad9ae1ed725843.m4a");
URL url = new URL("https://m701.music.126.net/20211217213530/43f3b9c5d4e8f7f0089f3471f9d509ce/jdyyaac/obj/w5rDlsOJwrLDjj7CmsOj/11909294918/9853/00a1/0b04/761cd8b125d406f8a760240150046af3.m4a");
// 连接到这个资源
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
InputStream is = urlConnection.getInputStream();
FileOutputStream fos = new FileOutputStream("夜是克莱茵兰的忧伤.mp4");
byte[] buffer = new byte[1024];
int len;
while ((len=is.read(buffer)) != -1){
fos.write(buffer,0,len);
}
fos.close();
is.close();
urlConnection.disconnect();
}
}



