2012-06-11 91 views
9

到目前爲止,我已經能夠在python 3.2中計算出一個基本套接字。客戶端向服務器發送一些數據(X座標和Y座標),服務器接收數據併發回確認消息。但我遇到的麻煩是讓它在計算機之間進行收聽。當我在同一臺計算機上並排運行它們時,我的服務器和客戶端運行良好,但我希望讓它們在不同計算機上運行時進行連接。計算機之間的插槽

我樓上有一臺電腦,樓下有一臺電腦,都使用同一個無線上網。有沒有一種方法可以將我的服務器和客戶端連接到這些計算機中的每一臺計算機上?

我已經嘗試將服務器IP更改爲我的無線調制解調器的IP地址,但這不起作用。

這裏是我的代碼,到目前爲止,唯一不同的是我改變了IP地址返回給一個標準的環回地址,因爲只是將其更改爲我的IP沒有工作:

客戶:

import pygame, sys 
from socket import socket, AF_INET, SOCK_DGRAM 
from time import gmtime, strftime 
from pygame.locals import * 

SERVER_IP = '127.0.0.1' 
PORT_NUMBER = 5000 
SCREEN_X = 400 
SCREEN_Y = 400 
SIZE = 1024 
PIC_PATH = "picture/path/goes/here.bmp" 
print ("Test client sending packets to IP {0}, via port {1}\n".format(SERVER_IP, PORT_NUMBER)) 

mySocket = socket(AF_INET, SOCK_DGRAM) 
x = y = 0 
screen = pygame.display.set_mode((SCREEN_X, SCREEN_Y)) #Make the screen 
ending = False 
word = "True" 
clock = pygame.time.Clock() #tick-tock 
grid = pygame.image.load(PIC_PATH) #Load the sheet 
gridRect = grid.get_rect() 
screen.blit(grid, gridRect) 
pygame.display.flip() 
while ending==False: 
    for event in pygame.event.get(): 
     if event.type == KEYDOWN: # key down or up? 
      if event.key == K_RIGHT: x+=1 
      elif event.key == K_LEFT: x-=1 
      elif event.key == K_UP: y-=1 
      elif event.key == K_DOWN: y+=1 
      if event.key == K_ESCAPE: 
       ending=True # Time to leave 
       print("Stopped Early by user") 
    if ending==True: word="False" 
    localTime = strftime("%H:%M:%S", gmtime()) 
    mySocket.sendto(bytes(str(x), 'UTF-8') , (SERVER_IP, PORT_NUMBER)) 
    mySocket.sendto(bytes(str(y), 'UTF-8') , (SERVER_IP, PORT_NUMBER)) 
    mySocket.sendto(bytes(word, 'UTF-8') , (SERVER_IP, PORT_NUMBER)) 
    print ("Sending packet... " + localTime) 
    clock.tick(10) 
    try: 
     (data, addr) = mySocket.recvfrom(SIZE) 
     print ("Received packet from: " + str(addr)) 
     print ("Received: " + data.decode('UTF-8')) 
    except: ending=False 
    if ending==True: 
     pygame.quit() 
     sys.exit() 

服務器:

from socket import socket, gethostbyname, AF_INET, SOCK_DGRAM 
import sys 
PORT_NUMBER = 5000 
SIZE = 1024 

hostName = gethostbyname('localhost') 

mySocket = socket(AF_INET, SOCK_DGRAM) 
mySocket.bind((hostName, PORT_NUMBER)) 

print ("Test server listening on port {0}\n".format(PORT_NUMBER)) 

flag="True" 

while flag=="True": 
    #Show that data was received: 
    (data, addr) = mySocket.recvfrom(SIZE) 
    xer=data.decode('UTF-8') 
    print ("Received packet from: " + str(addr) + ", X value:" + str(xer)) 
    (data, addr) = mySocket.recvfrom(SIZE) 
    yer=data.decode('UTF-8') 
    print ("Received packet from: " + str(addr) + ", Y value:" + str(yer)) 
    #Check to see if the other program wants to close: 
    (flagger, addr) = mySocket.recvfrom(SIZE) 
    flag=flagger.decode('UTF-8') 
    #Send a message back to the client: 
    if flag=="False": s="Good-bye!" 
    else: s="Read you loud and clear" 
    mySocket.sendto(bytes(s, 'UTF-8') , (addr)) 
sys.exit() 

以防萬一你想知道爲什麼客戶端是如此之大,這是因爲我試圖做一個小遊戲在pygame的,這將是多玩家。不是互聯網,而是兩臺電腦之間的LAN或無線網絡。 我對套接字和網絡相關的東西很陌生(我不知道局域網基本上與無線或者什麼相同),所以對此非常感謝。 :)

回答

9

不要綁定到本地主機。這意味着你的服務器只會自己收聽。如果綁定到0.0.0.0,這將確保您的服務器正在監聽可以到達它的每臺計算機。 (警告:可能不安全。)

過度的防火牆規則也可能是責任。

確保您連接到您的路由器子網中的服務器的IP。爲此,在Windows上運行Mac/Linux上的ifconfig或在Windows上運行ipconfig,這可能會向您顯示一個192.168.x.x型IP(它不會與您的路由器的IP相同)。您還可以通過其管理頁面查看哪些計算機和IP連接到路由器。

在任何給定的時間點,連接到Internet的計算機都有很多IP。環回地址只對您的計算機「可見」。連接到路由器的任何計算機都可以看到類似10.x.x.x192.168.x.x的IP。大多數其他IP是公有IP。

+1

好吧,我將運行ipconfig來查找IP地址,並在客戶端進行更改。我還會將'hostName = gethostbyname('localhost')'改爲'hostName ='0.0.0.0''。現在當你說不安全時,你的意思是多麼不安全?我不希望人們隨意將病毒放在我的電腦上。有沒有辦法不聽每個人,只有那些在同一個無線路由器上? (路由器受密碼保護) – hammythepig

+2

攻擊者可以將任何TCP數據發送到您的程序。任何漏洞都存在於你的OS/Python /你的程序中。我不會太擔心安全問題,因爲我認爲你的服務器上沒有任何實際資產。 說實話,我不知道如何綁定到路由器只。也許別人可以回答這個問題? – dbkaplun

+2

好的,是的,我不太擔心這種不安全感,這只是一個有趣的小遊戲。當我回到家中並且今晚再次評論並告訴你它是如何發生的時候,我會嘗試一下。希望我能接受你的回答:) – hammythepig

5

您應該使用本地網絡上的計算機的IP地址。本地IP地址應該是這樣的:

| Device |  IP  | 
|:----------:|:-----------:| 
| router  | 192.168.1.1 | 
| computer_1 | 192.168.1.2 | 
| computer_2 | 192.168.1.3 | 
+1

哦我明白了,所以路由器有不同的IP地址。所以我現在有一個'SERVER_IP ='127.0.0.1',我將更改爲運行服務器程序的計算機的IP。另外我知道用'ipconfig'來找到它。非常感謝! – hammythepig