2017-02-13 32 views
0

我開始研究一個簡單的服務器和客戶端腳本。我測試了我的本地網絡上的腳本,它運行得很好:服務器將打開,並等待客戶端連接。一旦客戶連接,它就會讓我繼續。無法爲簡單的Python服務器端口

然後我決定通過互聯網測試它,這是問題開始發生。我在Ubuntu上運行服務器,在Windows機器上運行客戶端。

服務器連接代碼:

import socket 
import sys 

#Create a socket for connection 
def socket_create(): 
    try: 
     global host 
     global port 
     global s 
     host = '' 
     port = 5698 
     s = socket.socket() 
     print("Socket created.") 
    except socket.error as msg: 
     print("Socket creation error: " + str(msg)) 

#Bind the created socket to a port, sleep for conn 
def socket_bind(): 
    try: 
     global host 
     global port 
     global s 
     s.bind((host, port)) 
     print("Waiting for connection") 
     s.listen(5) 
    except socket.error as msg: 
     print("SOcket binding error: " + str(msg) + "\n Retrying...") 
     socket_bind() 

#Estabilish Connection with client 
def socket_accept(): 
    conn, adress = s.accept() 
    print("Connection has been estabilished | " + "IP " + adress[0] + " | Port " + str(adress[1])) 
    send_command(conn) 
    conn.close() 

客戶端連接代碼:

import os 
import socket 
import subprocess 


# Create a socket 
def socket_create(): 
    try: 
     global host 
     global port 
     global s 
     host = 'My Internet IP' 
     port = 5987 
     s = socket.socket() 
    except socket.error as msg: 
     print("Socket creation error: " + str(msg)) 


# Connect to a remote socket 
def socket_connect(): 
    try: 
     global host 
     global port 
     global s 
     s.connect((host, port)) 
    except socket.error as msg: 
     print("Socket connection error: " + str(msg)) 

和錯誤:

[Errno 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

我永遠也不會得到 「連接已estabilished」 打印從服務器,我會得到該錯誤。

任何人都可以看到任何可能導致代碼中的問題?

端口轉發路由器後,我必須在Ubuntu本身做任何其他配置嗎?我應該打開的端口是TCP,對吧?

打開路由器上的端口後,如果我使用像「http://www.canyouseeme.org/」這樣的服務,它會立即顯示該端口是打開的,還是隻顯示如果我正在運行服務器並等待連接?

+0

你應該用你找到的解決方案回答你自己的問題。其他人可能遇到同樣的問題。 – Malt

+0

@Malt我用修正的小說明更新了這個問題。我會適當地回答一個關於如何使用Port Mapper的小教程,一旦我有時間。 – Milan

回答

1

我設法解決了這個問題。這是關於我如何做到的深入指導。

問題:即使打開路由器配置中的端口後,仍然無法看到正在運行的服務上打開的端口。

解決方案:Port Mapper。

注意事項:我必須在Ubuntu上運行Port Mapper,因爲在Windows上運行它似乎不適用於我。另外,如果您讓電腦進入睡眠或關機狀態,再次打開電源時,必須重新打開端口(但不要擔心,因爲只需點擊一下按鈕即可)。

你需要什麼:https://sourceforge.net/projects/upnp-portmapper/

  • 首先,只需在終端上運行的Java「,以確保您有Java的安裝,或者爲了安裝(路線將顯示在屏幕上)。

  • 從給定的鏈接下載Portmapper.jar。

  • 下載後,只需在終端上運行'java -jar Portmapper.jar'打開gui。

  • 打開gui後,按下Connect(連接),以便您可以自動連接到路由器。

  • 所有當前打開的端口現在都會出現在屏幕上。我們知道想要查找端口映射預設。

  • 在端口映射預設中,繼續並按下創建。

  • 這裏給出預設名稱。然後,如果您想要連接特定IP,請填寫遠程主機,或者爲任何IP保留空白。內部客戶端將是您的服務器的網絡IP(在我的情況下,因爲我在與端口映射器相同的機器上運行服務器,所以我將勾選「使用本地主機」

  • 現在我們繼續添加一個新的端口作爲TCP連接,在這裏我們可以使用具有相同或不同值的外部端口和內部端口,只要記住內部端口(您的機器的端口)將是您在服務器上使用的端口,而外部端口端口(您的路由器開放端口)將是您將在客戶端或任何連接到您的服務器上使用的端口

  • 之後,只需保存預設,選擇它並按使用。在端口列表下更新,你會看到你的新的開放端口。只是爲了確保,你可以得到你r服務器運行awating連接,只需去「http://www.canyouseeme.org/」,輸入端口,然後在這裏你走。

  • 請記住,在關閉計算機或讓計算機進入睡眠狀態後,您必須返回到PortMapper,然後再次單擊預設中的使用(取決於您想要的端口)。

相關問題