socket lokales netzwerk

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
dannemann
User
Beiträge: 18
Registriert: Samstag 6. September 2008, 17:29

Hi Leute,

Ich hab vor kurzem angefangen mich für das Thema
Netzwerkprogrammiereung zu interressieren und hab ein kleines
Programm geschrieben das über eine Lan-Verbindung vom einen
Client über den Server zum anderen Client die Koordinaten der
Spielfigur übergeben SOLL(Zusätzlich verwende ich Pygame zur
Darstellung).
Wenn ich das ganze an einem Computer teste, also den Server starte
und die 2 Clienten, dann gehts.
Wenn ich jetzt aber auf einem Computer den server starte und einen
Clienten und auf einem anderen Computer den anderen Clienten dann
bekomme ich keine Verbindung zum stehen.

Muss ich vielleicht etwas umschreiben?
Welche Host-IP/Port soll ich eintragen?
Ist ein Socket überhaupt dafür gedacht?
Kennt ihr vielleicht ein paar gute Tuts?

Anfänger bittet um Hilfe:

Bitte nicht am Code erschrecken :oops:

Server:

Code: Alles auswählen

import socket
import sys
import pygame
from pygame.locals import *
pygame.init()

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host ="127.0.0.1"
port =6251
s.bind((host, port))

s.listen(1)
conn1,addr1 = s.accept()
print "Client-Adresse: ", addr1
conn1.send("Verbunden")
conn1.setblocking(1)

s.listen(1)
conn2,addr2 = s.accept()
print "Client-Adresse: ", addr2
conn2.setblocking(1)
conn2.send("Verbunden")

print "Zum Verlassen EXIT eingeben"

get=""
while(get!="exit"):
    data = conn1.recv(1000000)
    conn2.send(data)
    data = conn2.recv(1000000)
    conn1.send(data)
    
conn.close()
s.close()
Client:

Code: Alles auswählen

import socket
import sys,random
import pygame
from pygame.locals import *
pygame.init()

bgc=(0,0,0)
scrsize=(800,600)
screen=pygame.display.set_mode((scrsize))
screen.fill(bgc)
pygame.display.flip()

clock=pygame.time.Clock()

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host = "127.0.0.1"
port = 6251
s.connect((host, port))
data = s.recv(1000000)
print data

class Player:
    def __init__(self,x,y,speed):
        self.x=x
        self.y=y
        self.speed=speed
        self.img=pygame.Surface((30,30))
        self.img.fill((255,255,255))

    def move(self,up,down,left,right):
        self.x+=right*self.speed
        self.x-=left*self.speed
        self.y+=down*self.speed
        self.y-=up*self.speed

    def draw(self,scr):
        scr.blit(self.img,(self.x-self.img.get_width()/2,self.y-self.img.get_height()/2))

player={}
w,h=scrsize
player[0]=Player(random.randint(0,w),random.randint(0,h),3)
player[1]=Player(random.randint(0,0),random.randint(0,0),3)

def main():
    up=down=left=right=0
    while 1:
        screen.fill(bgc)
        clock.tick(60)
        
        for e in pygame.event.get():
            if e.type==QUIT:
                sys.exit()
            if e.type==KEYDOWN:
                if e.key==K_UP:
                    up=1
                if e.key==K_DOWN:
                    down=1
                if e.key==K_LEFT:
                    left=1
                if e.key==K_RIGHT:
                    right=1
            if e.type==KEYUP:
                if e.key==K_UP:
                    up=0
                if e.key==K_DOWN:
                    down=0
                if e.key==K_LEFT:
                    left=0
                if e.key==K_RIGHT:
                    right=0

        player[0].move(up,down,left,right)
        for i in range(len(player)):
            player[i].draw(screen)
        
        s.send(str(player[0].x)+","+str(player[0].y))
        data = s.recv(1000000)
        data=data.split(",")
        player[1].x=int(data[0])
        player[1].y=int(data[1])
        
        pygame.display.flip()

if __name__ == "__main__": main()
s.close()
Vielen Dank,

phil

ps.: kann leider erst wieder nächstes Wochenende antworten
Wer Schmetterlinge lachen hört der weis wie Wolken schmecken
BlackJack

@dannemann: 127.0.0.1 ist das Loopback-Device des Rechners auf dem das jeweilige Programm läuft. Das heisst, dass die Clients versuchen sich mit einem Server auf dem gleichen Rechner zu verbinden, auf dem sie selbst laufen. Das geht natürlich nicht, wenn der Server auf einem anderen Rechner läuft. Da musst Du schon eine IP des Servers verwenden, über die er auch von den Rechnern mit den Clients erreichbar ist.
dannemann
User
Beiträge: 18
Registriert: Samstag 6. September 2008, 17:29

Hi Blackjack,

Hätte ich auch schon versucht
Danke trotzdem
Aber sonst müsste es funktionieren, oder?
Dann kann es sein das die Firewall blockiert.
Wer Schmetterlinge lachen hört der weis wie Wolken schmecken
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Schreib doch mal ein kleines Beispiel mit einem einfachen Client und einem einfachen Server. Du vermischt momentan Code der nicht zusammengehört und schreibst alles auf Modulebene.

Die Firewalls sind hierbei natürlich immer eine beliebte Fehlerquelle.
Das Leben ist wie ein Tennisball.
dannemann
User
Beiträge: 18
Registriert: Samstag 6. September 2008, 17:29

hi EyDu,

Hier ein einfaches Programm:

Server:

Code: Alles auswählen

import socket
import sys

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host ="127.0.0.1"
port =6251
s.bind((host, port))

s.listen(1)
conn1,addr1 = s.accept()
print "Client-Adresse: ", addr1
conn1.setblocking(1)
conn1.send("Verbunden")

s.listen(1)
conn2,addr2 = s.accept()
print "Client-Adresse: ", addr2
conn2.setblocking(1)
conn2.send("Verbunden")

get=""
while(get!="exit"):
    data = conn1.recv(1000000)
    conn2.send(data)
    data = conn2.recv(1000000)
    conn1.send(data)
    
conn.close()
s.close()
Client:

Code: Alles auswählen

import socket
import sys,random

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host = "192.168.178.10"
port = 6251
s.connect((host, port))
data = s.recv(1000000)
print data

get=""
while(get!="exit"):
    data=random.randint(0,10)
    data=str(data)
    print "Sende "+data
    s.send(data)
    pygame.time.delay(5000)
    data = s.recv(1000000)
    print "Empfange "+data
    pygame.time.delay(5000)
    
s.close()
Wer Schmetterlinge lachen hört der weis wie Wolken schmecken
BlackJack

@dannemann: Na da passen jetzt ganz offensichtlich die IP-Adressen nicht zusammen. Der Server "lauscht" ja immer noch auf dem Loopback und nicht auf der IP über die sich der Client verbinden möchte.
Antworten