2012-06-11 35 views
9

Cho đến nay tôi đã có thể tìm ra một ổ cắm cơ bản trong python 3.2. Máy khách gửi một số dữ liệu, một tọa độ X và Y, đến máy chủ và máy chủ lấy dữ liệu và gửi lại một thông báo xác nhận. Nhưng rắc rối tôi gặp phải là làm cho nó lắng nghe giữa các máy tính. Máy chủ và máy khách của tôi hoạt động hoàn hảo khi tôi chạy chúng song song trên cùng một máy tính, nhưng tôi muốn kết nối chúng trong khi chạy trên các máy tính khác nhau.Ổ cắm giữa các máy tính

Tôi có một máy tính ở tầng trên và một máy tính ở tầng dưới, cả hai đều sử dụng cùng một mạng không dây. Có cách nào tôi có thể kết nối máy chủ và máy khách của tôi từ một trong các máy tính này không?

Tôi đã thử thay đổi IP máy chủ thành địa chỉ IP của modem không dây của tôi, nhưng điều đó không hoạt động.

Đây là mã của tôi cho đến nay, sự khác biệt duy nhất là tôi đã thay đổi địa chỉ IP lại đến một địa chỉ lặp lại tiêu chuẩn, vì chỉ cần thay đổi nó để IP của tôi đã không làm việc:

Chủ đầu tư:

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() 

server:

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() 

Chỉ trong trường hợp bạn đang tự hỏi tại sao các khách hàng là quá lớn, đó là bởi vì tôi đang cố gắng để làm cho một trò chơi nhỏ trong pygame rằng sẽ nhiều người chơi. Không phải internet nhưng LAN hoặc không dây giữa hai máy tính của tôi. Tôi rất mới vào ổ cắm và các công cụ liên quan đến web (Tôi không biết nếu LAN về cơ bản giống như không dây hay cái gì) vì vậy bất kỳ trợ giúp nào về điều này được đánh giá cao. :)

Trả lời

9

Không liên kết với localhost. Điều này có nghĩa là máy chủ của bạn sẽ chỉ nghe chính nó. Nếu bạn liên kết với 0.0.0.0, điều này sẽ đảm bảo rằng máy chủ của bạn đang nghe mọi máy tính có thể truy cập. (Cảnh báo: có khả năng không an toàn.)

Quy tắc tường lửa quá mức cũng có thể bị đổ lỗi.

Đảm bảo bạn đang kết nối với IP của máy chủ trong mạng con của bộ định tuyến. Để làm như vậy, hãy chạy ifconfig trên Mac/Linux hoặc ipconfig trên Windows, có thể sẽ hiển thị cho bạn một IP kiểu 192.168.x.x (sẽ không giống với IP của bộ định tuyến). Bạn cũng có thể xem những gì máy tính và IP được kết nối với router của bạn thông qua trang quản trị của nó.

Tại bất kỳ thời điểm nào, máy tính được kết nối Internet có nhiều IP. Địa chỉ lặp lại chỉ hiển thị với máy tính của bạn. Một IP như 10.x.x.x hoặc 192.168.x.x sẽ hiển thị với mọi máy tính được kết nối với bộ định tuyến của bạn. Hầu hết các IP khác là các IP công cộng.

+1

Được rồi, tôi sẽ chạy ipconfig để tìm địa chỉ IP và thay đổi địa chỉ đó trong ứng dụng khách. Tôi cũng sẽ thay đổi 'hostName = gethostbyname ('localhost')' thành 'hostName = '0.0.0.0''. Bây giờ khi bạn nói không an toàn, bạn có ý nghĩa gì không an toàn? Tôi không muốn mọi người đưa virus vào máy tính của tôi một cách ngẫu nhiên. Có cách nào để không nghe tất cả mọi người, chỉ những người trên cùng một bộ định tuyến không dây? (bộ định tuyến được bảo vệ bằng mật khẩu) – hammythepig

+2

Kẻ tấn công có thể gửi bất kỳ dữ liệu TCP nào đến chương trình của bạn. Bất kỳ lỗ hổng nào nằm trong OS/Python/chương trình của bạn. Tôi sẽ không quá lo lắng về bảo mật vì tôi cho rằng bạn không có bất kỳ tài sản thực sự nào trên máy chủ của bạn. Thành thật mà nói, tôi không chắc chắn cách liên kết với bộ định tuyến. Có lẽ ai đó khác có thể trả lời điều này? – dbkaplun

+2

Ok, vâng tôi không quá lo lắng về sự bất an nhỏ, đây chỉ là một trò chơi nhỏ cho vui. Tôi sẽ thử nó khi tôi về nhà và bình luận một lần nữa tối nay và cho bạn biết nó như thế nào. Hy vọng rằng tôi có thể chấp nhận câu trả lời của bạn :) – hammythepig

5

Bạn nên sử dụng địa chỉ IP của máy tính trên mạng cục bộ. Địa chỉ IP cục bộ phải giống như sau:

| Device |  IP  | 
|:----------:|:-----------:| 
| router  | 192.168.1.1 | 
| computer_1 | 192.168.1.2 | 
| computer_2 | 192.168.1.3 | 
+1

Tôi hiểu rồi, vậy router có địa chỉ IP khác. Vì vậy, tôi có một 'SERVER_IP = '127.0.0.1'' ngay bây giờ, mà tôi sẽ thay đổi thành IP của máy tính chạy chương trình máy chủ. Và với câu trả lời khác tôi biết làm 'ipconfig' để tìm nó. Cảm ơn rất nhiều! – hammythepig