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

    }
}

运行结果:


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

相关推荐
Evan芙6 分钟前
搭建nexus服务,实现本地仓库、代理仓库
java·nginx·tomcat
崇山峻岭之间9 分钟前
Matlab学习笔记02
笔记·学习·matlab
乂爻yiyao13 分钟前
Java LTS版本重要升级特性对照表
java·开发语言
原来是好奇心27 分钟前
深入Spring Boot源码(六):Actuator端点与监控机制深度解析
java·开发语言·源码·springboot
适应规律1 小时前
UNeXt-Stripe网络架构解释
网络
叠叠乐1 小时前
robot_state_publisher 参数
java·前端·算法
Kiri霧1 小时前
Range循环和切片
前端·后端·学习·golang
过期动态1 小时前
JDBC高级篇:优化、封装与事务全流程指南
android·java·开发语言·数据库·python·mysql
WizLC1 小时前
【Java】各种IO流知识详解
java·开发语言·后端·spring·intellij idea
Mr.朱鹏1 小时前
SQL深度分页问题案例实战
java·数据库·spring boot·sql·spring·spring cloud·kafka