到目前爲止,我已經能夠在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或無線網絡。 我對套接字和網絡相關的東西很陌生(我不知道局域網基本上與無線或者什麼相同),所以對此非常感謝。 :)
好吧,我將運行ipconfig來查找IP地址,並在客戶端進行更改。我還會將'hostName = gethostbyname('localhost')'改爲'hostName ='0.0.0.0''。現在當你說不安全時,你的意思是多麼不安全?我不希望人們隨意將病毒放在我的電腦上。有沒有辦法不聽每個人,只有那些在同一個無線路由器上? (路由器受密碼保護) – hammythepig
攻擊者可以將任何TCP數據發送到您的程序。任何漏洞都存在於你的OS/Python /你的程序中。我不會太擔心安全問題,因爲我認爲你的服務器上沒有任何實際資產。 說實話,我不知道如何綁定到路由器只。也許別人可以回答這個問題? – dbkaplun
好的,是的,我不太擔心這種不安全感,這只是一個有趣的小遊戲。當我回到家中並且今晚再次評論並告訴你它是如何發生的時候,我會嘗試一下。希望我能接受你的回答:) – hammythepig