2016-05-16 173 views
0

我剛開始學習SFML網絡....我正在製作一個服務器客戶端聊天室...當我在PC上運行客戶端程序時,它連接到服務器,它也在我的電腦上運行。 ....但問題是,我的筆記本電腦客戶端程序無法連接到服務器程序在我的電腦....這裏是服務器的代碼:爲客戶SFML網絡服務器/客戶端

void main() 
{ 
cout << "Server Running" << endl; 
TcpListener listener; 
SocketSelector selector; 
bool done = false; 
vector<TcpSocket*>clients; 
listener.getLocalPort(); 
listener.listen(2000); 
selector.add(listener); 

while (!done) 
{ 
    if (selector.wait()) 
    { 
     if (selector.isReady(listener)) 
     { 
      TcpSocket *socket = new TcpSocket; 

      listener.accept(*socket); 
      Packet packet; 
      string id; 
      string status; 
      if (socket->receive(packet) == Socket::Done) 
       packet >> id>>status; 
      cout << id << " has "<<status; 
      clients.push_back(socket); 
      selector.add(*socket); 
     } 
     else 
     { 
      for (int i = 0;i < clients.size();i++) 
      { 
       if (selector.isReady(*clients[i])) 
       { 
        Packet packet, sendpacket; 
        if (clients[i]->receive(packet) == Socket::Done) 
        { 
         string text; 
         packet >> text; 
         sendpacket << text; 
         for (int j = 0;j < clients.size();j++) 
         { 
          if (i != j) 
          { 
           clients[j]->send(sendpacket); 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

for (vector<TcpSocket*>::iterator it = clients.begin();it != clients.end();it++) 
    delete *it; 
} 

代碼:

#include<SFML/Network.hpp> 
#include<SFML/Graphics.hpp> 
#include<iostream> 
#include<string> 
#include<vector> 
#include<conio.h> 

using namespace sf; 
using namespace std; 

void main() 
{ 
IpAddress ip = IpAddress::getLocalAddress(); 
cout << ip << endl; 

TcpSocket socket; 
bool done = false; 

string id; 
string status = "connected"; 
string text = ""; 

cout << "Enter online id: "; 
cin >> id; 

socket.connect(ip, 2000); 

Packet packet; 

packet << id<< status; 
socket.send(packet); 
socket.setBlocking(false); 

RenderWindow window(VideoMode(800, 600, 32), id); 
vector<Text> chat; 

Font font; 
font.loadFromFile("Data/font.ttf"); 

while (window.isOpen()) 
{ 
    Event event; 
    while (window.pollEvent(event)) 
    { 
     switch (event.type) 
     { 
     case Event::Closed: 
      window.close(); 
      break; 
     case Event::KeyPressed: 
      if (event.key.code == Keyboard::Escape) 
      { 
       text.clear(); 
      }    
      else if (event.key.code == Keyboard::Return) 
      { 
       Packet packet; 
       packet << id + ":" + text; 
       socket.send(packet); 
       Text displaytext(text, font, 20); 
       displaytext.setColor(Color::Green); 
       chat.push_back(displaytext); 
       text = ""; 
      } 
      break; 
     case Event::TextEntered: 
      if (event.text.unicode == '\b' && text.size() >0) 
      { 
       text.erase(text.size() - 1, 1); 
      } 
      else 
      text += event.text.unicode; 
      break; 
     } 
    } 

    Packet packet; 
    socket.receive(packet); 
    string temptext; 
    if (packet >> temptext) 
    { 
     Text displaytext(temptext, font, 20); 
     displaytext.setColor(Color::Blue); 
     chat.push_back(displaytext); 
    } 
    int i = 0; 
    for (i;i<chat.size();i++) 
    { 
     chat[i].setPosition(0, i * 20); 
     window.draw(chat[i]); 
    } 

    Text drawtext(text, font, 20); 
    drawtext.setColor(Color::Red); 
    drawtext.setPosition(0, i * 20); 
    window.draw(drawtext); 

    window.display(); 
    window.clear(); 
} 

} 

我需要知道我的筆記本電腦客戶端如何找到並連接到服務器(PC)?

回答

0

您需要獲取服務器的IP地址。現在,您正在將客戶端的IP地址提供給客戶端,這是行不通的。對於初學者來說,您可以查看它並對其進行硬編碼,但從長遠來看,您需要找到一種更具動態性的方法。

還有最後一件事:沒有void main()這樣的東西。這是未定義的行爲,擺脫它。使用有效的入口點,最有可能您想使用int main()

+0

感謝您的幫助,現在我明白我在做什麼錯了.......你可以請進一步指導我如何讓客戶端到服務器的IP(我怎麼能伸手去服務器請求)...一些代碼示例可以幫助.... –

相關問題