zoukankan      html  css  js  c++  java
  • (29)网络编程之TCP通信协议

    TCP通信协议特点:

    1tcp协议是基于IO流进行数据的传输,是面向链接的。

    2tcp进行数据传输的时候,数据没有大小限制的。

    3、面向链接,通过三次握手的机制,保证数据的完整性,是一个可靠的协议。

    4tcp面向连接,所以速度稍微慢一点。

    5TCP是区分客户端和服务端的。

    三次握手机制:保证网络畅通

    比如说,打电话,QQFeiQ的文件传输,迅雷下载等

    TCP通信要掌握Socket相关的两个类

    Socket(客户端类):一旦启动马上要与服务端进行建立连接,一般需要传参:服务器的Address和需要端口

    SeverSocket(服务端类)

    tcp的客户端使用步骤:

    1、建立我们tcp的客户端的服务

    2、获取大对应的流对象。

    3、写出或读取数据

    4.关闭资源

     1 public class Demo1Client
     2 {
     3     public static void main(String[] args) throws IOException, IOException
     4     {
     5         //建立tcp的服务
     6         Socket socket = new Socket(InetAddress.getLocalHost(), 9090);
     7         //获取对应的输出流对象
     8         OutputStream outputStream = socket.getOutputStream();
     9         //利用输出流对象把数据写出即可
    10         outputStream.write("服务端你好呀".getBytes());
    11         
    12         //获取到一个输入流,读取服务端会送的数据
    13         InputStream inputStream =  socket.getInputStream();
    14         int length = 0;
    15         byte[] buf = new byte[1024];
    16         length = inputStream.read(buf);
    17         System.out.println("这是客户端接收到的数据:"+new String(buf, 0, length));
    18         
    19         //关闭资源
    20         socket.close();
    21     }
    22 }

    SeverSocket的使用步骤

    1、建立服务端的服务并且监听端口。

    2、接受客户端的链接,产生一个socket

    3、获取对应的流对象,读取或写出数据。

    4、关闭资源。

     1 public class Demo1Server
     2 {
     3     public static void main(String[] args) throws Exception
     4     {
     5         //建立TCp的服务端,监听一个端口
     6         ServerSocket serverSocket = new ServerSocket(9090);
     7         //接受客户端的链接
     8         Socket socket =  serverSocket.accept();//aacept() 接受客户端的链接,也是一个阻塞性的方法,没有客户端与之连接时,将一直处于阻塞状态
     9         //获取输入流对象,读取客户端发型内容
    10         InputStream inputStream =  socket.getInputStream();
    11         byte[] buf = new byte[1024];
    12         int length = 0;
    13         length = inputStream.read(buf);
    14         System.out.println("服务端接受到:"+new String(buf, 0, length));
    15         
    16         Thread.sleep(600);
    17         
    18         //获取socket输出流对象,向发送端发出数据
    19         OutputStream outputStream =  socket.getOutputStream();
    20         outputStream.write("客户端你要呀,我收到了".getBytes());
    21         
    22         //关闭资源
    23         serverSocket.close();
    24     }
    25 }

    还是应当先启动服务端,这个样子运行客户端的时候才能有地方链接。

    示例:基于TCP的一问一答的聊天:

     1 //聊天客户端 
     2 public class ChatSender {
     3     public static void main(String[] args) throws IOException{
     4         //建立tcp的客户端的服务
     5         Socket socket = new Socket(InetAddress.getLocalHost(), 9090);
     6         //取出socket的输出流,底层操作的是字节流,我们应当使用的是字符流 所以需要使用 输出字节流的转换流
     7         OutputStreamWriter socketOut = new OutputStreamWriter(socket.getOutputStream());
     8         //获取socket的输入流的对象
     9         BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    10         
    11         //获取键盘的输入流对象 一行行的读取数据
    12         BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in));
    13         String line = null;
    14         //不断的读取键盘录入的数据,并不断的把数据写出
    15         while((line = keyReader.readLine())!=null)
    16         {
    17             //直接写出数据
    18             socketOut.write(line+"
    ");    //这里书名一下为什么要"
    "因为readline读取的是一行只有当讲到"
    "的时候才会换行
    19             socketOut.flush();    //凡是带有字符读取的都有 缓存 有缓存的就要使用flush方法
    20             
    21             //读取服务端回送的数据
    22             line = socketReader.readLine();
    23             System.out.println("服务端的数据:"+line);
    24             
    25         }
    26         //关闭资源
    27         socket.close();
    28     }
    29 }
    30 //聊天的服务器端
    31 public class ChatServer {
    32     public static void main(String[] args) throws IOException{
    33         //建立tcp的服务器端 biang监听接口
    34         ServerSocket serverSocket = new ServerSocket(9090);
    35         //接受客户端的客户端的链接 产生一个socket 为下面的接受数据做准备
    36         Socket socket = serverSocket.accept();
    37         //获取得到socket的输入流对象
    38         BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    39         
    40         //获取到socket的输出流对象
    41         OutputStreamWriter socketOut = new OutputStreamWriter(socket.getOutputStream());
    42         
    43         //获取建安的输入流对象
    44         BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in));
    45         
    46         //读取客户端发送的数据
    47         String line = null;
    48         while((line = socketReader.readLine())!=null)
    49         {
    50             System.out.println("客户端 的数据:"+line);
    51             System.out.println("请输入回送数据");
    52             line = keyReader.readLine();
    53             socketOut.write(line+"
    ");
    54             socketOut.flush();
    55         }
    56         //资源
    57         serverSocket.close();
    58     }
    59 }
    View Code
  • 相关阅读:
    MongoDB学习笔记一—简介
    css之定位
    Docker私有仓库1
    Docker安装目录
    Docker 安装完启动服务报错
    Ambari安装组件出错
    Rancher安装使用
    Kettle中spoon.sh在使用时报错
    Kettle jdbc连接hive出现问题
    kettle在linux启动spoon.sh报错
  • 原文地址:https://www.cnblogs.com/OliverZhang/p/6027046.html
Copyright © 2011-2022 走看看