【从0开始学习Java | 第21篇】网络编程综合练习

文章目录

  • [TCP通信练习1 --- 多发多收](#TCP通信练习1 --- 多发多收)
  • [TCP通信练习2 --- 接收和反馈](#TCP通信练习2 --- 接收和反馈)
  • [TCP通信练习3 --- 上传文件(结合io流)🐦‍🔥](#TCP通信练习3 --- 上传文件(结合io流)🐦‍🔥)
  • [TCP通信练习5 --- 上传文件(多线程版)🐦‍🔥👏🤔](#TCP通信练习5 --- 上传文件(多线程版)🐦‍🔥👏🤔)
  • [TCP通信练习7 --- BS架构模型(接受浏览器的消息并打印)](#TCP通信练习7 --- BS架构模型(接受浏览器的消息并打印))

TCP通信练习1 --- 多发多收

java 复制代码
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class E1_TCP_Client {
    public static void main(String []args) throws IOException {
        Socket socket = new Socket("127.0.0.1",10086);
        OutputStream os = socket.getOutputStream();
        Scanner sc = new Scanner(System.in);
        while(true) {
            String str = sc.nextLine();
            os.write(str.getBytes());
            if("886".equals(str))
                break;
        }
        os.close();
        socket.close();
    }
}


===========================================================


import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class E1_TCP_Server {
    public static void main(String []args) throws IOException {

        ServerSocket ss = new ServerSocket(10086);
            Socket sk = ss.accept();
            InputStream is = sk.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            int c;
            while((c=isr.read())!=-1) {
                System.out.print((char)c);
            }
            System.out.println();
            sk.close();
            ss.close();

    }
}

TCP通信练习2 --- 接收和反馈

java 复制代码
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class E2_TCP_Client {
    // 客户端:发送一条数据,接收服务端反馈的消息并打印
    // 服务器:接收数据并打印,再给客户端反馈消息
    public static void main(String[] args) throws IOException {
        // 1.创建Socket对象并连接服务器
        Socket sk = new Socket("127.0.0.1", 10086);

        // 2.写出数据
        OutputStream sr = sk.getOutputStream();
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        sr.write(str.getBytes());

        // 写一个结束标记
        sk.shutdownOutput();

        // 3.接收服务端回写的数据
        InputStreamReader isr = new InputStreamReader(sk.getInputStream()) ;
        int num ;
        while((num = isr.read())!=-1){
            System.out.print((char)num);
        }

        sr.close();
        sk.close();

    }
}


===============================================================


import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class E2_TCP_Server {
    public static void main(String[] args) throws IOException {
        // 客户端:发送一条数据,接收服务端反馈的消息并打印
        // 服务器:接收数据并打印,再给客户端反馈消息

        // 1.创建对象并绑定10086端口
        ServerSocket ss = new ServerSocket(10086);

        // 2.等待客户端连接
        Socket sk = ss.accept();

        // 3.从Socket中获取输入流读取数据
        InputStreamReader isr = new InputStreamReader(sk.getInputStream());
        int num ;
        // 注意:read方法会从连接通道中读取数据,但是需要有一个结束标记才能让循环停止
        while((num = isr.read())!=-1){
            System.out.print((char)num);
        }

        // 4.回写数据
        String str = "我不想聊了,好烦,滚";
        OutputStream os = sk.getOutputStream();
        os.write(str.getBytes());

        isr.close();
        ss.close();

    }
}

TCP通信练习3 --- 上传文件(结合io流)🐦‍🔥

java 复制代码
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class E3_TCP_Client {
    public static void main(String []args) throws IOException {
        // 客户端:将本地文件上传到服务器,后接收服务器的反馈
        // 服务器:接收客户端上传的文件,上传完毕后给出反馈

        // 1.创建Socket对象,连接服务器
        Socket sk = new Socket("127.0.0.1",10086);


        // 2.读取本地文件中的数据,并写到服务器中
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("网络编程\\ClientDir\\Photo.jpg"));
        BufferedOutputStream bos = new BufferedOutputStream(sk.getOutputStream());
        byte []bytes = new byte[1024];
        int len;
        while((len = bis.read(bytes))!=-1){
            bos.write(bytes,0,len);
        }

        // 往服务端写出结束标记
        sk.shutdownOutput();

        // 3.接收服务端的回写数据
        BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream()));
        String line = br.readLine();
        System.out.println(line);

        // 4.释放资源
        sk.close();
    }
}

===========================================================


import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class E3_TCP_Server {
    public static void main(String[] args) throws IOException {
        // 客户端:将本地文件上传到服务器,后接收服务器的反馈
        // 服务器:接收客户端上传的文件,上传完毕后给出反馈

        // 1.创建对象并绑定端口
        ServerSocket ss = new ServerSocket(10086);

        // 2.等待客户端连接
        Socket sk = ss.accept();

        // 读取数据并存入本地文件夹中
        BufferedInputStream bis = new BufferedInputStream(sk.getInputStream());
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("网络编程\\ServerDir\\Photo.jpg"));

        int len;
        byte []bytes = new byte[1024];
        while ((len = bis.read(bytes)) != -1) {
            bos.write(bytes,0,len);
        }

        // 4.回写数据     字节流转换成字符流再用缓冲流包裹
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
        bw.write("上传成功");
        bw.newLine();
        bw.flush();

        // 5.关闭资源
        sk.close();
        ss.close();

    }
}

TCP通信练习5 --- 上传文件(多线程版)🐦‍🔥👏🤔

java 复制代码
import java.io.*;
import java.net.Socket;

public class E5_TCP_Client {
    public static void main(String []args) throws IOException {
        // 可以实现多用户上传数据【多线程】
        // 客户端:将本地文件上传到服务器,后接收服务器的反馈
        // 服务器:接收客户端上传的文件,上传完毕后给出反馈

        // 1.创建Socket对象,连接服务器
        Socket sk = new Socket("127.0.0.1",10086);


        // 2.读取本地文件中的数据,并写到服务器中
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("网络编程\\ClientDir\\Photo.jpg"));
        BufferedOutputStream bos = new BufferedOutputStream(sk.getOutputStream());
        byte []bytes = new byte[1024];
        int len;
        while((len = bis.read(bytes))!=-1){
            bos.write(bytes,0,len);
        }

        // 往服务端写出结束标记
        sk.shutdownOutput();

        // 3.接收服务端的回写数据
        BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream()));
        String line = br.readLine();
        System.out.println(line);

        // 4.释放资源
        sk.close();
    }
}


======================================================

import java.io.*;
import java.net.Socket;
import java.util.UUID;

public class E5_TCP_MyRunnable implements Runnable{

    Socket sk;
    public  E5_TCP_MyRunnable(Socket sk){
        this.sk = sk;
    }

    public void run() {
        try {
            // 读取数据并存入本地文件夹中
            BufferedInputStream bis = new BufferedInputStream(sk.getInputStream());

            // 产生随机名称的函数 (去掉随机数中的横杠"-")
            String name = UUID.randomUUID().toString().replace("-","");
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("网络编程\\ServerDir\\"+name+".jpg"));

            int len;
            byte[] bytes = new byte[1024];
            while ((len = bis.read(bytes)) != -1) {
                bos.write(bytes, 0, len);
            }

            // 4.回写数据     字节流转换成字符流再用缓冲流包裹
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
            bw.write("上传成功");
            bw.newLine();
            bw.flush();

        }catch(Exception e){
            e.printStackTrace();
        }finally {
            // 5.关闭资源
            if(sk != null) {
                try {
                    sk.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

===========================================================

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;

public class E5_TCP_Server {
    public static void main(String[] args) throws IOException {
        // 可以实现多用户上传数据【多线程】
        // 客户端:将本地文件上传到服务器,后接收服务器的反馈
        // 服务器:接收客户端上传的文件,上传完毕后给出反馈

        // 创建线程池对象
        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                3, // 核心线程数量
                16, // 线程池总大小
                60, // 空闲时间
                TimeUnit.SECONDS, // 单位时间(单位)
                new ArrayBlockingQueue<>(2), // 阻塞队列
                Executors.defaultThreadFactory(), // 线程工厂
                new ThreadPoolExecutor.AbortPolicy() // 拒绝策略
        );

        // 1.创建对象并绑定端口
        ServerSocket ss = new ServerSocket(10086);

        while(true) {
            // 2.等待客户端连接
            Socket sk = ss.accept();

            // 每有一个用户就开启一个线程

                // 普通创建线程
            //new Thread(new E5_TCP_MyRunnable(sk)).start();

                // 使用线程池
            pool.submit(new E5_TCP_MyRunnable(sk));
        }

    }
}

运行结果:

TCP通信练习7 --- BS架构模型(接受浏览器的消息并打印)

代码跟练习1的Server代码一样,只是客户端变为了浏览器,在浏览器里面输入127.0.0.1:对应的端口号即可实现

java 复制代码
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class E1_TCP_Server {
    public static void main(String []args) throws IOException {

        ServerSocket ss = new ServerSocket(10086);
            Socket sk = ss.accept();
            InputStream is = sk.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            int c;
            while((c=isr.read())!=-1) {
                System.out.print((char)c);
            }
            System.out.println();
            sk.close();
            ss.close();

    }
}

运行结果:


如果我的内容对你有帮助,请 点赞 , 评论 , 收藏 。创作不易,大家的支持就是我坚持下去的动力!

相关推荐
小陈phd1 分钟前
多模态大模型学习笔记(二十一)—— 基于 Scaling Law方法 的大模型训练算力估算与 GPU 资源配置
笔记·深度学习·学习·自然语言处理·transformer
丝斯20114 分钟前
AI学习笔记整理(75)——Python学习4
人工智能·笔记·学习
大傻^13 分钟前
Spring AI Alibaba ChatClient实战:流式输出与多轮对话管理
java·人工智能·后端·spring·springai·springaialibaba
小帅学编程15 分钟前
英语学习笔记
java·笔记·学习
AI成长日志15 分钟前
【datawhale】hello agents开源课程学习记录第4章:智能体经典范式构建
学习·开源
EnglishJun18 分钟前
ARM嵌入式学习(七)--- 汇编基础(数据指令、函数调用原理、中断原理)
arm开发·学习
今儿敲了吗21 分钟前
python基础学习笔记第七章——文件操作
笔记·python·学习
学编程就要猛24 分钟前
JavaEE初阶:文件操作和IO
java·java-ee
ba_pi24 分钟前
每天写点什么2026-03-19-Doris三种存储模型
java·数据库·mysql
程序员老乔27 分钟前
Java 新纪元 — JDK 25 + Spring Boot 4 全栈实战(二):Valhalla落地,值类型如何让电商DTO内存占用暴跌
java·spring boot·c#