今天小编就为大家分享一篇关于基于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通信了。其他的物联网项目也可以使用这样的方式,这样就可以实现主动的与物联网设备的通信了,只需要规定好协议和传送数据了。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对CodeAE代码之家的支持。如果你想了解更多相关内容请查看下面相关链接
原文链接:https://blog.csdn.net/u012449363/article/details/78522554
|