Last active
December 16, 2015 18:48
-
-
Save Qolt/5479970 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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