-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathserverSocketSimu.py
executable file
·135 lines (122 loc) · 4.47 KB
/
serverSocketSimu.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/usr/bin/env python
#########################################################
#Arafat NOUREDDINE
#2015/01/15
#Purpose : Simulate a Socket Server
#########################################################
#-*- coding: utf-8 -*-
import sys
import select
import socket
class Server:
# Contructeur de la class Server.
#
# @param port Port de connexion
# @param listen Nombre de connexion en attente max
def __init__(self, port = 6666, listen = 5):
# Initialisation of attr
self.nbClients = 0 # Nombre de client connectes
self.sockets = [] # Liste des sockets client
# Creation du socket serveur
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# On passe le socket serveur en non-bloquant
self.socket.setblocking(0)
# On attache le socket au port d'ecoute.
self.socket.bind(('', port))
# On lance l'ecoute du serveur. "listen" est le nombre max de
# connexion quand la file d'attente
print 'Server listen (port = %s) ...' %(port)
self.socket.listen(listen)
# Surcouche de la fonction socket.recv
# On utilise le systeme d'exeption de recv pour savoir si il reste
# des donnees a lire
#
# @param socket Socket sur lequelle il faut recuperer les donnees
# @return Donnces envoyees par le client
def receive(self, socket):
buf = "" # Variable dans laquelle on stocke les donnees
_hasData = True # Nous permet de savoir si il y de donnees a lire
while _hasData:
# On passe le socket en non-bloquant
socket.setblocking(0)
try:
_data = socket.recv(256)
if(_data):
buf += _data
else:
# Deconnexion du client
_hasData = False
except:
_hasData = False
return buf
# Fonction qui lance les sockets et s'occupe des clients
def run(self):
# On ajoute le socket serveur a la liste des sockets
self.sockets.append(self.socket)
# Go
while True:
try:
# La fonction select prends trois parametres qui sont la liste des sockets
# Elle renvoie 3 valeurs
# 1- La liste des sockets qui ont recus des donnees
# 2- La liste des sockets qui sont pret a envoyer des donnees
# 3- Ne nous interesse pas dans notre cas
readReady ,writeReady, nothing = select.select(self.sockets, self.sockets, [])
except select.error, e:
break
except socket.error, e:
break
# On parcours les sockets qui ont recus des donnees
for sock in readReady:
if sock == self.socket:
# C'est le socket serveur qui a recus des donnees
# Cela signifie qu'un client vient de se connecter
# On accept donc ce client et on recupere qques infos
client, address = self.socket.accept()
# On incremente le nombre de connecte
self.nbClients += 1
# On ajoute le socket client dans la liste des sockets
self.sockets.append(client)
print ''
print '================================================='
print 'accept client : %s' % (address,)
else:
# Le client a envoye des donnees, on essaye de les lire
try:
# On fait appelle a la surchage que l'on a ecrite plus haut
data = self.receive(sock)
if data:
# On affiche ce qu'on a recu du client
print 'From client :', data
# On renvoi au client ce qu'on a recu
sock.send(data)
print 'To client :', data
else:
# Si data est vide c'est que le client s'est deconnecte
# On diminue le nombre de client
self.nbClients -= 1
# On supprime le socket de la liste des sockets
print 'remove client : %s' %(sock.getsockname(),)
self.sockets.remove(sock)
print '================================================='
print ''
except socket.error, e:
print 'remove client : %s' %(sock.getsockname(),)
self.sockets.remove(sock)
print '================================================='
print ''
#------------------------------------------------------------------------------
# Usage
#------------------------------------------------------------------------------
def usage():
print "Usage: [python] serverSocketSimu.py <port>"
sys.exit(1)
#------------------------------------------------------------------------------
# Main Entry point
#------------------------------------------------------------------------------
if __name__ == "__main__":
if len(sys.argv) < 2:
usage()
server = Server(int(sys.argv[1]), 5)
server.run()