计算机之间的套接字

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基本上和无线网络是否相同),所以任何帮助都将不胜感激。:)

2个回答

10

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

过于严格的防火墙规则也可能是问题所在。

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

任何时候,连接到互联网的计算机都有许多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数据。任何漏洞都存在于您的操作系统/Python/您的程序中。我不会太担心安全问题,因为我假设您的服务器上没有任何真正的资产。老实说,我不确定如何仅绑定到路由器。也许有人可以回答这个问题? - dbkaplun
2
好的,没错,我不太担心这个小漏洞,这只是一个娱乐游戏。我会在回家后试一下并在今晚再评论告诉你结果。希望我能接受你的答案 :) - hammythepig

6

您应该使用本地网络中计算机的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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接