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();
        }
    }
相关推荐
Hacker_xingchen4 小时前
网络安全需要学多久才能入门?
网络·安全·web安全
中草药z9 小时前
【RabbitMQ】RabbitMQ的核心概念与七大工作模式
分布式·学习·中间件·消息队列·rabbitmq·queue·工作模式
中东大鹅9 小时前
Linux 的at定时任务
linux·服务器·网络
修昔底德9 小时前
费曼学习法13 - 数据表格的魔法:Python Pandas DataFrame 详解 (Pandas 基础篇)
python·学习·pandas
xyeternals10 小时前
【TCP/IP协议栈】1. TCP/IP协议栈概述(体系、四/五层模型、IP、MAC)
网络·tcp/ip·计算机网络
云上艺旅11 小时前
K8S学习之基础十一:容器钩子
学习·云原生·容器·kubernetes
rorg11 小时前
搭建laravle 数字产品销售平台 php
php·laravel
2301_8153577012 小时前
Tomcat原理:HTTP协议与HTTPS协议
服务器·网络·http
银河麒麟操作系统12 小时前
【银河麒麟高级服务器操作系统实际案例分享】数据库资源重启现象分析及处理全过程
linux·运维·服务器·开发语言·网络·数据库·开源