zoukankan      html  css  js  c++  java
  • Tcp通讯协议

    了解了Udp通讯协议之后,我们再认识一个常用的通讯协议:Tcp

    Tcp传输特点:

    --依赖于Socket和ServerSocket对象

    --建立客户端和服务端

    --建立连接后,通过Socket中的 IO 流进行数据的传输

    --关闭Scoket

    下面通过一个简单的例子认识一下:

    --tcp分客户端和服务端

    --客户端对应的对象是Socker

       服务端对应的对象是ServerSocket

    //客户端:

    package com.shindo.java.tcp;
    import java.io.*;
    import java.net.*;
    
    /**
     * 客户端:
     * 通过查询Socket对象,发现在该对象建立时,就可以去连接指定的主机,
     * 因为Tcp是面向连接的,所以在建立Socket服务时,就要有服务端存在,并连接成功,形成通路后,在该通道进行数据传输
     * 
     * 需求:给服务端发送一个文本数据
     */
    public class TcpClient {
        public static void main(String[] args)throws Exception{
            //创建客户端的Socket服务,指定目的主机和端口
            Socket s = new Socket("127.0.0.1",11012);
            
            //为了发送数据,应获取Socket流中的输出流
            OutputStream out = s.getOutputStream();//使用字节流
            
            out.write("This's the first Tcp test Demo".getBytes());
            
            //因为流是通过Socket获得的,所有一旦Socket关闭,流也随之关闭
            s.close();
        }
    }

    //服务端:

    package com.shindo.java.tcp;
    import java.io.*;
    import java.net.*;
    /**
     * 需求:定义端点接收数据,并打印在控制台上
     * 
     * 1、简历ServerSocket服务,并监听一个端口
     * 2、获取连接过来的客户端对象
     *    通过ServerSocket的accept()方法,没有连接就会等,所以这个方法是阻塞的。
     * 3、客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流
     *  来读取客户端发送过来的数据,并打印控制台;
     * 4、关闭服务端(可选)
     */
    public class TcpServer {
        public static void main(String[] args){
            try {
            //简历服务端Socket服务,并监听一个端口
            ServerSocket ss = new ServerSocket(11012);
            
            //通过accept()方法获取连接过来的客户端对象
            Socket s = ss.accept();
            
            String ip = s.getInetAddress().getHostAddress();
            System.out.println(ip + ".........is connected");
            
            //使用客户端对象的读取流读取客户端发送过来的数据
            InputStream in = s.getInputStream();//实际上是一个网络流
            
            byte[] buf = new byte[1024];
            
            int len = in.read(buf);
            System.out.println(new String(buf,0,len));
            
            s.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
    }

    ============================优雅的分割线============================

    上面这两个例子,实现了客户端向服务端发送文本信息,服务端收到并将其打印到控制台。

    现在我们再对上面两个程序进行一些改造,让服务端接收到客户端的信息后,打印到控制台,并响应信息给客户端;客户端也将服务端响应的信息打印到控制台:

    //客户端:

    package com.shindo.java.tcp;
    import java.io.*;
    import java.net.*;
    
    public class TcpClient2 {
        public static void main(String[] args){
            try {
                Socket s = new Socket("127.0.0.1",11012);
                
                //发送文本数据给客户端
                OutputStream out = s.getOutputStream();
                out.write("This's the better TcpClient test Demo".getBytes());
                
                //读取客户端响应信息
                InputStream in = s.getInputStream();
                byte[] buf = new byte[1024];
                int len = in.read(buf);
                System.out.println(new String(buf,0,len));
                
                s.close();
                
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    View Code

    //服务端:

    package com.shindo.java.tcp;
    import java.io.*;
    import java.net.*;
    
    public class TcpServer2 {
        public static void main(String[] args){
            try {
                //创建服务端,并监听一个端口
                ServerSocket ss = new ServerSocket(11012);
                Socket s = ss.accept();
                
                //获取请求的客户端ip,并打印控制台
                String ip = s.getInetAddress().getHostAddress();
                System.out.println(ip + "........... is connected");
                
                //获取客户端发送过来的数据,并打印控制台
                InputStream in = s.getInputStream();
                byte[] buf = new byte[1024];
                int len = in.read(buf);
                System.out.println(new String(buf,0,len));
                
                //发送响应信息给客户端
                OutputStream out = s.getOutputStream();
                out.write("welcome, client !".getBytes());
                
                s.close();
                ss.close();
                
            } catch (Exception e) {
                e.printStackTrace();
            }
            
            
        }
    }
    View Code

    效果如下:

    客户端接收到服务到响应:

    服务端接收到客户端发过来的数据:

  • 相关阅读:
    Autotools使用流程【转】
    Linux下GCC生成和使用静态库和动态库【转】
    Linux驱动模块的Makefile分析【转】
    GNU C 中零长度的数组【转】
    Linux设备驱动中的IO模型---阻塞和非阻塞IO【转】
    程序(进程)内存分布解析【转】
    【转】用户空间使用i2c_dev--不错
    开源课堂网址
    【转】用Device tree overlay掌控Beaglebone Black的硬件资源
    【转】Device Tree(三):代码分析
  • 原文地址:https://www.cnblogs.com/shindo/p/5297224.html
Copyright © 2011-2022 走看看