Socket心跳包编程

本文介绍了心跳包在socket连接中的意义,即双方为防止防火墙断开连接或让对方及时知晓断线情况,定期发送自定义特殊标识字符。还提出学习使用socket编程,构建3client - 1server模型,通过不断发送心跳包来保持通信连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

心跳包

首先先说说心跳包在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:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值