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();
        }
    }
相关推荐
网硕互联的小客服35 分钟前
Apache 如何支持SHTML(SSI)的配置方法
运维·服务器·网络·windows·php
苏琢玉1 小时前
如何让同事自己查数据?写一个零依赖 PHP SQL 查询工具就够了
mysql·php
非凡ghost2 小时前
AMS PhotoMaster:全方位提升你的照片编辑体验
windows·学习·信息可视化·软件需求
共享家95273 小时前
linux-数据链路层
linux·网络·macos
云间月13144 小时前
飞算JavaAI智慧教育场景实践:从个性化学习到教学管理的全链路技术革新
学习·飞算javaai挑战赛
189228048616 小时前
NY243NY253美光固态闪存NY257NY260
大数据·网络·人工智能·缓存
weixin_456904276 小时前
一文讲清楚Pytorch 张量、链式求导、正向传播、反向求导、计算图等基础知识
人工智能·pytorch·学习
全栈软件开发6 小时前
PHP域名授权系统网站源码_授权管理工单系统_精美UI_附教程
开发语言·ui·php·php域名授权·授权系统网站源码
玩转以太网7 小时前
3 种方式玩转网络继电器!W55MH32 实现网页 + 阿里云 + 本地控制互通
网络·物联网·阿里云