9

これまでのところ、python 3.2で基本的なソケットを作成することができました。クライアントは X 座標と Y 座標のデータをサーバーに送信し、サーバーはデータを受け取って確認メッセージを返します。しかし、私が抱えている問題は、コンピューター間でリッスンすることです。私のサーバーとクライアントは、同じコンピューターで並べて実行すると完璧に動作しますが、別のコンピューターで実行しているときにそれらを接続したいと考えています。

2 階に 1 台、1 階に 1 台のコンピューターがあり、どちらも同じワイヤレス インターネットを使用しています。これらの各コンピューターからサーバーとクライアントを接続する方法はありますか?

サーバーの 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 でマルチプレイヤーになる小さなゲームを作ろうとしているからです。インターネットではなく、2台のコンピューター間のLANまたはワイヤレス。私はソケットと Web 関連のものに非常に慣れていないので (LAN が基本的にワイヤレスと同じかどうかはわかりません)、これに関するヘルプは大歓迎です。:)

4

2 に答える 2

10

localhost にバインドしないでください。これは、サーバーが自分自身だけをリッスンすることを意味します。にバインドする0.0.0.0と、サーバーがアクセスできるすべてのコンピューターをリッスンするようになります。(警告: 安全でない可能性があります。)

過度に熱心なファイアウォール ルールも原因である可能性があります。

ルーターのサブネット内のサーバーの IP に接続していることを確認してください。これを行うには、ifconfigMac/Linux またはipconfigWindows で実行します。おそらく 形式の IP が表示192.168.x.xされます (ルーターの IP とは異なります)。また、管理ページを介して、ルーターに接続されているコンピューターと IP を確認することもできます。

任意の時点で、インターネットに接続されているコンピューターには多くの IP があります。ループバック アドレスは、コンピュータからのみ「見える」ものです。ルーターに接続されているすべてのコンピューターに似た10.x.x.x、または表示される可能性のある IP 。192.168.x.x他のほとんどの IP はパブリック IP です。

于 2012-06-11T18:06:06.857 に答える
6

ローカル ネットワーク上のコンピュータの IP アドレスを使用する必要があります。ローカル IP アドレスは次のようになります。

|   Device   |      IP     |
|:----------:|:-----------:|
| router     | 192.168.1.1 |
| computer_1 | 192.168.1.2 |
| computer_2 | 192.168.1.3 |
于 2012-06-11T18:06:50.110 に答える