Web Socket, tek bir TCP bağlantısı üzerinden tam çift yönlü iletişim kanalı sağlayan bir bilgisayar iletişim protokolüdür. WebSocket, web tarayıcılarında ve web sunucularında uygulanmak üzere tasarlanmıştır, fakat herhangi bir istemci veya sunucu uygulaması tarafından uygulanabilmektedir. WebSocket protokolü, TCP tabanlı bağımsız bir protokoldür. HTTP ile tek ilişkisi, HTTP sunucuları tarafından bir Upgrade isteği olarak yorumlanmasıdır.
WebSocket protokolü, sunucuya ve sunucudan gerçek zamanlı veri aktarımını sağlayarak, tarayıcı ile web sunucusu arasında etkileşimi sağlamaktadır. Bu, sunucunun istemci istemeden tarayıcıya içerik gönderebileceği ve bağlantıyı açık tutarak istediği zaman mesaj alabilmesini veya gönderebilmesini sağlayan standart bir yöntem ile sağlanmaktadır. Bu şekilde, tarayıcı ile sunucu arasında iki yönlü devam eden bir iletişim gerçekleşebilmektedir.
>> import socket
Öncelikle python socket kütüphanesini import edelim. Daha sonra socket nesnesi oluşturalım.
>> serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Socket nesnesi oluşturduk. Burada ilk argümanın socket.AF_INET olması, bunun bilinen IP adresi soketi olduğunu gösteriyor. Alternatif olarak birde socket.AF_UNIX var ki, bu UNIX soketleri için kullanılıyor. Dolayısıyla her sistemde bu sabit tanımlı olmayabilir.
İkinci argüman ise bu soketin iletişim tipini gösteriyor. Kullandığımız socket.SOCK_STREAM, en yaygın kullanılan TCP iletişim tipidir.
>> serversocket.bind((socket.gethostname(), 80))
Sunucu görevi görecek bir soketin bağlantı kabul etmeden önce, bir adresle ilişkilendirilmesi gerekir. socket.gethostname() bize bilgisayarımızın ağda kendini hangi isimle tanıttığını gösteren bir fonksiyondur. Bunun yerine, localhost veya “” da kullanılabilirdi. Ancak bu durumda, bu soket sadece o bilgisayardan gelen isteklere açık olur. Ağdaki diğer bilgisayarlar, bu soketimize bağlanamazlar.
İkinci argüman olarak da port numarası belirledik. Soketimizin bu portla ilişkilendirilebilmesi için, bu portun kullanımda olmaması gerekir. Eğer başka bir program bilgisayarınızdaki 80 numaralı portu işgal ediyorsa, işletim sistemi sizin soketinize bu portu vermeyecektir. Bu gibi durumlarda, ya o portu kullanan işlemin o portu bırakmasını beklemeli (soketi kapatmasıyla olur) ya da kendinize başka bir port seçmelisiniz. Port numarası olarak 0 vererek, işletimi sisteminin sizin için uygun bir port seçmesini isteyebilirsiniz.
>> serversocket.bind((socket.gethostname(),0)) >> serversocket.getsockname() ('xxx.xxx.xx.2', 52541)
Örneğin; işletim sistemimizin bize 52541 numaralı portu tayin ettiğini görüyoruz.
>> serversocket.listen(10)
Soketimizi bir adresle ilişkilendirdikten sonra, artık o adresi dinlemeye başlayabiliriz. Argüman olarak verdiğimiz 10 sayısı, işletim sisteminin bizim için ne kadar bağlantı isteğini sırada bekleteceğini gösteriyor. Bu durumda, 10 kişi sırada beklerken eğer 11. kişi bu sokete bağlanmak isterse, o kişi için bağlantı reddedilecek.
Artık bağlantı istekleri işletim sistemi tarafından kabul edilip sıraya konmaya başlandı. Sırada bekleyen ilk isteğimizi kabul edelim;
>> (clientsocket, address) = serversocket.accept()
accept() metodu bize bir tuple döndürür. İlk elemanı, bir client sokettir. Kabul ettiğimiz bağlantıyla iletişim kurmak için, bunun send ve recv metotlarını kullanacağız. Bunun ikinci elemanı da, iki elemandan oluşan başka bir tuple olup, ilk elemanı karşı soketin IP adresi, ikinci elemanı da portudur.
Kodumuza genel olarak bakacak olursak;
import socket server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind((socket.gethostname(), 0)) server.listen(5) print "{}:{} dinleniyor...".format(*server.getsockname()) while True: try: client, address = server.accept() print "{}:{} bağlandı".format(*address) print client.recv(4096) client.send("Isleyen kod bug tutmaz :)") client.close() except KeyboardInterrupt: break server.close()
Bu programı çalıştırdığınızda, hangi adresi dinlediğini size bildirecek. O adresi internet tarayıcınızla ziyaret ederseniz (doğru portu kullandığınızdan emin olun), tarayıcıda “Isleyen kod bug tutmaz 🙂“, program çıktısında da tarayıcının size gönderdiği HTTP başlıklarını göreceksiniz.