C++채 팅 애플 릿 구현

C++게임 채 팅 서버 를 작성 하여 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
최근 에 인터넷 프로 그래 밍 을 배우 고 채 팅 애플 릿 을 써 서 블 로그 에 자신의 코드 를 기록 했다.
관련 된 기술:
c++네트워크 프로 그래 밍
c++다 중 스 레 드
  • c++ STL
  • 설계 원리
    클 라 이언 트 를 하나의 구조 체 로 저장 하고 vector 로 존재 하 는 클 라 이언 트 를 액세스 하여 다 중 스 레 드 처리 논 리 를 엽 니 다.
    서버 는 여러 개의 클 라 이언 트 에 로그 인 할 수 있 고 공용 채 팅 도 허용 합 니 다.기본 적 인 상황 에서 공용 채 팅 에 속 합 니 다.개인 채 팅 을 하려 면'@사용자 이름+보 낼 메시지'형식 입 니 다.다음 그림 과 같이 실행 효과:

    서버 구현
    
    #include "stdafx.h"
    #include <iostream>  
    #include "windows.h" //         
    #include "process.h"
    #include <string>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    #pragma comment(lib, "WS2_32.lib")  //     ws2_32.dll ws2_32.dll    socket  
    
    int g_curPlayerNum = 0; //     
    const char*g_PlayerName[] =  //        
    {
     "aaaa",
     "bbbb",
     "cccc",
     "dddd",
    };
    
    struct PlayerInfo //            
    {
     SOCKET sock;
     string name;
    };
    
    vector<PlayerInfo>g_clientSockList;  //  vector         
    
    void process(void*param)
    {
     int index = *(int*)param; //       
     while (1)
     {
      //       
      //int index = *(int*)param;
      char buf[2048] = { 0 };  //     
      int bytes;
      if ((bytes = recv(g_clientSockList[index].sock, buf, sizeof(buf), 0)) == SOCKET_ERROR)
      {
       cout << "         !" << endl;
      }
      //     (     )
      if (buf[0] == '@')
      {
       //  
       string Buf(buf);
       string recvPlayerName = Buf.substr(1, 4); //        
       copy(g_clientSockList[index].name.begin(), g_clientSockList[index].name.end(), &buf[1]);
    
       for (vector<PlayerInfo>::iterator it = g_clientSockList.begin(); it != g_clientSockList.end(); it++)
       {
        if (it->name == recvPlayerName)
        {
         if (send(it->sock, buf, strlen(buf), 0) == SOCKET_ERROR)
         {
          cout << "       to" << it->name << endl;
         }
         break;
        }
       }
      }
      else
       //  
       cout << g_clientSockList[index].name << " " << "    :" << buf << endl;
     }
    }
    
    int main()
    {
     cout << "-----------      -----------" << endl;
    
     //      
     WSADATA wsaData; //          WSAStartup         Windows Sockets   。
     WORD sockVersion = MAKEWORD(2, 2); //windows           
     if (WSAStartup(sockVersion, &wsaData) != 0) //WSAStartup             Windows  
     {
      cout << "        !" << endl;
      return 0;
     }
    
     //        
     SOCKET SeverSocket;
     if ((SeverSocket = socket(AF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR)
     {
      cout << "       !" << endl;
      return 0;
     }
     struct sockaddr_in SeverAddress;  //      : IP  ,    ,    
     memset(&SeverAddress, 0, sizeof(sockaddr_in)); //      
     SeverAddress.sin_family = AF_INET;
     SeverAddress.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//    IP   
     SeverAddress.sin_port = htons(60000);//     
    
     //               IP      
     if (bind(SeverSocket, (sockaddr*)&SeverAddress, sizeof(SeverAddress)) == SOCKET_ERROR)
     {
      cout << "       !"<<endl;
      return 0;
     }
    
     //      
     if (listen(SeverSocket, SOMAXCONN) == SOCKET_ERROR) //          :           ,           
     {
      cout << "    !" << endl;
      return 0;
     }
     else
      cout << "       ......" << endl;
    
    
     while (1)
     {
      //         
      sockaddr_in revClientAddress; //      ,  
      SOCKET revClientSocket = INVALID_SOCKET;  //         
      //memset(&revClientAddress, 0, sizeof(revClientAddress));
      int addlen = sizeof(revClientAddress);
      if ((revClientSocket = accept(SeverSocket, (sockaddr*)&revClientAddress, &addlen)) == INVALID_SOCKET)
      {
       cout << "         !" << endl;
       return 0;
      }
      
      PlayerInfo stPlayerInfo;
      stPlayerInfo.sock = revClientSocket;
      stPlayerInfo.name = g_PlayerName[g_curPlayerNum];
      g_clientSockList.push_back(stPlayerInfo);
      int temp = g_curPlayerNum;
      _beginthread(process, 0, &temp);  //          
      g_curPlayerNum++;
      cout << stPlayerInfo.name << "   !" << endl;
     }
     return 0;
    }
    클 라 이언 트
    
    #include "stdafx.h"
    #include "windows.h"
    #include "iostream"
    #include "process.h"
    #include <string>
    using namespace std;
    #pragma comment(lib, "ws2_32.lib")
    
    void Receive(void *param)
    {
     string msg;
     while (1)
     {
      //             
      SOCKET clientSocket = *(SOCKET*)(param);
      char  recvbuf[2048] = {};  //     
      if (recv(clientSocket, recvbuf, 2048, 0) == SOCKET_ERROR)
      {
       cout << "      " << endl;
      }
      else
      {
       msg = recvbuf;
       char sendPlayerName[5] = { 0 };
       int len = strlen(recvbuf);  //    
       copy(&recvbuf[1], &recvbuf[5], sendPlayerName); //     
       msg = msg.substr(5, len - 5);
       cout << sendPlayerName << "   :" << msg<<endl;
      }
       
     }
    }
    
    void Send(void *param)
    {
     while (1)
     {
      //           
      SOCKET clientSocket = *(SOCKET*)(param);
      char sendbuf[2048] = {};  //     
      cin.getline(sendbuf, 2048);
      if (send(clientSocket, sendbuf, strlen(sendbuf), 0) == SOCKET_ERROR)
      {
       cout << "      !";
      }
      else
       cout << "      " << endl;
     }
    }
    
    int main()
    {
     cout << "-----------     -----------" << endl;
     WSADATA  wsa;
     if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
     {
      cout << "        !"<<endl;
     }
     SOCKET clientSocket;
     if ((clientSocket = socket(AF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR)
     {
      cout << "       !"<<endl;
     }
     Sleep(30);
     struct sockaddr_in ClientAddress;  //      : IP  ,    ,    
     memset(&ClientAddress, 0, sizeof(sockaddr_in)); //      
     ClientAddress.sin_family = AF_INET;
     ClientAddress.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//    IP   
     //ClientAddress.sin_port = htons(60001);//     
     //               IP      
     if (bind(clientSocket, (sockaddr*)&ClientAddress, sizeof(ClientAddress)) == SOCKET_ERROR)
     {
      cout << "       !" << endl;
      return 0;
     }
     struct sockaddr_in SeverAddress;  //                   
     memset(&SeverAddress, 0, sizeof(sockaddr_in)); 
     SeverAddress.sin_family = AF_INET;
     SeverAddress.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");  //127.0.0.1    ip  
     SeverAddress.sin_port = htons(60000);//     
    
     //    
     if (connect(clientSocket, (sockaddr*)&SeverAddress, sizeof(SeverAddress)) == SOCKET_ERROR)
     {
      cout << "   :        !"<<endl;
      return 0;
     }
     else
      cout << "        !" << endl;
    
     //       
     _beginthread(Receive, 0, &clientSocket);
     _beginthread(Send, 0, &clientSocket);
    
     Sleep(INFINITE); //                    ――       
     //   socket
     if (clientSocket != INVALID_SOCKET) {
      closesocket(clientSocket);
      clientSocket = INVALID_SOCKET;
     }
        return 0;
    }
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기