基于Java语言实现Socket通信
由于近日项目需求,需要在服务器中增加Socket通信的功能,接收硬件设备发送的心跳包和相关数据,因此又重新对Java的网络编程进行了复习,根据项目的实际情况做了简化的编程,实现了简单的通信过程。
1. Socket通信原理
源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字。其用于标识客户端请求的服务器和服务。
以下是通过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通信了。其他的物联网项目也可以使用这样的方式,这样就可以实现主动的与物联网设备的通信了,只需要规定好协议和传送数据了。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对小牛知识库的支持。如果你想了解更多相关内容请查看下面相关链接
本文向大家介绍Go语言基于Socket编写服务器端与客户端通信的实例,包括了Go语言基于Socket编写服务器端与客户端通信的实例的使用技巧和注意事项,需要的朋友参考一下 在golang中,网络协议已经被封装的非常完好了,想要写一个Socket的Server,我们并不用像其他语言那样需要为socket、bind、listen、receive等一系列操作头疼,只要使用Golang中自带的net包即可
本文向大家介绍Java 实现简单Socket 通信的示例,包括了Java 实现简单Socket 通信的示例的使用技巧和注意事项,需要的朋友参考一下 Java socket 封装了传输层的实现细节,开发人员可以基于 socket 实现应用层。本文介绍了 Java socket 简单用法。 1. 传输层协议 传输层包含了两种协议,分别是 TCP (Transmission Control Protoc
本文向大家介绍Java基于socket实现的客户端和服务端通信功能完整实例,包括了Java基于socket实现的客户端和服务端通信功能完整实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java基于socket实现的客户端和服务端通信功能。分享给大家供大家参考,具体如下: 以下代码参考马士兵的聊天项目,先运行ChatServer.java实现端口监听,然后再运行ChatClient.j
本文向大家介绍Java实现简单的socket通信教程,包括了Java实现简单的socket通信教程的使用技巧和注意事项,需要的朋友参考一下 今天学习了一下java如何实现socket通信,感觉难点反而是在io上,因为java对socket封装已经很完善了。 今天代码花了整个晚上调试,主要原因是io的flush问题和命令行下如何运行具有package的类,不过最后问题基本都解决了,把代码贴出来供大家
本文向大家介绍Android基于socket实现的简单C/S聊天通信功能,包括了Android基于socket实现的简单C/S聊天通信功能的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android基于socket实现的简单C/S聊天通信功能。分享给大家供大家参考,具体如下: 主要想法:在客户端上发送一条信息,在后台开辟一个线程充当服务端,收到消息就立即回馈给客户端。 第一步:创建一个继
本文向大家介绍PHP的Socket通信之UDP通信实例,包括了PHP的Socket通信之UDP通信实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP的Socket通信之UDP通信方法。分享给大家供大家参考。具体如下: 1.创建一简单的UDP服务器 2.简单的客户端 希望本文所述对大家的php程序设计有所帮助。