Socket programlama: gönderilecek/alınacak verinin uzunluğu

Arkadaşlar ben ve arkadaşlarım için bir kod streaming uygulaması geliştiriceğim ama aklıma bir şey takıldı biz s.recv(size) dediğimiz zaman o size kadar veriyi çekiyor benim istediğim ise mesajın uzunluğu ne olursa olsun hepsini çekmesi bu techwithtimde vardı ama kodu anlayamadım bana biri mantığını detaylı bir şekilde anlatabilir mi?


kod parçası:

def send(msg):
    message = msg.encode(FORMAT)
    msg_length = len(message)
    send_length = str(msg_length).encode(FORMAT)
    send_length += b' ' * (HEADER - len(send_length))
    client.send(send_length)
    client.send(message)

eğer kod hakkında daha fazla detay gerekiyorsa:https://techwithtim.net/tutorials/socket-programming/

Mesajlarınızı paket paket gönderip alıcıda bütün paketi alıp birleştirmeyi deneyebilirsiniz.

1 Beğeni

Sorunun çözümü için bu kod kullanılabilir:

Mesajın uzunluğunu da mesajla beraber yolluyor, bu uzunluk hep sabit sayıda byte kullanılarak (bu kodda HEADER yani 64) yollandığı için mesajı alan kişi hangi bölümün mesajın uzunluğunu belirttiğini biliyor.

nasıl sabit sayıda byte oluyor mesela mesajın büyüklüğü 65 ise nasıl göndericek sanırım anlamadım biraz daha açıklayabilirmisiniz yani o uzunluğu da almak için bir header(64) gerekmiyormu :frowning: sanırım kafam çok karışık

send_lenght ve message değişkenini ekrana yazdırıp inceleyin.

Var zaten, HEADER değişkeni.

bana socket programlama için bir link atarmısınız sanırım headerı nasıl kullanacağımı bilmiyorum yani mesajın uzunluğu o mesajın uzunluğunu çekmek için kullanacağımız headerdan büyük olursa normalde o mesajın uzunluğunuda çekememesi lazım değil mi? off sanırım baya bir araştırma yapıcam :frowning:

Zaten mesajın uzunluğu bu örnekte 64 karakteri geçerse sıkıntı oluşur. Ama 9999999999999999999999999999999999999999999999999999999999999999 yeterince büyük bir sayı, geçilebileceğini sanmıyorum.

yani demek istediğiniz bu yöntemde gene uzunluğa bağlı
bu yüzden @pythonrehberi nin önerdiği yol daha iyi (mi?)

burayı anlamadım

Header’in uzunluğu sabit olduğu için oluşturduğumuz sistemde tek mesajın sahip olabileceği uzunluğun bir sınırı var. Başka yöntemler kullanarak bu sınıra takılmayacak sistemler de yazabiliriz. Mesela:

{mesajın uzunluğu}{ayıraç}{mesaj}{mesajın uzunluğu}{ayıraç}{mesaj}
|           Bir mesaj           ||         Başka bir mesaj       |

Sadece bir defa mesaj yollayacaksanız ve bu mesajın uzunluğu belli ise daha iyi olabilir. Ama siz art arda mesaj yollamak istemiyor musunuz?


Verdiğiniz kodda mesajın uzunluğu onluk tabandaki gösterimi ile 64 byte uzunluğunda bir header olarak yollanıyor, bu header’in sahip olabileceği en büyük sayısal değer "9"*64

1 Beğeni

temel prensib mesajları parçalamak anladığım kadarıyla

benim yapıcağım uygulama codeshare sitesi gibi iki kişi stream şekilde kod yazıcak bunu da her klavye değişikliğinde servere göndermeyi düşünüyordum

hocam anlattıklarınızı basit bir kod parçasıyla anlatabilir misiniz lütfen ?

Mesajları gönderdiğimiz gibi parçalı almak istiyorsak bir şekilde parçalamamız lazım.

Mesela gönderilecek mesaj hep 1 karakter uzunluğunda olacak ise yukarıdaki gibi bir sisteme gerek yok, recv(1) kullanırsınız.

olabilir evet eğer bu işlem clientin main threadinde olacaksa biraz performans kaybı olmaz mı adam çok hızlı yazıyor diyelim yoksa yanlış mı düşünüyorum :smile: kusuruma bakmayın

recv gibi programı durduran işlemler bu süreçte performans yemiyor. Siz neyi kastettiniz?

Saniyede 1024 tuşa basarsa ve hepsini teker teker yollarsanız TCP headerleri ile beraber ortalama 21 - 43 Kilobayt yapıyor.

anladım dediğiniz yöntemi deniyeceğim

yani program(client) main threadde olsa bile donmaz diye düşünüyorum

Niye donmasın? recv fonksiyonu döndürecek bir veri buluna kadar bekliyor.

neyse sizi anladım ben tavsiyeniz için teşekkür ederim :smiley: son olarak ben klavyedeki girişi input fonksiyonu olmadan nasıl alırım
birde bir sorun var aklımda ya kişi yazdığı kodu silmek isterse ne yapıcağım

Bununla alakalı modüller var ama bir arayüz kütüphanesi kullanmanız daha kolay olur.

Ona özel bir karakter yollayıp karşı tarafta o özel karakteri işleyeceksiniz.

1 Beğeni