Java之TCP,UDP综合小练习一

4. 综合练习

练习一:多发多收

需求:

客户端:多次发送数据

服务器:接收多次接收数据,并打印

代码示例:

java 复制代码
public class Client {
    public static void main(String[] args) throws IOException {
        //客户端:多次发送数据
        //服务器:接收多次接收数据,并打印
​
        //1. 创建Socket对象并连接服务端
        Socket socket = new Socket("127.0.0.1",10000);
​
        //2.写出数据
        Scanner sc = new Scanner(System.in);
        OutputStream os = socket.getOutputStream();
​
        while (true) {
            System.out.println("请输入您要发送的信息");
            String str = sc.nextLine();
            if("886".equals(str)){
                break;
            }
            os.write(str.getBytes());
        }
        //3.释放资源
        socket.close();
    }
}
public class Server {
    public static void main(String[] args) throws IOException {
        //客户端:多次发送数据
        //服务器:接收多次接收数据,并打印
​
        //1.创建对象绑定10000端口
        ServerSocket ss = new ServerSocket(10000);
​
        //2.等待客户端来连接
        Socket socket = ss.accept();
​
        //3.读取数据
        InputStreamReader isr = new InputStreamReader(socket.getInputStream());
        int b;
        while ((b = isr.read()) != -1){
            System.out.print((char)b);
        }
​
        //4.释放资源
        socket.close();
        ss.close();
    }
}

练习二:接收并反馈

  • 案例需求

    客户端:发送数据,接受服务器反馈

    服务器:收到消息后给出反馈

  • 案例分析

    • 客户端创建对象,使用输出流输出数据

    • 服务端创建对象,使用输入流接受数据

    • 服务端使用输出流给出反馈数据

    • 客户端使用输入流接受反馈数据

  • 代码实现

    java 复制代码
    // 客户端
    public class ClientDemo {
        public static void main(String[] args) throws IOException {
            Socket socket = new Socket("127.0.0.1",10000);
    ​
            OutputStream os = socket.getOutputStream();
            os.write("hello".getBytes());
           // os.close();如果在这里关流,会导致整个socket都无法使用
            socket.shutdownOutput();//仅仅关闭输出流.并写一个结束标记,对socket没有任何影响
            
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line;
            while((line = br.readLine())!=null){
                System.out.println(line);
            }
            br.close();
            os.close();
            socket.close();
        }
    }
    // 服务器
    public class ServerDemo {
        public static void main(String[] args) throws IOException {
            ServerSocket ss = new ServerSocket(10000);
    ​
            Socket accept = ss.accept();
    ​
            InputStream is = accept.getInputStream();
            int b;
            while((b = is.read())!=-1){
                System.out.println((char) b);
            }
    ​
            System.out.println("看看我执行了吗?");
    ​
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
            bw.write("你谁啊?");
            bw.newLine();
            bw.flush();
    ​
            bw.close();
            is.close();
            accept.close();
            ss.close();
        }
    }

练习三:上传练习(TCP协议)

  • 案例需求

    客户端:数据来自于本地文件,接收服务器反馈

    服务器:接收到的数据写入本地文件,给出反馈

  • 案例分析

    • 创建客户端对象,创建输入流对象指向文件,每读一次数据就给服务器输出一次数据,输出结束后使用shutdownOutput()方法告知服务端传输结束

    • 创建服务器对象,创建输出流对象指向文件,每接受一次数据就使用输出流输出到文件中,传输结束后。使用输出流给客户端反馈信息

    • 客户端接受服务端的回馈信息

  • 相关方法

    方法名 说明
    void shutdownInput() 将此套接字的输入流放置在"流的末尾"
    void shutdownOutput() 禁止用此套接字的输出流
  • 代码实现

    java 复制代码
    public class Client {
        public static void main(String[] args) throws IOException {
            //客户端:将本地文件上传到服务器。接收服务器的反馈。
            //服务器:接收客户端上传的文件,上传完毕之后给出反馈。
    ​
    ​
            //1. 创建Socket对象,并连接服务器
            Socket socket = new Socket("127.0.0.1",10000);
    ​
            //2.读取本地文件中的数据,并写到服务器当中
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream("mysocketnet\\clientdir\\a.jpg"));
            BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
            byte[] bytes = new byte[1024];
            int len;
            while ((len = bis.read(bytes)) != -1){
                bos.write(bytes,0,len);
            }
    ​
            //往服务器写出结束标记
            socket.shutdownOutput();
    ​
    ​
            //3.接收服务器的回写数据
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line = br.readLine();
            System.out.println(line);
    ​
    ​
            //4.释放资源
            socket.close();
    ​
        }
    }
    public class Server {
        public static void main(String[] args) throws IOException {
            //客户端:将本地文件上传到服务器。接收服务器的反馈。
            //服务器:接收客户端上传的文件,上传完毕之后给出反馈。
    ​
    ​
            //1.创建对象并绑定端口
            ServerSocket ss = new ServerSocket(10000);
    ​
            //2.等待客户端来连接
            Socket socket = ss.accept();
    ​
            //3.读取数据并保存到本地文件中
            BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("mysocketnet\\serverdir\\a.jpg"));
            int len;
            byte[] bytes = new byte[1024];
            while ((len = bis.read(bytes)) != -1){
                bos.write(bytes,0,len);
            }
            bos.close();
            //4.回写数据
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            bw.write("上传成功");
            bw.newLine();
            bw.flush();
    ​
            //5.释放资源
            socket.close();
            ss.close();
        }
    }

练习四:文件名重复

复制代码
 ```java
java 复制代码
public class UUIDTest { public static void main(String[] args) { String str = UUID.randomUUID().toString().replace("-", ""); System.out.println(str);//9f15b8c356c54f55bfcb0ee3023fce8a } } ```

public class Client {
    public static void main(String[] args) throws IOException {
        //客户端:将本地文件上传到服务器。接收服务器的反馈。
        //服务器:接收客户端上传的文件,上传完毕之后给出反馈。
​
​
        //1. 创建Socket对象,并连接服务器
        Socket socket = new Socket("127.0.0.1",10000);
​
        //2.读取本地文件中的数据,并写到服务器当中
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("mysocketnet\\clientdir\\a.jpg"));
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
        byte[] bytes = new byte[1024];
        int len;
        while ((len = bis.read(bytes)) != -1){
            bos.write(bytes,0,len);
        }
​
        //往服务器写出结束标记
        socket.shutdownOutput();
​
​
        //3.接收服务器的回写数据
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String line = br.readLine();
        System.out.println(line);
​
​
        //4.释放资源
        socket.close();
​
    }
}
public class Server {
    public static void main(String[] args) throws IOException {
        //客户端:将本地文件上传到服务器。接收服务器的反馈。
        //服务器:接收客户端上传的文件,上传完毕之后给出反馈。
​
​
        //1.创建对象并绑定端口
        ServerSocket ss = new ServerSocket(10000);
​
        //2.等待客户端来连接
        Socket socket = ss.accept();
​
        //3.读取数据并保存到本地文件中
        BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
        String name = UUID.randomUUID().toString().replace("-", "");
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("mysocketnet\\serverdir\\" + name + ".jpg"));
        int len;
        byte[] bytes = new byte[1024];
        while ((len = bis.read(bytes)) != -1) {
            bos.write(bytes, 0, len);
        }
        bos.close();
        //4.回写数据
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bw.write("上传成功");
        bw.newLine();
        bw.flush();
​
        //5.释放资源
        socket.close();
        ss.close();
    }
相关推荐
色空大师几秒前
23种设计模式
java·开发语言·设计模式
闲人一枚(学习中)1 分钟前
设计模式-创建型-建造者模式
java·设计模式·建造者模式
yuwinter13 分钟前
鸿蒙HarmonyOS学习笔记(2)
笔记·学习·harmonyos
Bruce小鬼13 分钟前
QT文件基本操作
开发语言·qt
2202_7544215419 分钟前
生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件
java·linux·开发语言
蓝染-惣右介21 分钟前
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
java·数据库·tomcat·mybatis
小林想被监督学习22 分钟前
idea怎么打开两个窗口,运行两个项目
java·ide·intellij-idea
HoneyMoose24 分钟前
IDEA 2024.3 版本更新主要功能介绍
java·ide·intellij-idea
我只会发热26 分钟前
Java SE 与 Java EE:基础与进阶的探索之旅
java·开发语言·java-ee
是老余27 分钟前
本地可运行,jar包运行错误【解决实例】:通过IDEA的maven package打包多模块项目
java·maven·intellij-idea·jar