Sockety, problem przesyłania danych

Odpowiedz Nowy wątek
2018-05-09 15:04
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()

Pozostało 580 znaków

2018-05-09 20:53
0

0 wyświetleń xd? Podbijam :D

Pozostało 580 znaków

2018-05-10 10:53

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.

Ha , fajnie to opisałeś :). Długo działasz w socketach i network programing'u?:) - pain368 2018-05-13 12:29

Pozostało 580 znaków

2018-05-13 12:31
0

Rozwiązałeś problem ?

Pozostało 580 znaków

2018-05-13 20:01
0

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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