基于Java语言实现Socket通信的实例

作者:JimmyU1 时间:2021-08-06 17:17:50 

基于Java语言实现Socket通信

由于近日项目需求,需要在服务器中增加Socket通信的功能,接收硬件设备发送的心跳包和相关数据,因此又重新对Java的网络编程进行了复习,根据项目的实际情况做了简化的编程,实现了简单的通信过程。

1. Socket通信原理

源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字。其用于标识客户端请求的服务器和服务。

以下是通过Socket套接字实现客户端与服务器端通信的示意图:

基于Java语言实现Socket通信的实例

在实际应用中,客户端会通过访问服务器的IP和PORT连接到服务器端,这个过程在服务器和客户端之间创建一个Socket,然后通过I/O数据流实现数据传输,也就是Socket的通信过程。

2. 服务器端

服务器端模拟接收硬件设备传输的心跳包(一个长度为10的字节数组),服务器端会获取到心跳包以及硬件设备的地址和端口号。


public class Server extends Thread{
 //服务器端口号
 private int port;
 private ServerSocket server = null;
 public Server(){
   //创建一个服务器,同时可以接收10个设备发送的数据
   server = new ServerSocket(port,10);
   System.out.println("Socket服务器启动,开始接受数据");
 }
 @Override
 public void run(){
   while (true) {
     Socket socket = null;
     InputStream inputStream = null;
     OutputStream outputStream = null;
     byte[] inputData = new byte[1024];
     try {
       //接收Socket数据
       socket = server.accept();
       //获取远程采集机的IP和端口号
       String remoteAddress = socket.getInetAddress().toString();
       int remotePort = socket.getPort();
       inputStream = socket.getInputStream();
       //获取传入的数据长度
       int length = inputStream.read(inputData);
       //创建输出流向客户端返回信息
       outputStream = socket.getOutputStream();
       if (length == 10) {
         //如果长度等于10,说明传入的是心跳包
         System.out.println("接收到心跳包,客户端信息["+remoteAddress+":"+remotePort+"]");
         outputStream.write("success".getBytes());
       } else {
         System.out.println("接收的信息有误.");
         outputStream.write("failed".getBytes());
       }
     } catch (IOException e) {
       e.printStackTrace();
     } finally {
       try {
         if (inputStream != null) {
           inputStream.close();
         }
         if (outputStream != null) {
           outputStream.close();
         }
         if (socket != null) {
           socket.close();
         }
       } catch (IOException e) {
         e.printStackTrace();
       }
     }
   }
 }
 //省略Getter和Setter方法
}

3. 客户端

客户端负责每隔一段时间向服务器发送一个心跳包。


public final class Client {
 private String address = "";
 private int port = 0;
 private Socket socket = null;
 private Client() {
 }
 private Client(String address, int port) throws IOException {
   this.address = address;
   this.port = port;
   this.socket = new Socket(address, port);
 }
 public static byte[] sendCommand(String address, int port, byte[] data) {
   Client client = null;
   OutputStream outputStream = null;
   InputStream inputStream = null;
   byte[] recevie = new byte[40];
   try {
     client = new Client(address, port);
     outputStream = client.getSocket().getOutputStream();
     outputStream.write(data);
     System.out.print("Send Data Success");
     inputStream = client.getSocket().getInputStream();
     inputStream.read(recevie);
   } catch (IOException e) {
     e.printStackTrace();
   } finally {
     try {
       inputStream.close();
       outputStream.close();
       client.getSocket().close();
     } catch (IOException ioe) {
       System.out.print("IOE when closing resource");
     }
   }
   return recevie;
 }
 /**
  * 测试函数
  **/
 public static void test() {
   for (int i = 0; i < 10; i++) {
     //服务器地址和IP
     String address = "127.0.0.1";
     int port = 9000;
     //心跳包
     byte[] data = "#$*beat001".getBytes();
     String receive = new String(Client.sendCommand(address, port, data));
     System.err.println("第" + i + "次发送心跳包" + receive);
     try {
       //每隔2分钟发送一个心跳包
       Thread.sleep(2 * 60 * 1000);
     } catch (InterruptedException e) {
       e.printStackTrace();
     }
   }
 }
 //省略Getter和Setter方法
}

4. 小结

目前的这种方式比较像目前共享单车的通信模式,通过心跳包来获取Client的IP和PORT,然后Server就可以通过心跳包上传的IP和PORT主动的向Client通信了。其他的物联网项目也可以使用这样的方式,这样就可以实现主动的与物联网设备的通信了,只需要规定好协议和传送数据了。 

来源:https://blog.csdn.net/u012449363/article/details/78522554

标签:java,socket,通信
0
投稿

猜你喜欢

  • Java中Lambda表达式的进化之路详解

    2023-04-19 21:17:42
  • C# 将透明图片的非透明区域转换成Region的实例代码

    2021-10-25 19:28:05
  • Java去掉小数点后面无效0的方案与建议

    2023-11-29 11:46:57
  • java基础的详细了解第三天

    2023-10-05 23:47:04
  • Android 拍照后返回缩略图的两种方法介绍

    2023-02-06 02:06:28
  • Java对象的内存布局详细介绍

    2021-07-28 05:11:38
  • 你所不知道的Spring自动注入详解

    2021-09-04 19:30:08
  • Java 多线程并发编程提高数据处理效率的详细过程

    2021-06-29 04:19:39
  • WPF实现带筛选功能的DataGrid

    2022-05-07 07:48:56
  • Unity实现鼠标或者手指点击模型播放动画

    2023-11-30 23:06:01
  • Spring Boot启动时调用自己的非web逻辑

    2022-02-15 11:40:10
  • SPRING IOC注入方式过程解析

    2023-10-11 12:59:13
  • 详解利用Spring加载Properties配置文件

    2023-04-04 20:53:13
  • Java生成含字母和数字的6位随机字符串

    2023-04-02 02:28:58
  • 根据灰度值填充字符-单文件单线程版

    2023-10-12 00:50:24
  • 浅析Java中的内存泄漏

    2023-12-19 02:29:02
  • C#中使用DevExpress中的ChartControl实现极坐标图的案例详解

    2022-12-05 06:30:39
  • 常用json与javabean互转的方法实现

    2023-01-07 14:24:19
  • Android中解决页签手指按下从左到右滑动的bug

    2021-06-04 19:22:40
  • Android Retrofit 2.0框架上传图片解决方案

    2022-02-23 06:25:27
  • asp之家 软件编程 m.aspxhome.com