• java 26


    TCP传输

      Socket和ServerSocket

      建立客户端和服务器

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

      关闭socket

      同样,客户端与服务器是两个独立的应用程序

    TCP协议发送和接收数据的思路图解:

     

    TCP传输-客户端思路

      1:建立客户端的Socket服务,并明确要连接的服务器。

      2:如果连接建立成功,就表明,已经建立了数据传输的通道.就可以在该通道通过IO进行数据的读取和写入.该通道称为Socket流,Socket流中既有读取流,也有写入流.

      3:通过Socket对象的方法,可以获取这两个流

      4:通过流的对象可以对数据进行传输

      5:如果传输数据完毕,关闭资源

    代码体现:

     1 /*
     2      TCP客户端:
     3          A:创建发送端的Socket对象,寻找到相对应的IP和端口以后,连接就建立成功
     4              Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。    
     5          B:创建输出流对象发送数据
     6          C:创建输入流对象接收数据
     7          D:释放资源
     8          
     9     连接被拒绝。TCP协议一定要先启动服务器端,再开客户端
    10       java.net.ConnectException: Connection refused: connect
    11  */
    12 public class ClientDemo {
    13     public static void main(String[] args) throws IOException, IOException {
    14         
    15         //A:创建发送端的Socket对象
    16         //Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。    
    17         Socket s = new Socket("172.19.xx.xx",10010);
    18     
    19         //B:创建输出流对象发送数据
    20         OutputStream os = s.getOutputStream();
    21         os.write("我来拉!!".getBytes());
    22         
    23         //C:创建输入流对象接收数据
    24         InputStream is = s.getInputStream();
    25         byte[] bys = new byte[1024];
    26         int len = is.read(bys);//阻塞式
    27         String str = new String(bys,0,len);
    28         System.out.println(str);
    29         
    30         //释放资源
    31         s.close();
    32     
    33     }
    34 }

    TCP传输—服务端思路

      1:建立服务器端的socket服务,需要一个端口

      2:服务端没有直接流的操作,而是通过accept方法获取客户端对象,在通过获取到的客户端对象的流和客户端进行通信

      3:通过客户端的获取流对象的方法,读取数据或者写入数据

      4:如果服务完成,需要关闭客户端,然后关闭服务器,但是,一般会关闭客户端,不会关闭服务器,因为服务端是一直提供服务的

    代码体现:

     1 /*
     2      TCP服务器端:
     3          A:创建服务端对象ServerSocket,监听窗口
     4          B:通过accept方法返回一个Socket对象
     5          // public Socket accept()
     6          C:获取Socket的输入流,读取客户端发来的数据,并打印到控制台
     7          D:创建输出流发送数据
     8          E:释放资源
     9  */
    10 
    11 public class ServerDemo {
    12 
    13     public static void main(String[] args) throws IOException {
    14 
    15         // A:创建服务端对象ServerSocket,监听窗口
    16         ServerSocket ss = new ServerSocket(10010);
    17 
    18         // B:通过accept方法返回一个Socket对象
    19         // public Socket accept()
    20         Socket s = ss.accept();//阻塞式,等待客户端的连接
    21 
    22         // C:获取Socket的输入流,读取客户端发来的数据,并打印到控制台
    23         // public InputStream getInputStream() 返回此套接字的输入流
    24         InputStream is = s.getInputStream();
    25 
    26         // 读取数据
    27         byte[] bys = new byte[1024];
    28         int len = is.read(bys);// 阻塞式,等待客户端传输数据
    29         // InputStrem : public int read()
    30         // 从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。
    31         // 如果因为已经到达流末尾而没有可用的字节,则返回值 -1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。
    32         String str = new String(bys, 0, len);
    33 
    34         // 获取客户端的名称
    35         // 获取客户端的地址对象,再获取名称
    36         String name = s.getInetAddress().getHostName();
    37 
    38         //打印数据到控制台
    39         System.out.println("从"+name+"发送: "+str);
    40         
    41         // D:创建输出流发送数据
    42         OutputStream os = s.getOutputStream();
    43         os.write("数据已收到".getBytes());
    44 
    45         // E:释放资源
    46         s.close();// 释放客户端的资源
    47         // ss.close(); 这个不能释放,因为一释放,服务器就关闭了。
    48         
    49 
    50     }
    51 }
  • 相关阅读:
    【洛谷P4838】P哥破解密码【矩阵乘法】
    2019年暑假 纪中培训总结
    Objective-C中的@property和@synthesize用法
    转载: C#: Left outer joins with LINQ
    SQL 查询某字段id为空(不为空)
    聚类算法(五)--层次聚类(系统聚类)及超易懂实例分析
    聚类算法(四)--DBSCAN
    聚类算法(二)--BIRCH
    聚类算法(二)--Kmeans++、elkan K-Means、Mini Batch K-Means、Sequential Leader Clustering
    聚类算法(一)--Kmeans
  • 原文地址:https://www.cnblogs.com/LZL-student/p/5964723.html
Copyright © 2020-2023  润新知