您的位置:首页 > 理论基础 > 计算机网络

Java中通过TCP协议发送和接收数据-Socket编程

2017-02-15 15:35 671 查看






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连接。

服务端示例代码:



















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方法,关闭。

服务端示例代码:



















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(); 

        } 

     } 

}
运行测试:

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

之后可以分别在客户端和服务端看到对应的消息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: