Sockety, problem przesyłania danych

Sockety, problem przesyłania danych
A1
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:50
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:

Kopiuj
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

Kopiuj
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()
A1
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:50
0

0 wyświetleń xd? Podbijam :D

AT
  • Rejestracja:prawie 10 lat
  • Ostatnio:dzień
  • Postów:24
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:

Kopiuj
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:

Kopiuj
"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.

P3
Ha , fajnie to opisałeś :). Długo działasz w socketach i network programing'u?:)
P3
  • Rejestracja:około 8 lat
  • Ostatnio:10 miesięcy
  • Postów:113
0

Rozwiązałeś problem ?

A1
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:50
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.