2025.3.1学习内容----网络编程
2025.3.2学习内容
网络编程
一 计算机网络基础知识
1.1 IP地址
IP:唯一标识网络上的每一台计算机
IP组成:32位,由4个8位二进制数组成
二进制不方便记忆,转变为十进制进行使用的
192.168.1.200
1.2 IP组成
IP共分为 A B C D E类
IP地址 = 网络地址 +主机地址
网络地址:标识计算机或网络设备所在的网段
主机地址:标识特定主机或网络设备
1.3 IP的配置及检测
查看IP地址,检测网络是否畅通
查看本机IP地址,win+r 输入cmd ,输入命令
ipconfig
去查询
测试网络是否通畅
ping 目标IP地址
DNS域名解析:DNS:Domain Name System,域名系统
将IP地址转换为域名
1.4网络服务器
二 Socket简介
2.1 什么是Socket?
Socket的底层机制复杂,Java平台提供了一些简单的API,可以更简单有效的使用Socket开发而无需了解底层机制
通信链路的端点就被称为“套接字”(英文名Socket)
是提供给应用程序的接口
2.2Socket编程
2.2.1Socket编程步骤
2.3 Socket编程代码示例
2.3.1 发送字符串
创建一个服务项目project_server,再创建一个客户端项目project_client
服务器端代码:
public static void main(String[] args) {
//1、创建服务器的端点对象
try {
ServerSocket serverSocket = new ServerSocket(5000);
//2 、监听并接收客户端的socket请求
Socket socket = serverSocket.accept(); //客户端
//3、从socket中获取二进制输入流信息
InputStream is = socket.getInputStream(); //字节流
Reader reader = new InputStreamReader(is);
BufferedReader br = new BufferedReader(reader);
String line=null;
while ((line=br.readLine())!=null){
System.out.println("客户端说:"+line);
}
//服务器端给客户端的反馈
OutputStream os = socket.getOutputStream();//输出流对象
Writer writer=new OutputStreamWriter(os);
BufferedWriter bw=new BufferedWriter(writer);
String str="用户名和密码正确,欢迎登录!";
bw.write(str);
bw.flush();
bw.close();
writer.close();
os.close();
//
br.close();
reader.close();
is.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
客户端代码:
public static void main(String[] args) {
// 登录场景:
//1、客户端的端点
try {
Socket socket=new Socket("localhost",5000); //localhost代码本机
OutputStream os = socket.getOutputStream();//输出流对象
Writer writer=new OutputStreamWriter(os);
BufferedWriter bw=new BufferedWriter(writer);
String str="用户名:admin,密码:123456";
bw.write(str);
bw.flush();
socket.shutdownOutput(); //停掉输出流
//原因: 客户端要接收服务端的流信息,需要暂时停掉输出流
//客户端接收
InputStream is = socket.getInputStream(); //字节流
Reader reader = new InputStreamReader(is);
BufferedReader br = new BufferedReader(reader);
String line=null;
while ((line=br.readLine())!=null){
System.out.println("服务说:"+line);
}
br.close();
reader.close();
is.close();
//
bw.close();
writer.close();
os.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
2.3.2 发送对象
在客户端与服务器端都创建一个User对象,实现Serializable接口
import java.io.Serializable;
public class User implements Serializable {
private String userNo;
private String userPwd;
public User() {
}
public User(String userNo, String userPwd) {
this.userNo = userNo;
this.userPwd = userPwd;
}
public String getUserNo() {
return userNo;
}
public void setUserNo(String userNo) {
this.userNo = userNo;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
}
客户端代码:
public static void main(String[] args) {
try {
Socket socket=new Socket("localhost",5001);
OutputStream os = socket.getOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(os);
User u1=new User("15386880458","123");
oos.writeObject(u1);
oos.flush();
oos.close();
os.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
服务器端代码:
public static void main(String[] args) {
try {
ServerSocket serverSocket=new ServerSocket(5001);
Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
ObjectInputStream ois=new ObjectInputStream(is);
Object object = ois.readObject();
User user=(User)object;
System.out.println("客户端发送的对象,账号是:"+user.getUserNo()+",密码是:"+user.getUserPwd());
ois.close();
is.close();
socket.close();
serverSocket.close();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
2.3.3 多线程接收多客户端请求
服务器端创建线程类:
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
public class ClientThread extends Thread {
private Socket socket; //声明一个Socket对象
public ClientThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InetAddress address = socket.getInetAddress(); //此对象可以获取客户端的IP地址
String ip = address.getHostAddress(); //获取客户端的IP地址
InputStream is = socket.getInputStream();
Reader reader = new InputStreamReader(is);
BufferedReader br = new BufferedReader(reader);
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(ip + "客户端:" + line);
}
br.close();
reader.close();
is.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
super.run();
}
}
服务器端Main方法
public static void main(String[] args) {
try {
ServerSocket serverSocket=new ServerSocket(8081);
while (true){
Socket socket = serverSocket.accept();
//创建一个线程:线程中包含的代码是从socket中读取流信息
ClientThread ct=new ClientThread(socket); //调用类的无参构造方法
ct.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
客户端
public static void main(String[] args) {
try {
Socket socket=new Socket("localhost",8081); //localhost代码本机
OutputStream os = socket.getOutputStream();//输出流对象
Writer writer=new OutputStreamWriter(os);
BufferedWriter bw=new BufferedWriter(writer);
String str="你吃饭了吗?";
bw.write(str);
bw.flush();
bw.close();
writer.close();
os.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}