-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathclientteste.py~
207 lines (187 loc) · 6.03 KB
/
clientteste.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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
# -*- coding: utf-8 -*-
import socket
import sys
import struct
import select
def main():
# Create TCP/IP socket
IP = ( sys.argv[1] )
port = int( sys.argv[2] )
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_adress = ( IP, port )
# Stablish connection
sock.connect(server_adress)
numseqprog = 1
print('Conectado com o servidor')
# manda OI
oi = struct.pack('!H', 3) + struct.pack('!H', 0) + struct.pack('!H', 65535) + struct.pack('!H', 0)
sock.send(oi)
# recebe OK
ok = sock.recv(2)
msg_type = struct.unpack('!H', ok)[0]
if msg_type == 1:
ok = sock.recv(2)
idfrom = struct.unpack('!H', ok)[0]
ok = sock.recv(2)
myid = struct.unpack('!H', ok)[0]
print('\nMeu ID é:', myid)
ok = sock.recv(2)
numseq = struct.unpack('!H', ok)[0] # recebe o numero de sequencia
else:
sock.close()
sys.exit()
nickname = input('Deseja ter um apelido? s/n ')
#if nickname == 's': #manda OIAP
msg_type = 0
while nickname == 's' and msg_type != 1:
mynick = input('Digite o apelido: ')
print(mynick)
nicklen = len(mynick)
nick = mynick.encode()
oiap = struct.pack('!H', 13) + struct.pack('!H', myid) + struct.pack('!H', 65535) + struct.pack('!H', numseqprog) + \
struct.pack('!H', nicklen) + nick
sock.send(oiap)
numseqprog += 1
# recebe OK
ok = sock.recv(2)
msg_type = struct.unpack('!H', ok)[0]
ok = sock.recv(6)
if msg_type != 1:
print('Não foi possivel guardar o apelido')
nickname = input('Deseja ter um apelido? s/n ')
print('\n==============================')
print('Escolha uma opcao: ')
print('[1] Enviar uma mensagem\n' + \
'[2] Lista de clientes\n' + \
'[3] Sair')
print('==============================\n')
while 1:
socket_list = [sys.stdin, sock]
ready_to_read, ready_to_write, error_sock = select.select(socket_list , [], [])
for i in ready_to_read:
if i == sock: # mensagem recebida do servidor
msg = sock.recv(2)
msg_type = struct.unpack('!H', msg)[0]
if not msg:
sys.exit()
elif msg_type == 2:
print('ERRO. NAO EXISTE ESSE CLIENTE')
aux = sock.recv(4)
aux = sock.recv(2) #recebe numero de sequencia
elif msg_type == 7:
aux = sock.recv(6)
aux = sock.recv(2)
length = struct.unpack('!H', aux)[0]
aux = sock.recv(length*2)
#cl = pickle.loads(aux)
cl = struct.unpack('{}H'.format(length),aux)
clist = ', '.join([str(x) for x in cl])
print('\n>Lista de clientes:', clist,'\n')
# manda OK
msg_type = 1
elif msg_type == 5:
msg = sock.recv(2)
idfrom = struct.unpack('!H', msg)[0]
msg = sock.recv(2)
dst = struct.unpack('!H', msg)[0]
if myid == dst or dst == 0:
print('ta certo')
msg = sock.recv(2) # recebe o numero de sequencia
msg = sock.recv(2)
length = struct.unpack('!H', msg)[0]
msg = sock.recv(length)
mensagem = msg.decode()
print('\nMensagem de', idfrom,':')
print('>>>', mensagem, '\n')
#manda OK
msg_type = 1
elif msg_type == 17:
aux = sock.recv(6)
aux = sock.recv(2)
lengthtot = struct.unpack('!H', aux)[0]
aux = sock.recv(lengthtot*2)
cl = struct.unpack('{}H'.format(lengthtot),aux)
x=0
apelidos = {}
while x<lengthtot:
aux = sock.recv(2)
length = struct.unpack('!H', aux)[0]
aux = sock.recv(length)
apl = aux.decode()
apelidos[cl[x]] = apl
x += 1
print('\n>Lista de apelidos: ',apelidos,'\n')
elif msg_type == 1: # OK
print('OK')
aux = sock.recv(4)
aux = sock.recv(2) #recebe numero de sequencia
if numseqprog == 0:
sock.close()
sys.exit()
else: # mensagem do teclado
cmd = input()
if cmd == '1': # envia mensagem
print('entrou 1')
modo = input('Usar um ID[1], ou usar um apelido[2]: ')
if modo == '1':
dst = int(input('ID do destino: '))
while dst == myid:
print('Nao mande mensagem para você mesmo')
dst = int(input('ID do destino: '))
mensagem = input('Mensagem: ')
#mandar a msg
length = len(mensagem)
mensagem = mensagem.encode()
msg = struct.pack('!H', 5) + struct.pack('!H', myid) + struct.pack('!H', dst) + \
struct.pack('!H', numseqprog) + struct.pack('!H', length) + mensagem
numseqprog +=1
sock.send(msg)
elif modo == '2': #usando apelido
dst = input('Apelido do destino: ')
if nickname == 's':
while dst == mynick:
print('Nao mande mensagem para você mesmo')
dst = input('Apelido do destino: ')
mensagem = input('Mensagem: ')
#mandar a msg
menlen = len(mensagem)
mensagem = mensagem.encode()
nicklen = len(dst)
dst = dst.encode()
msg = struct.pack('!H', 15) + struct.pack('!H', myid) + struct.pack('!H', 65535) + \
struct.pack('!H', numseqprog) + struct.pack('!H', nicklen) + dst + \
struct.pack('!H', menlen) + mensagem
numseqprog +=1
sock.send(msg)
else:
print('Não é um comando válido')
print('Escolha uma opcao: ')
print('[1] Enviar uma mensagem\n' + \
'[2] Lista de clientes\n' + \
'[3] Sair')
break
elif cmd == '2': # pede a lista de clientes
print('entrou 2')
modo = input('Lista de ID[1], ou lista de apelidos[2]: ')
if modo == '1':
creq = struct.pack('!H', 6) + struct.pack('!H', myid) + struct.pack('!H', 65535) + \
struct.pack('!H', numseqprog)
numseqprog += 1
sock.send(creq)
# esperar pelo clist e mandar um ok
else: # lista de apelidos
creqap = struct.pack('!H', 16) + struct.pack('!H', myid) + struct.pack('!H', 65535) + \
struct.pack('!H', numseqprog)
numseqprog += 1
sock.send(creqap)
# esperar pelo clistap e mandar um ok
elif cmd == '3': # sai do sistema
print('entrou 3')
flw = struct.pack('!H', 4) + struct.pack('!H', myid) + struct.pack('!H', 65535) + \
struct.pack('!H', numseqprog)
# ver se o numero de sequencia tem que mudar aqui
sock.send(flw)
numseqprog = 0
# esperando OK
if __name__ == "__main__":
main()