intcount);" />
Cocos2d-x   发布时间:2022-05-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了cocos2dx3.x利用sokcet创建客户端和服务端 (二)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_607_0@服务端:

@H_607_0@初始化服务端

@H_607_0@向指定客户端发送消息

@H_607_0@

voidsendmessage(HSocketsocket,constchar*data,255); font-size:9.5pt; font-family:新宋体">intcount);

@H_607_0@向所有客户端发送消息

@H_607_0@void sendmessage(const char* data,int count);

@H_607_0@当服务端开启后的回调函数

@H_607_0@std::function<void(constchar*ip)>onStart;

@H_607_0@当有新连接时的回调函数

@H_607_0@std::void(HSocketsocket)>onNewConnection;

@H_607_0@当有消息时的回调函数

std::function<void(intcount)>onRecv;

@H_607_0@当有客户端断开连接时的回调函数

@H_607_0@std::HSocketsocket)>onDisconnect;

@H_607_0@SocketServer.h

#ifndef __SOCKET_SERVER_H__
#define __SOCKET_SERVER_H__

#include "SocketBase.h"

class SocketServer : public SocketBase
{
public:
	static SocketServer* create();

	SocketServer();
	~SocketServer();

	bool startServer();
	void sendmessage(HSocket socket,const char* data,int count);
	void sendmessage(const char* data,int count);

	std::function<void(const char* ip)> onStart;
	std::function<void(HSocket socket)> onNewConnection;
	std::function<void(const char* data,int count)> onRecv;
	std::function<void(HSocket socket)> onDisconnect;

private:
	bool initServer();
	void acceptClient();
	void acceptFunc();
	void newClientConnected(HSocket socket);
	void recvmessage(HSocket socket);
	
private:
	HSocket _socketServer;

private:
	std::list<HSocket> _clientSockets;

};

#endif


@H_607_0@

@H_607_0@SocketServer.cpp

#include "SocketServer.h"

SocketServer* SocketServer::create()
{
	auto server = new SocketServer;

	return server;
}

SocketServer::SocketServer() :
	_socketServer(0),onRecv(nullptr),onStart(nullptr),onNewConnection(nullptr)
{

}

SocketServer::~SocketServer()
{
	_clientSockets.clear();

	if (_socketServer)
	{
		this->closeConnect(_socketServer);
	}
};

bool SocketServer::startServer()
{
	if (!initServer())
	{
		return false;
	}

	return true;
}

bool SocketServer::initServer()
{
	if (_socketServer != 0)
	{
		this->closeConnect(_socketServer);
	}
	_socketServer = socket(AF_INET,SOCK_STREAM,0);
	if (error(_socketServer))
	{
		log("socket error!");
		_socketServer = 0;
		return false;
	}
	do 
	{
		struct sockaddr_in sockAddr;
		memset(&sockAddr,sizeof(sockAddr));

		sockAddr.sin_family = AF_INET;
		sockAddr.sin_port = htons(8000);
		sockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
		int ret = 0;
		ret = bind(_socketServer,(const sockaddr*)&sockAddr,sizeof(sockAddr));
		if (ret < 0)
		{
			log("bind error!");
			break;
		}
	
		ret = listen(_socketServer,5);
		if (ret < 0)
		{
			log("listen error!");
			break;
		}
		// start 
		char hostName[256];
		gethostname(hostName,sizeof(hostName));
		struct hostent* hosTinfo = gethostbyname(hostName);
		char* ip = inet_ntoa(*(struct in_addr *)*hosTinfo->h_addr_list);
		this->acceptClient();

		if (onStart != nullptr)
		{
			log("start server!");
			onStart(ip);
		}

		return true;

	} while (false);
	
	this->closeConnect(_socketServer);
	_socketServer = 0;
	return false;
}

void SocketServer::acceptClient()
{
	std::thread th(&SocketServer::acceptFunc,this);
	th.detach();
}

void SocketServer::acceptFunc()
{
	int len = sizeof(sockaddr);
	struct sockaddr_in sockAddr;
	while (true)
	{	
		HSocket clientSock = accept(_socketServer,(sockaddr*)&sockAddr,&len);
		if (error(clientSock))
		{
			log("accept error!");
			break;
		}

		this->newClientConnected(clientSock);
	}
}

void SocketServer::newClientConnected(HSocket socket)
{
	log("new connect!");

	_clientSockets.push_BACk(socket);
	std::thread th(&SocketServer::recvmessage,this,socket);
	th.detach();

	if (onNewConnection != nullptr)
	{
		onNewConnection(socket);
	}
}

void SocketServer::recvmessage(HSocket socket)
{
	char buff[1024];
	int ret = 0;

	while (true)
	{
		ret = recv(socket,buff,sizeof(buff),0);
		if (ret < 0)
		{
			log("recv(%d) error!",socket);
			_mutex.lock();
			this->closeConnect(socket);
			_clientSockets.remove(socket);
			if (onDisconnect != nullptr)
			{
				onDisconnect(socket);
			}
			_mutex.unlock();

			break;
		}
		else
		{
			buff[ret] = 0;
			log("recv msg : %s",buff);
			if (ret > 0 && onRecv != nullptr)
			{
				onRecv(buff,ret);
			}
		}
	}
}

void SocketServer::sendmessage(HSocket socket,int count)
{
	for (auto& sock : _clientSockets)
	{
		if (sock == socket)
		{
			int ret = send(socket,data,count,0);
			if (ret < 0)
			{
				log("send error!");
			}
			break;
		}
	}

}

void SocketServer::sendmessage(const char* data,int count)
{
	for (auto& socket : _clientSockets)
	{
		int ret = send(socket,0);
		if (ret < 0)
		{
			log("send error!");
		}

	}

}

大佬总结

以上是大佬教程为你收集整理的cocos2dx3.x利用sokcet创建客户端和服务端 (二)全部内容,希望文章能够帮你解决cocos2dx3.x利用sokcet创建客户端和服务端 (二)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。