Pythonda client/server umumiy kanalli chat dasturi

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