Pythonda client/server umumiy kanalli chat dasturi
Salom. Shu kunlarda Python ni o’rganyapman. Ochig’ini aytsam man pythonda kod yozish yoqdi. Chunki kodni TAB ni bosmasdan yozib bo’lmaydi. Bu degani kodingiz har doim chiroyli ko’rinishda bo’ladi. Ayrim dasturchilarga o’xshab bir qatorda yozolmaysiz (ayrim holalrdan tashqari).
Mavzuga kelsam, server 1 ta va hamma clientlar shu serverga bog’lanadi va bitta client yozgan xat barcha clientlarga boradi. Shuning uchun ham umumiy kanalli ya’ni clientlar o’zaro gaplash olmaydi.
Umuman pythonda ham socket lar bilan ishlash qolgan dasturlardagiga juda o’xshash faqat sintatsis boshqacharoq holos. Shuning uchun socketlar haqida ko’p gapirmaymanda faqat kodni beraman. Chunki qolgani kodda yozilgan
Server
import select
import socket
import sys
def main():
# Yangi socket yaratamiz
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# nonblocking qilamiz
# bu read, write larda kutib turmaslik uchun kerak
sock.setblocking(0)
# qaysi interface ni tinglashni ko'rsatamiz port bilan birga
sock.bind(("127.0.0.1", 8899))
# bir vaqtning o'zida nechta client ulana olishini ko'rsatamiz
sock.listen(10)
# bular select.select uchun kerak
# ya'ni nonblocked socketlarda kernel eventlar
# bilan ishlash kerak. Ya'ni yadro socketdan kelgan
# ma'lumotlardan kelib chiqib ushbu massivlarga
# kerakli connection.id larni beradi
inputs = [ sock ]
outputs = []
# asosiy sikl
while inputs:
# yanro eventini kutamiz
readable, writable, exceptional = select.select(inputs, outputs, inputs)
# kelgan xatlarni olamiz va ulangan
# barcha clientlarga tarqatamiz
for s in readable:
# agar server socket bo'lsa
if s is sock:
# yangi clientni olamiz
conn, addr = sock.accept()
print "Yangi client %s" % str(addr)
# nonblocking qilamiz
# conn.setblocking(0)
# va umumiy ro'yxatga qo'shamiz
inputs.append(conn)
else:
# ma'lumotni o'qiymiz
data = s.recv(1024)
# agar ma'lumotni o'qishda xatolik bo'lsa
# clientni ro'yxatdan o'chiramiz va socketni yopamiz
if not data:
s.close()
inputs.remove(s)
continue
# server va o'zidan boshqa clientlarga jo'natamiz
for c in inputs:
if not c is sock and not c is s:
c.send(data)
if (__name__ == "__main__"):
main()
Client
import socket
import select
import threading
import sys
def read_thread(sock):
while True:
data = sock.recv(1024)
print data
def main():
# nickni kiritish, bo'sh bo'lmasligini tekshirish
while True:
nick = raw_input("Nick: ")
if nick:
break
# yangi socket yaratamiz
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# non blocking qilamiz
# sock.setblocking(0)
# serverga bog'lanamiz
try:
sock.connect(('127.0.0.1', 8899))
except:
print "Bog'lanishda xatolik yuz berdi"
return
# yangi patok, kelgan xatlarni o'qib turishi uchun
thread = threading.Thread(target = read_thread, args = (sock, ))
thread.start()
while True:
data = raw_input("Siz:n")
sock.send(nick + ": " + data)
if (__name__ == "__main__"):
main()
Dasturda setnonblocking ishlatgandim nimagadir client ulanganda xatolik yuz berdi keyin olib tashladim norm ishladi.
Texnologiyalar
Pythonda client/server umumiy kanalli chat dasturi