2014-11-04 67 views
1

我想創建一個簡單的服務器,只有當有人連接到我時纔會顯示。一切正常時,客戶端和服務器使用「localhost」作爲主機名進行連接,但是當我改變localhost來我的IP地址,然後我得到超時錯誤:( 有我的代碼:Qt無法連接到服務器

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
    server_status=0; 
} 

void MainWindow::on_starting_clicked() 
{ 
    tcpServer = new QTcpServer(this); 
    connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newuser())); 
    if (!tcpServer->listen(QHostAddress::Any, 33333) && server_status==0) { 
     qDebug() << QObject::tr("Unable to start the server: %1.").arg(tcpServer->errorString()); 
     ui->textinfo->append(tcpServer->errorString()); 
    } else { 
     server_status=1; 
     qDebug() << tcpServer->isListening() << "TCPSocket listen on port"; 
     ui->textinfo->append(QString::fromUtf8("Server started!")); 
     qDebug() << QString::fromUtf8("Server started!"); 
    } 
} 

void MainWindow::on_stoping_clicked() 
{ 
    if(server_status==1){ 
     foreach(int i,SClients.keys()){ 
      QTextStream os(SClients[i]); 
      os.setAutoDetectUnicode(true); 
      os << QDateTime::currentDateTime().toString() << "\n"; 
      SClients[i]->close(); 
      SClients.remove(i); 
     } 
     tcpServer->close(); 
     ui->textinfo->append(QString::fromUtf8("Server stopped!")); 
     qDebug() << QString::fromUtf8("Server stopped!"); 
     server_status=0; 
    } 
} 


void MainWindow::newuser() 
{ 
    if(server_status==1){ 
     qDebug() << QString::fromUtf8("New connection!"); 
     ui->textinfo->append(QString::fromUtf8("New connection!")); 
     QTcpSocket* clientSocket=tcpServer->nextPendingConnection(); 
     int idusersocs=clientSocket->socketDescriptor(); 
     SClients[idusersocs]=clientSocket; 
     connect(SClients[idusersocs],SIGNAL(readyRead()),this, SLOT(slotReadClient())); 
    } 
} 

而對於客戶端:

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    socket = new QTcpSocket(this); 
    socket->connectToHost("95.220.162.117", 33333); 
    socket->waitForConnected(); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

我與網絡工作領域的新手,所以請給我解釋一下我在做什麼錯

+0

聽起來像防火牆阻止了你。服務器的操作系統是什麼? – 2014-11-04 23:15:26

+0

OSX 10.9和防火牆關閉 – Lobster 2014-11-04 23:41:24

+0

使用本地主機連接防火牆規則時,通常允許所有事情都通過自己。當從外部網絡接口連接時 - 防火牆規則有助於防止入侵。端口33333是您必須在防火牆設置中取消阻止的端口。這[Apple如何](http://support.apple.com/en-us/ht1810)可能會幫助您打開使用的端口。 – 2014-11-04 23:44:38

回答

2

「95.220.162.117」看起來像一個公共歐洲IP地址,該公共IP地址。由您的所有電腦/平板電腦/電話/等共享home家/辦公室。這樣想:公共IP地址指向您的路由器,而不是指向特定的計算機。

當客戶端向公有IP地址發送請求時,路由器首先收到請求。然後,路由器的工作就是將請求轉發到正確的設備......但在您的情況下,您的路由器不知道哪個設備應該接收請求!

有兩個級別使您的連接工作:

1.私營:在你的本地網絡(容易)

在你的服務器上,打開您的控制檯,然後輸入以下找到你的私人/本地IP地址:

ifconfig -a 

您的本地IP地址與您的公共IP地址不同。它標識本地網絡上的特定計算機。讓你的客戶端連接到這個地址,你的服務器應該收到請求。

這僅適用於在客戶端和服務器在同一本地網絡(例如連接到同一個路由器)

2.公共上:通過互聯網(硬)

您需要設置Port Forwarding - 這會告訴路由器在端口33333接收請求並將它們轉發到您的服務器。

要了解關於此主題的更多信息,請閱讀Network Address Translation