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();
        }
    }
相关推荐
JaguarJack3 小时前
PHP 的异步编程 该怎么选择
后端·php·服务端
BingoGo3 小时前
PHP 的异步编程 该怎么选择
后端·php
JaguarJack18 小时前
为什么 PHP 闭包要加 static?
后端·php·服务端
ServBay2 天前
垃圾堆里编码?真的不要怪 PHP 不行
后端·php
用户962377954482 天前
CTF 伪协议
php
BingoGo4 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack4 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo5 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack5 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack6 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端