ham*_*pig 9 python sockets pygame python-3.x
到目前为止,我已经能够在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()
Run Code Online (Sandbox Code Playgroud)
服务器:
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()
Run Code Online (Sandbox Code Playgroud)
万一你想知道为什么客户这么大,这是因为我试图用pygame做一个多人游戏.我的两台计算机之间不是互联网,而是LAN或无线.我对套接字和网络相关的东西很新(我不知道LAN是否与无线或基本相同)所以对此有任何帮助都非常感谢.:)
dbk*_*lun 10
不要绑定到localhost.这意味着您的服务器只会收听自己.如果绑定到0.0.0.0,则将确保您的服务器正在侦听可以访问它的每台计算机.(警告:可能不安全.)
过分热心的防火墙规则也可能是罪魁祸首.
确保连接到路由器子网中的服务器IP.为此,请ifconfig在Mac/Linux或ipconfigWindows上运行,这可能会显示一个类型的192.168.x.xIP(与路由器的IP不同).您还可以通过其管理页面查看哪些计算机和IP连接到路由器.
在任何给定的时间点,连接到Internet的计算机都有许多IP.环回地址仅对您的计算机"可见".连接到路由器的任何计算机都可以看到10.x.x.x或者192.168.x.x可以看到IP .大多数其他IP都是公共IP.
您应该使用本地网络上的计算机的IP地址.本地IP地址应该是这样的:
| Device | IP |
|:----------:|:-----------:|
| router | 192.168.1.1 |
| computer_1 | 192.168.1.2 |
| computer_2 | 192.168.1.3 |
Run Code Online (Sandbox Code Playgroud)