Sockety, problem przesyłania danych

0

Cześć, mam problem z przesyłaniem danych między klientem a serwerem. Nie wiem czemu, ale print server.recv(1024) w kliencie wypisuje oba wysłania z serwera, a do zmiennej b nic nie zostaje odebrane. Obstawiam, że to wina printa, ponieważ robiąc np. a= serv.recv (1024) i pod tym b=server.recv(1024), do obu zmiennych trafiają komunikaty. Co w takim razie jest z tym printem nie tak?
Klient:

import socket

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host=socket.gethostname()
port=12345
s.bind((host,port))

s.listen(1)

while True:
    client,addres =s.accept()
    print "jest polaczenie z: ", addres
    data = client.recv(1024)
    print"klient powiedzial: ", data 
    client.send("tresc printa")
    client.send("tresc ze zmiennej")
    client.close()
    break

Klient

import socket              

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)         
host = socket.gethostname() 
port = 12345                
server.connect((host, port))
server.send("no witaj!")
print server.recv(1024)
b= server.recv(1024)
print "tresc druga: " ,b
server.close()
0

0 wyświetleń xd? Podbijam :D

4

Jeśli dobrze zrozumiałem, chodzi ci o to, że dane wysłane przez dwa sendy są odbierane przez jednego recva. Wynika to z tego, że komunikacja po TCP ma charakter strumienia danych. Wywołanie send nie powoduje wysłania pojedynczej, rozróżnialnej wiadomości, a raczej zapisanie pewnych danych do strumienia. Za pomocą recv możesz po drugiej stronie odczytywać pewną część tych danych, jednak rozmiar danych odczytanych przez pojedynczego recva może nie mieć żadnego związku z rozmiarem danych wysłanych przez pojedynczego senda. Przykładowo jeśli u nadawcy wywołasz:

send("AAAAAAAAAA")
send("BBBBBBBBBB")
send("CCCCCCCCCC")

to może się okazać, że odbiorca do odczytania tych danych będzie potrzebował czterech wywołań recv, które zwrócą kolejno:

"AAAAAAA", "AAABBBBBBBBBBC", "CCC", "CCCCCC"

Jeśli chcesz przesyłać wiadomości, to musisz wymyślić jakiś sposób na rozróżnianie ich. Możesz na przykład na początku każdej wiadomości przesyłać jej długość w bajtach, aby wiedzieć gdzie ona się kończy.
No i musisz pamiętać też, że *send *nie zawsze wysyła całość danych podanych jako argument. Jeśli *send *zwróci liczbę mniejszą niż rozmiar danych podanych w argumencie, to znaczy, że przesłał tylko część danych i pozostałą część trzeba przesłać wywołując *send *jeszcze raz na pozostałej części danych.

0

Rozwiązałeś problem ?

0

Skorzystałem z tego, co napisałem w pierwszym poście, czyli przypisałem do zmiennej zamiast używać printa i problem zniknął.

1 użytkowników online, w tym zalogowanych: 0, gości: 1