TCP通信(四)中

简介: TCP通信(四)

二.四 接收和响应客户端请求数据


二.四.一 客户端


 public static void main(String[] args) {
        try {
            client4Test();
      // 写多个 client5Test(), client6Test() 等
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void client4Test() throws Exception{
        System.out.println("启动客户端");
        BufferedReader bufferedReader=new BufferedReader(new InputStreamReader((System.in)));
        System.out.println("请输入用户名:");
        String userName=bufferedReader.readLine();
        System.out.println("请输入密码:");
        String password=bufferedReader.readLine();
        Socket socket=new Socket("localhost",9999);
        //发送数据
        //客户端的输入
        OutputStream outputStream= socket.getOutputStream();
        DataOutputStream dataOutputStream=new DataOutputStream(outputStream);
        //拼接请求参数
        String query="userName="+userName+"&password="+password;
        dataOutputStream.writeUTF(query);
        dataOutputStream.flush();
        //获取内容
        DataInputStream dataInputStream=new DataInputStream(socket.getInputStream());
        String content=dataInputStream.readUTF();
        System.out.println("接收服务器端返回的内容:"+content);
        dataInputStream.close();
        dataOutputStream.close();
        socket.close();
    }


二.四.二 服务器端


   @Test
    public void server4Test() throws Exception{
        System.out.println("服务器启动中");
        ServerSocket serverSocket=new ServerSocket(9999);
        //阻塞式接收
        Socket client=serverSocket.accept();
        System.out.println("连接一个客户端程序,响应数据");
        InputStream inputStream=client.getInputStream();
        DataInputStream dataInputStream=new DataInputStream(inputStream);
        String query=dataInputStream.readUTF();
        //拆分
        String[] qArr=query.split("&");
        String userName="";
        String password="";
        for(String str:qArr){
            String[] tempArr=str.split("=");
            if("userName".equals(tempArr[0])){
                userName=tempArr[1];
            }else if("password".equals(tempArr[0])){
                password=tempArr[1];
            }
        }
        String responseData="";
        System.out.printf("接收的用户名为:%s,密码为%s",userName,password);
        //返回数据
        if("两个蝴蝶飞".equals(userName)&&"1234".equals(password)){
            responseData="用户名和密码输入正确,登录成功";
        }else{
            responseData="用户名或者密码错误,登录失败";
        }
        DataOutputStream dataOutputStream=new DataOutputStream(client.getOutputStream());
        dataOutputStream.writeUTF(responseData);
        dataOutputStream.close();
        dataInputStream.close();
    }


二.四.三 测试运行


先运行服务器端


20200629091811215.png


再运行客户端, 输入错误的密码


20200629091816285.png


这时,查看服务器端


20200629091826106.png


再次重新测试, 输入正确的用户名和密码


20200629091935963.png


发现,服务器端可以接收客户端传递过来的数据,并且可以响应数据, 客户端也能够获取到响应的数据。


二.五 传输文件


IOUtils 仍然与第二章节的 工具类一致。


二.五.一 客户端


    public static void client5Test() throws Exception{
        System.out.println("启动客户端,发送文件");
        Socket socket=new Socket("localhost",9999);
        //发送数据
        //客户端的输入
        OutputStream outputStream= socket.getOutputStream();
        DataOutputStream dataOutputStream=new DataOutputStream(outputStream);
        String path="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"129.png";
        //将文件转换成字节
        byte[] bytes= IOUtils.fileToByteArray(path);
        //写入图片
        dataOutputStream.write(bytes);
        dataOutputStream.flush();
        DataInputStream dataInputStream=new DataInputStream(socket.getInputStream());
        String content=dataInputStream.readUTF();
        System.out.println("接收服务器端返回的内容:"+content);
        dataInputStream.close();
        dataOutputStream.close();
        socket.close();
    }


二.五.二 服务器端


 @Test
    public void server5Test() throws Exception{
        System.out.println("服务器启动中");
        ServerSocket serverSocket=new ServerSocket(9999);
        //阻塞式接收
        Socket client=serverSocket.accept();
        System.out.println("连接一个客户端程序");
        InputStream inputStream=client.getInputStream();
        DataInputStream dataInputStream=new DataInputStream(inputStream);
        //图片大小为17k, 这儿接收时接收 20k
        byte[] bytes=new byte[1024*20];
        dataInputStream.read(bytes);
        //将字节转换成图片
        String path="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"129Tcp.png";
        IOUtils.byteArrayToFile(bytes,path);
        String responseData="传输文件成功";
        DataOutputStream dataOutputStream=new DataOutputStream(client.getOutputStream());
        dataOutputStream.writeUTF(responseData);
        dataOutputStream.close();
        dataInputStream.close();
    }


二.五.三 测试运行


启动服务器端,再启动客户端, 客户端控制台打印输出


2020062909194973.png


查看文件系统


20200629091953255.png


图片,也可以正常的显示出来,没有破坏。


二.六 经典的 echo 程序


简单来说,就是响应数据 echo:客户端传递过来的数据


二.六.一 单次 echo


二.六.一.一 客户端


  public static void client6Test() throws Exception{
        System.out.println("启动客户端");
        BufferedReader bufferedReader=new BufferedReader(new InputStreamReader((System.in)));
        Socket socket=new Socket("localhost",9999);
        //发送数据
        //客户端的输入
        OutputStream outputStream= socket.getOutputStream();
        DataOutputStream dataOutputStream=new DataOutputStream(outputStream);
        String content=bufferedReader.readLine();
        //写入数据
        dataOutputStream.writeUTF(content);
        DataInputStream dataInputStream=new DataInputStream(socket.getInputStream());
        //读取数据,并且打印
        String respnseContent=dataInputStream.readUTF();
        System.out.println(respnseContent);
        dataInputStream.close();
        dataOutputStream.close();
        socket.close();
    }


二.六.一.二 服务器


  @Test
    public void server6Test() throws Exception{
        System.out.println("服务器启动中");
        ServerSocket serverSocket=new ServerSocket(9999);
        //阻塞式接收
        Socket client=serverSocket.accept();
        System.out.println("连接一个客户端程序");
        InputStream inputStream=client.getInputStream();
        DataInputStream dataInputStream=new DataInputStream(inputStream);
        String content=dataInputStream.readUTF();
        String responseData="echo:"+content;
        DataOutputStream dataOutputStream=new DataOutputStream(client.getOutputStream());
        dataOutputStream.writeUTF(responseData);
        dataOutputStream.close();
        dataInputStream.close();
    }


二.六.一.三 测试运行


先运行服务器端,再运行客户端


20200629092001232.png


二.六.二 多次echo


用while() 进行循环接收控制台传递过来的数据。


二.六.二.一 客户端


public static void client7Test() throws Exception{
        System.out.println("启动客户端,多次echo 程序");
        BufferedReader bufferedReader=new BufferedReader(new InputStreamReader((System.in)));
        Socket socket=new Socket("localhost",9999);
        //发送数据
        //客户端的输入
        OutputStream outputStream= socket.getOutputStream();
        DataOutputStream dataOutputStream=new DataOutputStream(outputStream);
        DataInputStream dataInputStream=new DataInputStream(socket.getInputStream());
        boolean isRun=true;
        while(isRun){
            //循环接收数据
            String content=bufferedReader.readLine();
            dataOutputStream.writeUTF(content);
            String respnseContent=dataInputStream.readUTF();
            System.out.println(respnseContent);
            if("bye".equalsIgnoreCase(content)||"quit".equalsIgnoreCase(content)){
                break;
            }
        }
        dataInputStream.close();
        dataOutputStream.close();
        socket.close();
    }


二.六.二.二 服务器端


  @Test
    public void server7Test() throws Exception{
        System.out.println("服务器启动中");
        ServerSocket serverSocket=new ServerSocket(9999);
        boolean isRun=true;
        while(isRun){
            //阻塞式接收
            Socket client=serverSocket.accept();
            System.out.println("连接一个客户端程序");
            InputStream inputStream=client.getInputStream();
            DataInputStream dataInputStream=new DataInputStream(inputStream);
            DataOutputStream dataOutputStream=new DataOutputStream(client.getOutputStream());
            boolean isBye=false;
            while(!isBye){
                String content=dataInputStream.readUTF();
                String responseData="";
                if("bye".equalsIgnoreCase(content)||"quit".equalsIgnoreCase(content)){
                    responseData="echo:欢迎下次再来";
                    isBye=true;
                }else{
                    responseData= "echo:"+content;
                }
                dataOutputStream.writeUTF(responseData);
            }
            dataOutputStream.close();
            dataInputStream.close();
        }
    }



相关文章
|
网络协议 物联网 开发者
NB-IoT 通信之 TCP 收发数据 | 学习笔记
快速学习 NB-IoT 通信之 TCP 收发数据
NB-IoT 通信之 TCP 收发数据 | 学习笔记
|
3月前
|
网络协议 安全 网络安全
网络编程:基于socket的TCP/IP通信。
网络编程:基于socket的TCP/IP通信。
215 0
|
5月前
|
网络协议 安全 Java
Java网络编程入门涉及TCP/IP协议理解与Socket通信。
【6月更文挑战第21天】Java网络编程入门涉及TCP/IP协议理解与Socket通信。TCP/IP协议包括应用层、传输层、网络层和数据链路层。使用Java的`ServerSocket`和`Socket`类,服务器监听端口,接受客户端连接,而客户端连接指定服务器并交换数据。基础示例展示如何创建服务器和发送消息。进阶可涉及多线程、NIO和安全传输。学习这些基础知识能助你构建网络应用。
48 1
|
网络协议
计算机通信地址【图解TCP/IP(笔记六)】
计算机通信地址【图解TCP/IP(笔记六)】
113 0
|
6月前
|
网络协议 安全 Java
Java网络编程入门指南:TCP/IP协议与Socket通信
Java网络编程入门指南:TCP/IP协议与Socket通信
151 1
|
SQL 网络协议 前端开发
🚀超级简单的图解TCP/IP,看不懂来打我:OSI模型与通信示例🚀
🚀超级简单的图解TCP/IP,看不懂来打我:OSI模型与通信示例🚀
|
存储 网络协议 前端开发
OSI参考模型通信处理例子【图解TCP/IP(笔记四)】
OSI参考模型通信处理例子【图解TCP/IP(笔记四)】
159 0
|
监控 网络协议 安全
一文了解HTTP、HTTPS、TCP、UDP、Websocket(论点:概念、通信流程、异同点、应用领域)
一文了解HTTP、HTTPS、TCP、UDP、Websocket(论点:概念、通信流程、异同点、应用领域)
|
网络协议
Netty实现TCP通信
Netty实现TCP通信
|
网络协议 Unix Linux
linux网络编程(三) TCP通信时序与多进程/线程并发服务器的编写
linux网络编程(三) TCP通信时序与多进程/线程并发服务器的编写
347 0
linux网络编程(三) TCP通信时序与多进程/线程并发服务器的编写