zoukankan      html  css  js  c++  java
  • Java TCP通信

    1.Socket原理

    1)Socket简介 

      socket通常称作“套接字”,用于描述IP地址和端口号,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应不同的服务。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务端,Socket是简历网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。

    2)获取本地地址和端口号

    • 获取本地使用的端口号  
      int getLocalPort()
      返回类型为int
      

          

    • 获取套接字绑定的本地地址
      InetAddress getLocalAddress()
      

        

    • 使用InetAddress获取本地的地址方法
      String getCanonicaHostName()
      返回类型为String
      

        

    • 获取此IP地址的完全限定域名  
      String getHostAddress()
      返回类型为String
      

        

    3)获取远端地址和端口号

    • Socket获取远端端口号方法
      int getPort()
      返回类型为int
      

        

    • 获取远端套接字绑定的远端地址
      InetAddress.getInetAddress()
      

        

    案例1:Socket获取IP、端口信息

    1.设置服务端,以本机作为服务器端演示

    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class ServerSocketDemo {
    	public static void main(String[] args) {
    			ServerSocket server;
    			try {
    				server = new ServerSocket(8080);  //创建ServerSocket并申请8080服务端口
    				Socket socket = server.accept();  //阻塞方法,监听服务端口,等待客户端的链接并返回一个socket实例
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    	}
    }
    

    2.设置客户端,以本机作为客户端演示

    客户端设置完成后,先启动服务端,然后启动客户端去连接服务端,连接成功之后可以看到输出本端与远端的IP和端口信息

    import java.io.IOException;
    import java.net.InetAddress;
    import java.net.Socket;
    
    public class SocketInetAddressDemo {
    	public static void main(String[] args) {
    		try {
    			Socket socket = new Socket("localhost",8080);
    			//获取本地使用的端口号
    			int port = socket.getLocalPort();
    			System.out.println("本地使用端口号:"+port);
    			
    			InetAddress add = socket.getLocalAddress();  //获取本地地址信息
    			//使用InetAddress获取本地地址
    			String hostname = add.getCanonicalHostName();
    			System.out.println("本地地址:"+hostname);
    			//获取此IP的完全限定域名
    			String hostadd = add.getHostAddress();
    			System.out.println("限定域名:"+hostadd);
    			//获取远端的端口号
    			int desPort = socket.getPort();
    			System.out.println("远端端口号:"+desPort);
    			//获取远端IP
    			InetAddress inetAdd = socket.getInetAddress();
    			System.out.println(inetAdd);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    }
    
    /*
    运行结果:
    本地使用端口号:62565
    本地地址:127.0.0.1
    限定域名:127.0.0.1
    远端端口号:8080
    localhost/127.0.0.1
    */
    

    4)获取网络输入流和网络输出流

      使用Socket获取输入流与输出流,这两个方法使用Socket通讯的关键方法,封装了TCP协议的Socket是基于流进行通讯的,所以我们在创建了双方连接后,只需要获取相应的输入流与输出流即可实现通讯。

    • 返回此套接字的输入流
      InputStream getInputStream()
      

       

    • 返回此套接字的输出流
      OutputStream.getOutputStream()
      

        

      具体代码示例:

    public void testSocket() throws Exception{
        Socket socket = new Socket("localhost",8080);
        InputStream in = socket.getInputStream();
        OutputStream out = socket.getOutputStream();
    }
    

      

    5)close方法

      当使用Socket进行通讯完毕后,要关闭Socket以释放系统资源。

    void close()
    

      

    2.Socket通讯模型

    1)Server端ServerSocket监听

      java.net.ServerSocket是运行于服务端应用程序中,通常创建ServerSocket需要指定服务端口号,之后监听Sokcet的连接,监听方法为:

    Socket accept()
    

      该方法是一个阻塞方法,直到一个客户端通过Socket连接后,accept会封装一个Socket,该Socket封装与表示该客户端的有关的信息,通过这个Socket与该客户端进行通信。

    //创建ServerSocket并申请服务端口8080
    ServerSocket server = new ServerSocket(8080);
    //accept()方法会产生阻塞,直到某个Socket连接并返回请求连接的Socket
    Socket socket = server.accept();
    

      

    2)Client端Socket连接

      当服务端ServerSocket调用accept方法阻塞等待客户端连接后,我们可以通过在客户端应用程序中创建Socket来向服务端发起连接。

      需要注意的是:创建Socket的同时就发起连接,若连接异常会抛出异常,我们通常创建Socket时会传入服务端的地址以及端口号。

    //参数1:服务器的IP地址  参数2:服务端的服务端口号
    Socket socket = new Socket("localhost",8080);
    

      

    3)C/S端通信模型

      C/S即:Client-Server,客户端到服务端

      客户端与服务端通信模型如下:

    1. 服务端创建ServerSocket
    2. 通过调用ServerSocket的accept方法监听客户端的连接
    3. 客户端创建Socket并指定服务端的地址以及端口来建立与服务端的连接
    4. 当服务端accept发现客户连接后,获取对应该客户端的Socket
    5. 双方通过Socket分别获取对应的输入与输出流进行数据通讯
    6. 通讯结束后关闭连接

      

  • 相关阅读:
    CSS 实现半圆环的两种方式
    传统js和jsx ts和tsx的区别
    echarts 实现正负轴双柱状图
    vue 封装 axios 代码
    访问某个网站特别卡,怎么办?
    创建自己的github
    自动化测试平台构想与实现
    【sqlserver】之学习总结
    shell脚本中浮点数运算
    远程执行shell脚本
  • 原文地址:https://www.cnblogs.com/jmwm/p/6954180.html
Copyright © 2011-2022 走看看