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 ,输入命令

shell 复制代码
ipconfig

去查询

测试网络是否通畅

shell 复制代码
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

服务器端代码:

java 复制代码
 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();
        }
    }

客户端代码:

java 复制代码
 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接口

java 复制代码
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;
    }
}

客户端代码:

java 复制代码
 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();
        }
    }

服务器端代码:

java 复制代码
 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 多线程接收多客户端请求

服务器端创建线程类:

java 复制代码
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方法

java 复制代码
 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();
        }
    }

客户端

java 复制代码
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();
        }
    }
相关推荐
24zhgjx-fuhao几秒前
ISIS:单区域集成ISIS
网络·智能路由器
不爱洗脚的小滕21 分钟前
【RAG】Milvus 混合检索参数调优:ef / candidate_k / final_k 详解
网络·langchain·milvus·rag
飞翔中文网33 分钟前
Java学习笔记之抽象类
java·笔记·学习
夜月yeyue1 小时前
KCP 与 UDP 可靠传输
linux·网络·单片机·网络协议·udp·php
一个向上的运维者1 小时前
Docker 自定义网络中容器无法通过宿主机 IP 访问服务的完整排障记录
网络·tcp/ip·docker
Kiling_07041 小时前
Java IO流:字节流实战与性能优化
java·开发语言·php
Esaka_Forever1 小时前
few‑shot learning(少样本学习)
人工智能·学习
utf8mb4安全女神1 小时前
子网划分【概念+实操+理解】
运维·服务器·网络
码语智行1 小时前
拦截器、接口限流、过滤器、防重发/幂等性功能说明
开发语言·网络·python
志栋智能2 小时前
超自动化安全:构建智能安全运营的神经系统
大数据·运维·网络·人工智能·安全·自动化