python - 计算机之间的套接字

标签 python sockets python-3.x pygame

到目前为止,我已经能够在 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 是否与无线基本相同或什么)所以非常感谢任何帮助。 :)

最佳答案

不要绑定(bind)到本地主机。这意味着您的服务器将只听自己的声音。如果您绑定(bind)到 0.0.0.0,这将确保您的服务器正在监听可以访问它的每台计算机。 (警告:可能不安全。)

过分热心的防火墙规则也可能是罪魁祸首。

确保您连接到路由器子网中的服务器 IP。为此,在 Mac/Linux 上运行 ifconfig 或在 Windows 上运行 ipconfig,这可能会显示一个 192.168.x.x 样式的 IP(这不会与您路由器的 IP 相同)。您还可以通过其管理页面查看哪些计算机和 IP 连接到您的路由器。

在任何给定时间点,连接到 Internet 的计算机都有许多 IP。环回地址仅对您的计算机“可见”。像 10.x.x.x192.168.x.x 这样的 IP 对连接到路由器的任何计算机都是可见的。大多数其他 IP 都是公共(public) IP。

关于python - 计算机之间的套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10985112/

相关文章:

python - Python 支持哪些拼写错误/拼写错误?

c++ - sockets和timer如何互不阻塞地使用?

java - 寻找 “too many files” 原因

服务器端的 C++ TCP 套接字多次写入()在客户端被视为单次读取

python - python中不同模块的多个日志文件

python-3.x - 使用 PostgreSQL copy_from、psycopg2 和 StringIO 批量插入

python - 如何使用 Flask 将字典内容显示到网页中

python - 在 vi 编辑器中运行 python 代码并传递用户输入

python - os.path.dirname 在 django 中返回空字符串

python - 我想使用 NumPy/SciPy。我应该使用 Python 2 还是 3?