笔记-15 网络编程入门 UDP通信程序 TCP通信程序 练习

问答题

题目1

请写出端口号的范围

0 ~ 65535

题目2

判断下列说法是否正确:

由于TCP是面向连接的协议,可以保证数据的完整性,因此在传输重要数据时建议采用TCP协议.

正确,TCP协议是面向连接的,3次握手的过程,可以保证数据的完整性;

题目3

TCP协议中”三次握手”,指的是什么?

第一次握手,客户端向服务器端发出连接请求,等待服务器确认

第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求

第三次握手,客户端再次向服务器端发送确认信息,确认连接
对应的代码就是 创建客户端对象的时候,就会自动完成”三次握手”的操作;如果不能完成”三次握手”,那么创建对象会失败;

综合编程题

题目4

假如你需要设计一个小游戏,当客户端将一段文字发送给服务器后,服务器会将文字反转然后再发回给客户端;请使用程序实现效果;

要求:

客户端通过键盘输入得到一个字符串发给服务器.(键盘输入不要求循环,发一次即可,如果想增强,也可以把键盘输入加上循环,并自己制定结束的标记)

效果:

在这里插入图片描述

在这里插入图片描述

参考代码:

public class MyClient {
    public static void main(String[] args) throws IOException {
        Socket s = new Socket("127.0.0.1",8888);
        //键盘输入数据,并发给服务器
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一句话:");
        String next = sc.next();
        s.getOutputStream().write(next.getBytes());
        s.shutdownOutput();//让服务器端结束循环读的行为
        //接受服务器的响应
        InputStream in = s.getInputStream();
        byte[] arr = new byte[1024*8];
        int i;
        System.out.print("我是客户端,我收到的服务器响应是:");
        while ((i=in.read(arr))!=-1){
            System.out.print(new String(arr,0,i));
        }
        System.out.println();
        s.close();
    }
}
class MyServer{
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(8888);
        Socket s = ss.accept();//接受客户端请求
        //读数据
        InputStream in = s.getInputStream();
        byte[] arr = new byte[1024*8];
        int i;
        //创建sb,用于保存每次循环收到的客户端发送的数据
        StringBuilder sb = new StringBuilder();
        while ((i=in.read(arr))!=-1){
            sb.append(new String(arr,0,i));
        }
        System.out.print("我是服务器端,我收到的客户端请求是:");
        System.out.println(sb);
        s.getOutputStream().write(sb.reverse().toString().getBytes());
        s.shutdownOutput();
        s.close();
        ss.close();
    }
}

题目5

假如你想通过程序和同桌建立沟通,请设计一个程序模拟飞秋的聊天功能;

提示:

客户端和服务器端分别都需要写两个线程呦;

要求:

1:客户端(你)需求: 能够通过键盘录入不断地向服务端发送数据.也能接收到服务端发过来的数据.

2:服务端(你同桌)要求: 能够接收客户端的信息.能够通过键盘录入向浏览器发送数据.

3:输入"886" 结束聊天,停止程序;

效果:

在这里插入图片描述

在这里插入图片描述

参考代码:

public class MyClient {
    public static void main(String[] args) throws IOException {
        Socket s = new Socket("127.0.0.1",9999);
        //创建一个线程,专门负责给服务器发送数据
        new Thread(()->{
            try {
                //键盘输入数据,并发给服务器
                Scanner sc = new Scanner(System.in);
                while (true){
                    System.out.println("我是客户端,请输入您想对服务器说的话:");
                    String next = sc.next();
                    if("886".equals(next)){
                        System.out.println("客户端结束输入了!");
                        break;
                    }
                    s.getOutputStream().write(next.getBytes());
                    
                }
                s.shutdownOutput();//让服务器端结束循环读的行为
            } catch (Exception e) {
                e.printStackTrace();
            }
        }).start();

        //创建一个线程,专门负责读服务器数据
        new Thread(()->{
            try {
                //接受服务器的响应
                InputStream in = s.getInputStream();
                byte[] arr = new byte[1024*8];
                int i;
                while ((i=in.read(arr))!=-1){
                    System.out.print("我是客户端,我收到的服务器响应是:");
                    System.out.println(new String(arr,0,i));
                }
                System.out.print("我是客户端,我停止接受服务器消息了");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }).start();
    }
}
class MyServer{
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(9999);
        Socket s = ss.accept();//接受客户端请求
        //创建一个线程,专门负责读客户端发送的数据
        new Thread(()->{
            try {
                //读客户端的数据
                InputStream in = s.getInputStream();
                byte[] arr = new byte[1024*8];
                int i;
                while ((i=in.read(arr))!=-1){
                    System.out.print("我是服务器,我收到客户端发来的信息是:");
                    System.out.println(new String(arr,0,i));
                }
                System.out.print("我是服务器,我停止接受客户端消息了!");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }).start();

        //给客户端发数据
        new Thread(()->{
            try {
                //键盘输入数据,并发给客户端
                Scanner sc = new Scanner(System.in);
                while (true){
                    System.out.println("我是服务器,请输入您想对客户端说的话:");
                    String next = sc.next();
                    if("886".equals(next)){
                        System.out.println("服务器结束输入了!");
                        break;
                    }
                    s.getOutputStream().write(next.getBytes());
                }
                s.shutdownOutput();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }).start();
    }
}

题目6

模拟网站下载图片的功能,先让客户端给服务器发请求,告诉服务器要下载的文件名,然后服务器就给客户端传递文件,直至传递完成;

要求:

1:服务器使用线程池完成,每次客户请求下载文件时,就使用一个线程与客户端交互;

2:要求客户端保存文件时文件名使用UUID随机生成;

效果:

在这里插入图片描述
在这里插入图片描述

参考代码:

public class MyClient {
    public static void main(String[] args) throws IOException {
        Socket s = new Socket("127.0.0.1",6666);
         //键盘输入数据,并发给服务器
         Scanner sc = new Scanner(System.in);
         System.out.println("我是客户端,请输入您想下载的文件名:");
         String next = sc.next();
         s.getOutputStream().write((next).getBytes());
         s.shutdownOutput();
        //读服务器的数据并写入本地文件
        InputStream in = s.getInputStream();
        byte[] arr = new byte[1024*8];
        BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream("D:\\"+ UUID.randomUUID().toString().replace("-","")+".jpg"));
        int i;
        while ((i=in.read(arr))!=-1){
            bout.write(arr,0,i);
            bout.flush();
        }
        bout.close();
        s.close();
        System.out.print("我是客户端,我下载文件成功了!");
    }
}
class MyServer{
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(6666);
        ExecutorService pool = Executors.newFixedThreadPool(10);
        while (true){
            System.out.println("服务器已经就绪,等待客户端请求下载...");
            Socket s = ss.accept();//接受客户端请求
            pool.submit(()->{
                try {
                    //读客户端的数据
                    InputStream in = s.getInputStream();
                    byte[] arr = new byte[1024*8];
                    int i=in.read(arr);
                    String name = new String(arr, 0, i);
                    System.out.println("我是服务器,我收到客户端发来的想要下载的文件名是:"+name);
                    //开始给客户端响应文件信息
                    OutputStream out = s.getOutputStream();
                    BufferedInputStream bin = new BufferedInputStream(new FileInputStream("E:\\"+name));
                    while ((i=bin.read(arr))!=-1){
                        out.write(arr,0,i);
                    }
                    s.shutdownOutput();
                    System.out.println("我是服务器的"+Thread.currentThread().getName()+"线程,本次下载任务已完成!");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        }
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值