2012-06-11 15 views
9

Bisher konnte ich einen Socket in Python 3.2 ausarbeiten. Der Client sendet einige Daten, eine X- und eine Y-Koordinate, an den Server, und der Server übernimmt die Daten und sendet eine Bestätigungsnachricht zurück. Aber das Problem, das ich habe, ist, es zwischen den Computern zu hören. Mein Server und mein Client funktionieren einwandfrei, wenn ich sie nebeneinander auf demselben Computer ausführe, aber ich möchte, dass sie sich verbinden, während sie auf verschiedenen Computern laufen.Steckdosen zwischen Computern

Ich habe einen Computer im Obergeschoss, und einen Computer im Erdgeschoss, beide mit dem gleichen WLAN. Gibt es eine Möglichkeit, meinen Server und meinen Client mit einem dieser Computer zu verbinden?

Ich habe bereits versucht, die Server-IP auf die IP-Adresse meines drahtlosen Modems zu ändern, aber das hat nicht funktioniert.

Hier ist mein Code so weit, der einzige Unterschied ist, ich die IP-Adresse zurück zu einem Standard-Loopback-Adresse geändert, da es nur meine IP-Wechsel nicht funktioniert:

Auftraggeber:

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() 

Server:

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() 

Nur falls Sie sich fragen, warum der Kunde so groß ist, dann ist es, weil ich versuche, ein kleines Spiel in pygame zu machen, die Multi-Player sein. Kein Internet, aber LAN oder WLAN zwischen meinen beiden Computern. Ich bin sehr neu zu Sockets und Web-verwandten Sachen (ich weiß nicht, ob LAN ist im Grunde das gleiche wie Wireless oder was), so dass jede Hilfe zu diesem wird sehr geschätzt. :)

Antwort

9

Nicht an localhost binden. Dies bedeutet, dass Ihr Server nur auf sich selbst hört. Wenn Sie sich an 0.0.0.0 binden, stellt dies sicher, dass Ihr Server jedem Computer zugehört, der ihn erreichen kann. (Warnung: möglicherweise unsicher.)

Eine übereifrige Firewall Regel könnte auch schuld sein.

Stellen Sie sicher, dass Sie eine Verbindung mit der IP Ihres Servers im Subnetz Ihres Routers herstellen. Um dies zu tun, führen Sie ifconfig auf Mac/Linux oder ipconfig auf Windows, die wahrscheinlich zeigen Sie eine 192.168.x.x-style IP (die nicht die gleiche wie die IP Ihres Routers sein wird). Sie können auch sehen, welche Computer und IP-Adressen über die Verwaltungsseite mit Ihrem Router verbunden sind.

Zu einem bestimmten Zeitpunkt hat ein Computer, der mit dem Internet verbunden ist, viele IPs. Die Loopback-Adresse ist nur für Ihren Computer sichtbar. Eine IP-Adresse wie 10.x.x.x oder 192.168.x.x ist für alle Computer sichtbar, die an Ihren Router angeschlossen sind. Die meisten anderen IPs sind öffentliche IPs.

+1

In Ordnung, ich werde ipconfig ausführen, um die IP-Adresse zu finden, und diese im Client ändern. Ich werde auch den 'hostName = gethostbyname ('localhost')' in 'hostName = '0.0.0.0' 'ändern. Wenn du jetzt unsicher sagst, wie unsicher meinst du das? Ich möchte nicht, dass Leute zufällig Viren auf meinen Computer setzen. Gibt es eine Möglichkeit, nicht alle zu hören, nur diejenigen auf dem gleichen WLAN-Router? (Der Router ist passwortgeschützt.) – hammythepig

+2

Ein Angreifer kann beliebige TCP-Daten an Ihr Programm senden. Alle Sicherheitslücken liegen in Ihrem OS/Python/Ihrem Programm. Ich würde mir keine Sorgen um die Sicherheit machen, da ich davon ausgehe, dass Sie keine echten Assets auf Ihrem Server haben. Um ehrlich zu sein bin ich mir nicht sicher, wie man nur an den Router bindet. Vielleicht kann jemand anderes das beantworten? – dbkaplun

+2

Ok, ja ich mache mir keine Sorgen wegen der kleinen Unsicherheit, das ist nur ein kleines Spiel zum Spaß. Ich werde es ausprobieren, wenn ich nach Hause komme und heute Nacht wieder kommentiere und dir erzähle, wie es gelaufen ist. Hoffentlich kann ich deine Antwort annehmen :) – hammythepig

5

Sie sollten die IP-Adressen der Computer im lokalen Netzwerk verwenden. Die lokale IP-Adresse sollte etwa lauten:

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

oh ich sehe, also hat der Router eine andere IP-Adresse. Also habe ich gerade einen 'SERVER_IP = '127.0.0.1'', den ich in die IP des Computers ändern werde, auf dem das Serverprogramm läuft. Und mit der anderen Antwort weiß ich, ipconfig zu tun, um es zu finden. Danke vielmals! – hammythepig

Verwandte Themen