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

    }
}

运行结果:


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

相关推荐
脸大是真的好~3 分钟前
黑马JAVAWeb-10 文件上传-文件存储到服务器本地磁盘-文件存储在阿里云OSS-@Value属性注入
java
qq_254674415 分钟前
华为交换机上配置基于 IP 地址的 ACL
网络
大G的笔记本13 分钟前
算法篇常见面试题清单
java·算法·排序算法
宁雨桥16 分钟前
WebSocket 核心 API 速查表
网络·websocket·网络协议
亚林瓜子16 分钟前
Spring中的异步任务(CompletableFuture版)
java·spring boot·spring·async·future·异步
MuYiLuck23 分钟前
redis持久化与集群
java·数据库·redis
打不了嗝 ᥬ᭄26 分钟前
【Linux】网络层协议
linux·网络·c++·网络协议·http
一叶飘零_sweeeet28 分钟前
Java 项目 HTTP+WebSocket 统一权限控制实战
java·websocket·http·权限控制
7澄133 分钟前
深入解析 LeetCode 数组经典问题:删除每行中的最大值与找出峰值
java·开发语言·算法·leetcode·intellij idea
ysyxg38 分钟前
设计模式-策略模式
java·开发语言