【从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();

    }
}

运行结果:


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

相关推荐
一定要AK23 分钟前
Spring 入门核心笔记
java·笔记·spring
A__tao24 分钟前
Elasticsearch Mapping 一键生成 Java 实体类(支持嵌套 + 自动过滤注释)
java·python·elasticsearch
AI成长日志29 分钟前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
KevinCyao38 分钟前
java视频短信接口怎么调用?SpringBoot集成视频短信及回调处理Demo
java·spring boot·音视频
迷藏49444 分钟前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源
_李小白1 小时前
【OSG学习笔记】Day 38: TextureVisitor(纹理访问器)
android·笔记·学习
wuxinyan1232 小时前
Java面试题47:一文深入了解Nginx
java·nginx·面试题
新知图书2 小时前
搭建Spring Boot开发环境
java·spring boot·后端
冰河团队2 小时前
一个拉胯的分库分表方案有多绝望?整个部门都在救火!
java·高并发·分布式数据库·分库分表·高性能