zoukankan      html  css  js  c++  java
  • Java中通过TCP协议发送和接收数据-Socket编程

    TCP

    TCP协议是面向连接、保证高可靠性(数据无丢失、数据无失序、数据无错误、数据无重复到达)传输层协议。

    TCP通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯。

    Socket

        Socket可以说是一种针对网络的抽象,应用通过它可以来针对网络读写数据。根据TCP协议和UDP协议的不同,在网络编程方面就有面向两个协议的不同socket,一个是面向字节流的一个是面向报文的。

       对socket的本身组成倒是比较好理解。既然是应用通过socket通信,肯定就有一个服务器端和一个客户端。所以它必然就包含有一个对应的IP地址。另外,在这个地址上server要提供一系列的服务,于是就需要有一系列对应的窗口来提供服务。所以就有一个对应的端口号(Port)。

    Socket服务端

    Server端所要做的事情主要是建立一个通信的端点,然后等待客户端发送的请求。典型的处理步骤如下:

    1. 构建一个ServerSocket实例,指定本地的端口。这个socket就是用来监听指定端口的连接请求的。

    2.重复如下几个步骤:

      a. 调用socket的accept()方法来获得客户端的连接请求。通过accept()方法返回的socket实例,建立了一个和客户端的新连接。

      b.通过这个返回的socket实例获取InputStream和OutputStream,可以通过这两个stream来分别读和写数据。

      c.结束的时候调用socket实例的close()方法关闭socket连接。

    服务端示例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    public class TestTCPSend {
     
    public static void main(String[] args) {
          ServerSocket serverSocket=null;
          Socket socket=null;
         
    String msg="hello client,I am server..";
         
    try {
             
            
    //构造ServerSocket实例,指定端口监听客户端的连接请求
             serverSocket=new ServerSocket(8080);
            
    //建立跟客户端的连接
             socket=serverSocket.accept();
             
            
    //向客户端发送消息
             OutputStream os=socket.getOutputStream();
             os.write(msg.getBytes());
             InputStream is=socket.getInputStream();
             
            
    //接受客户端的响应
             byte[] b=new byte[1024];
             is.read(b);
             System.out.println(
    new String(b));
             
          }
    catch (IOException e) {
             e.printStackTrace();
          }
    finally {
            
    //操作结束,关闭socket 
              try {
                serverSocket.close();
                socket.close();
              }
    catch (IOException e) {
                e.printStackTrace();
              }
          } 
      }
    }

    Socket客户端

    客户端的请求过程稍微有点不一样:

    1.构建Socket实例,通过指定的远程服务器地址和端口来建立连接。

    2.通过Socket实例包含的InputStream和OutputStream来进行数据的读写。

    3.操作结束后调用socket实例的close方法,关闭。

    服务端示例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    public class TestTCPReceive {
        
    public static void main(String[] args) {
             Socket socket=null;
            
    try {
               
    //对服务端发起连接请求
                socket=new Socket("localhost", 8080);
                
               
    //接受服务端消息并打印
                InputStream is=socket.getInputStream();
               
    byte b[]=new byte[1024];
                is.read(b);
                System.out.println(
    new String(b));
                
               
    //给服务端发送响应信息
                OutputStream os=socket.getOutputStream();
                os.write(
    "yes,I have received you message!".getBytes());
            }
    catch (IOException e) {
               
    // TODO Auto-generated catch block
                e.printStackTrace();
            }
         }
    }

    运行测试:

    先运行服务端代码,之后运行客户端。

    之后可以分别在客户端和服务端看到对应的消息。

  • 相关阅读:
    php 经验之谈
    3)nginx的启动与停止、重启,linux配置对外端口
    git 的使用
    mysql基本定义--数据类型
    Web安全XSS
    SQL优化 csdn
    数据库隔离级别
    Web前段优化,提高加载速度 css
    jquery的height()和javascript的height总结,js获取屏幕高度
    highcharts笔记 highcharts学习 highcharts用法
  • 原文地址:https://www.cnblogs.com/elgin-seth/p/5293713.html
Copyright © 2011-2022 走看看