Socket 客户端与服务端通信【心跳机制+断线重连】

这是一个关于Socket通信的示例,涵盖了心跳机制和断线重连功能。通过创建Server和Client类,实现了服务器监听、接受客户端连接、发送与接收心跳报文。当客户端3秒内未收到心跳包,会判断为服务端掉线并尝试重新连接;服务器端如果5次未收到心跳包则认为客户端已下线。
摘要由CSDN通过智能技术生成
直接上代码,让代码说话!
//Server.h
#pragma once
#include <stdio.h> 
#include <iostream>
#include <winsock2.h>
#include <map>
#pragma comment (lib, "ws2_32.lib") 
using namespace std;

#define SERVER_HOST	"XX.X.XX.XX"

enum Type { HEART, CTRL_INFO, OTHER};
//packet
struct PACKET
{
	//报文头
	Type type;
	//报文信息
	char msg[1024];
};

class Server
{
public:
	Server();
	//construction
	Server(string ip, int port);
	//deconstruction
	~Server();
	//
	void Bind();
	//
	void Accept();
	//
	void Listen(int queue_len);
	//
	void Recv();
	//
	void Run();
	//心跳线程入口函数
	static UINT HeartProc(LPVOID lparam);

private:

	sockaddr_in							m_serverAddr;
	//监听fd
	int								m_listen_fd;
	//最大监听fd
	int								m_max_fd;
	//超时信息
	timeval								m_timeout;
	//所有fd集合,包括监听fd和客户端fd   	
	fd_set								m_master_set;
	//工作集合
	fd_set								m_working_set;
	//Server Thread
	CWinThread*							m_serverThread;
public:

	//记录链接的客户端信息,链接、IP、未发送心跳次数
	map<int, pair<string, int> >		m_clientInfo;
};

//Server.cpp
#include "stdafx.h"
#include "Server.h"
#include <Ws2tcpip.h>

Server::Server(string ip, int port)
{
	m_serverThread = NULL;
	//
	WSADATA wsaData;
	// Initialize Windows socket library      
	WSAStartup(0x0202, &wsaData);
	//先将保存地址的server置为全0
	memset(&m_serverAddr, 0, sizeof(SOCKADDR_IN));
	//
	m_serverAddr.sin_family = AF_INET;
	m_serverAddr.sin_addr.s_addr = inet_addr(ip.c_str());
	m_serverAddr.sin_port = htons(port);
	// create socket to listen
	m_listen_fd = socket(PF_INET, SOCK_STREAM, 0);
	if (m_listen_fd < 0)
	{
		//AfxMessageBox为MFC中的提示对话框接口
		AfxMessageBox(_T("Create Socket Failed!"), MB_ICONINFORMATION);
		//exit(1);
	}
	else{}
	int opt = 1;
	//closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket
	setsockopt(m_listen_fd, SOL_SOCKET, SO_REUSEADDR, (char*)&opt, sizeof(opt));
}

Server::Server()
{

}

Server::~Server()
{
	for (int fd = 0; fd <= m_max_fd; ++fd)
	{
		if (FD_ISSET(fd, &m_max_fd))
  • 2
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在 Android 上实现 Socket 客户端服务端通信,可以通过 Java 的 Socket 编程实现。下面是一个简单的示例: 1. 服务端代码: ```java import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(8888); System.out.println("服务器已启动,等待客户端连接..."); while (true) { Socket socket = serverSocket.accept(); System.out.println("客户端已连接:" + socket.getInetAddress()); Thread thread = new Thread(new ServerThread(socket)); thread.start(); } } } ``` 2. 服务端线程代码: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; public class ServerThread implements Runnable { private Socket socket; public ServerThread(Socket socket) { this.socket = socket; } @Override public void run() { try { BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); String str; while ((str = reader.readLine()) != null) { System.out.println("客户端发送消息:" + str); } } catch (IOException e) { e.printStackTrace(); } } } ``` 3. 客户端代码: ```java import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; public class Client { public static void main(String[] args) throws UnknownHostException, IOException { Socket socket = new Socket("localhost", 8888); OutputStream outputStream = socket.getOutputStream(); outputStream.write("Hello Server".getBytes()); outputStream.flush(); socket.shutdownOutput(); socket.close(); } } ``` 在服务端启动后,等待客户端连接,当客户端连接后,开启一个线程处理客户端的请求。客户端通过 Socket 连接到服务端,发送消息后关闭连接。 注意:以上代码仅为示例,没有进行异常处理等操作,实际使用时需要根据具体需求补充完整。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值