基于Java语言实现Socket通信的实例
作者:JimmyU1 发布时间:2021-08-06 17:17:50
标签:java,socket,通信
基于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通信了。其他的物联网项目也可以使用这样的方式,这样就可以实现主动的与物联网设备的通信了,只需要规定好协议和传送数据了。
来源:https://blog.csdn.net/u012449363/article/details/78522554


猜你喜欢
- Java类加载全过程一个java文件从被加载到被卸载这个生命过程,总共要经历4个阶段:加载->链接(验证+准备+解析)->初始化
- 这篇文章主要介绍了Spring AOP AspectJ使用及配置过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考
- 线上出现了如上的 crash,第一解决反应是在 show dialog 之前做个 isFinish 和 isDestroyed 判断,当我翻
- 本文实例为大家分享了SpringMVC实现文件上传和下载的具体代码,供大家参考,具体内容如下文件上传第一步,加入jar包:commons-f
- 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现。文件上传概述1、文件上传
- 本文实例为大家分享了C# Winform 自动更新程序,供大家参考,具体内容如下第一步:检查更新检查更新其实无非就是去比较更新包的版本和本地
- java 线程锁在Java线程中运用synchronized关键字来达到同步的 synchronized可以锁方法,锁类,锁对象,锁代码块方
- 背景:由于所在办公室网络限制,笔者每天都使用网络都要先连接无线网。如下图,输入授权用户信息登录后才能使用WIFI。丧心病狂的是该网页Cook
- 在项目开发过程中,不可避免的会升级开发工具。这次我在旧项目版本升级到新版Unity2021.2.x时,出现Visual Studio无法定位
- resultMap标签继承、复用、嵌套记录演示 Mybatis 中 resultMap 标签继承、复用(包括跨文件)以及多层嵌套的使用方法,
- 1、@Valid与@Validated的区别1.1 基本区别@Valid:Hibernate validation校验机制@Validate
- Java 利用poi把数据库中数据导入Excel效果:使用时先把poi包导入工程的path,注意只需要导入poi包即可,下载后有三个jar包
- 这篇文章主要介绍了Spring Cache手动清理Redis缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- TCPServer 1、使用的通讯通道:socket2、用到的基本功能:①Bind,②Listen,③BeginAccept④En
- 新建两个工程,一个客户端,一个服务端,先启动服务端再启动客户端两个工程的读写操作线程类基本上完全相同服务端:import java.io.B
- 已知两个链表list1和list,2,各自非降序排列,将它们合并成另外一个链表list3,并且依然有序,要求保留所有节点。实现过程中,lis
- 环境配置:Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclispe,MyEcli
- 目前市面上的第三方短信服务平台数量十分庞大,并能为企业提供三网合一的短信接口,这些服务商通过整合短信发送服务,简单的打包成为API和SDK接
- 目录字符串、时间、金额转换日期1日期2有限状态自动机-敏感词搜索加解密文件雪花算法-ID生成网络相关URL相关大家在系统研发过程中,总是会遇
- (1)首先实现AutoCompleteTextView功能所需要的适配器数据源共有两种方法,一种结果是手工配置的,另一汇总是通过xml文件制