概述
心跳包
首先先说说心跳包在socket连接中的意义:
通过socket连接的双方为了保证在一段时间未发消息不被防火墙断开连接或者使对方及时知道自己是否已经断线而定期给对方发送的某些特殊标识字符,这个字符可以根据双方自定义,没有实际的通讯意义。
而定制的时间也是双方协商后定制的。
要求:学习使用socket编程,做一个3client-1server模型,不断发送心跳包保持通信连接
socket Server:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws Exception {
// 接收心跳包的Server
int port = 4000;
byte ipAddressTemp[] = {127, 0, 0, 1};
InetAddress ipAddress = InetAddress.getByAddress(ipAddressTemp);
//创建ServerSocket
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("Server start...");
//调用服务器的accept()进行阻塞(程序会在这等待),当有申请连接时会打开阻塞并返回一个socket
Socket socket = serverSocket.accept();
//socket输入流BufferedReader socketIn
BufferedReader socketIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String inTemp = null;
boolean end = true;
while (end) {
inTemp = socketIn.readLine();
if (inTemp != null) {
System.out.println(inTemp);
}
}
socketIn.close();
socket.close();
serverSocket.close();
}
}
Socket Client:
import java.io.*;
import java.net.*;
public class Client implements Runnable{
//调试时要先启动服务端,客户端查不到服务端就启动不了
public static void main(String[] args) throws Exception {
// 发送心跳包client
int port = 4000;
byte ipAddressTemp[] = {127, 0, 0, 1};
InetAddress ipAddress = InetAddress.getByAddress(ipAddressTemp);
//设置socket
socket = new Socket(ipAddress, port);
System.out.println("Client start...");
startThreadSocket();
}
// 心跳包
private static Thread thread;//循环发送心跳包的线程
private static Socket socket;//与服务器建立连接的socket对象
private static OutputStream outputStream;//输出流,用于发送心跳包
private static final String socketContent = "Heat Beat!"+"n";//这里为与服务器协商的特殊字符串,用于识别是发送的心跳信息
public static void startThreadSocket() throws IOException {
try{
if(!socket.getKeepAlive())
socket.setKeepAlive(true);//true,若长时间没有则断开
if(!socket.getOOBInline())
socket.setOOBInline(true);//true,允许发送紧急数据,不做处理
outputStream = socket.getOutputStream();//获得socket的输出流
Client client = new Client();
//开启三个客户端线程
new Thread(client,"1").start();
new Thread(client,"2").start();
new Thread(client,"3").start();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true){
try{
outputStream.write((Thread.currentThread().getName()+"号客户端发来的心跳包"+socketContent).getBytes("UTF-8"));
outputStream.flush();//刷新缓存,让server能够接受到数据
Thread.sleep(10*1000);//10s发送一次心跳
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
输出:
client:
server:
最后
以上就是大方毛衣为你收集整理的Socket心跳包编程的全部内容,希望文章能够帮你解决Socket心跳包编程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复