Skip to content

Instantly share code, notes, and snippets.

@Qolt
Last active December 16, 2015 18:48
Show Gist options
  • Save Qolt/5479970 to your computer and use it in GitHub Desktop.
Save Qolt/5479970 to your computer and use it in GitHub Desktop.
# -*- coding: utf-8 -*-
import socket
import select
class ChatServer:
def __init__( self, port ):
self.port = port;
#Создаем интернет-сокет
self.srvsock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
#Опция для быстрого рестарта сервера
self.srvsock.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 )
self.srvsock.bind( ("", port) ) # Привязка к порту
self.srvsock.listen( 5 ) #Клиентов в очереди
self.descriptors = [self.srvsock] #Список созданных сокетов
print 'ChatServer started on port %s' % port
def run( self ): #Главный цикл
while 1:
#Ждем события 'sread' в списке сокетов
(sread, swrite, sexc) = select.select( self.descriptors, [], [] )
for sock in sread:
#Если получили соединение к серверному сокету
if sock == self.srvsock:
self.accept_new_connection() #Добовляем клиента
else:
#Получаем сообщение
str = sock.recv(100)
#Если пришло пустое сообщение, или клиент хочет выйти закрываем сокет
if str == '' or str == "/q\r\n":
host,port = sock.getpeername()
str = 'Client left %s:%s\r\n' % (host, port)
self.broadcast_string( str, None )
sock.shutdown(2)
sock.close
self.descriptors.remove(sock)
else: #Иначе отправляем всем сообщение
host,port = sock.getpeername()
newstr = '[%s:%s] %s' % (host, port, str)
self.broadcast_string( newstr, None )
#Метод для отправки сообщения. Можно указать клиента, которому сообщение не отправится
def broadcast_string( self, str, omit_sock ):
for sock in self.descriptors:
if sock != self.srvsock and sock != omit_sock:
sock.send(str)
print str
#Метод для подключения нового клиента
def accept_new_connection( self ):
newsock, (remhost, remport) = self.srvsock.accept()
self.descriptors.append( newsock )
newsock.send("You're connected to the Python chatserver\r\n")
str = 'Client joined %s:%s\r\n' % (remhost, remport)
self.broadcast_string( str, None )
if __name__ == "__main__":
myServer = ChatServer(1024).run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment