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

    }
}

运行结果:


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

相关推荐
_Johnny_17 分钟前
ETCD 配额/空间告警模拟方案
网络·数据库·etcd
CHENKONG_CK18 分钟前
晨控CK-LR08-E00与汇川H5U系列PLC配置MODBUSTCP通讯连接手册
linux·服务器·网络
天荒地老笑话么20 分钟前
静态 IP 规划:掩码/网关/DNS 的正确组合
网络·网络协议·tcp/ip·网络安全
dingdingfish28 分钟前
Bash学习 - 第3章:Basic Shell Features,第5节:Shell Expansions
开发语言·学习·bash
不倒翁玩偶29 分钟前
IDEA导入新的SpringBoot项目没有启动按钮
java·spring boot·intellij-idea
Tadas-Gao36 分钟前
TCP粘包现象的深度解析:从协议本质到工程实践
网络·网络协议·云原生·架构·tcp
firewood202436 分钟前
共射三极管放大电路相关情况分析
笔记·学习
zl0_00_036 分钟前
美亚2023
学习
AI_567840 分钟前
SQL性能优化全景指南:从量子执行计划到自适应索引的终极实践
数据库·人工智能·学习·adb
小小小米粒44 分钟前
Maven Tools
java