Ладно, фиг с ним , вот код, если поможет буду рад.
Сервер:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket,thread
HOST = ""
PORT1 = 1111
a=0
users = []
susers =[]
conect= socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conect.bind((HOST, PORT1))
myIP1= conect.getsockname()
def OUTme():
global users,l
while 1:
inp = raw_input("")
if inp == "print l":
print l
elif inp == "print users":
for x in users:
print x[0].encode('UTF-8')
elif inp == "send":
sms = raw_input("sms:")
sms = "From ADMIN: " + sms
for x in users:
x[1].send(sms)
else:
pass
def lsttostr(lst):
str = ""
for x in lst:
str = str + x[0] + ","
return str
def get_user(a):
global l,users
l = len(users)
l = str(l)
print "на сервере ",l," пользователей"
print"Прослушиваю порт"
conect.listen(1)
sub,ip = conect.accept()
print "какоето шевеление"
name = sub.recv(1024)
print name,ip , "Присоеденился к серверу"
sub.send(l)
print l
if l =="0":
users.append([name,sub,ip])
susers.append([name,sub,ip])
else:
strusers = lsttostr(users)
sub.send(strusers)
ans = sub.recv(1024)
if ans =="1":
user2 = sub.recv(1024)
print "Принято"
user2 = int(user2)
users[user2][1].send("Кто-то к вам присоеденился")
print "отправлено 1"
sub.send("Вы присоеденились")
print "отправлено 2 "
thread.start_new(SMS,(sub,users[user2][1]))
thread.start_new(SMS,(users[user2][1],sub))
users[user2-1:user2+1]=[]
susers.append([name,sub,ip])
print "2 пользователя соеденено"
else:
users.append([name,sub,ip])
susers.append([name,sub,ip])
get_user(a)
def SMS(user1,user2):
while 1:
sms = user1.recv(1024)
if sms:
user2.send(sms)
thread.start_new(get_user,(a,))
thread.start_new(get_user,(a,))
thread.start_new(get_user,(a,))
OUTme()
conect.close()
Есть ещё несколько багов. Но в целом программа работает, с неограниченым количеством клиентов. И позволяет клиентам выбирать с кем они хотят общятся.
А вот и клиент.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket,thread
a=0
HOST = "vsrmischat.homeunix.com"
PORT=1111
conect = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conect.connect((HOST,PORT))
print "connect to ", PORT
myIP= conect.getsockname()
name = raw_input("What is your nsme? ")
conect.send(name)
l = conect.recv(1024)
print l
l=int(l)
def strtolist(string):
lst = []
i=0
k=0
n=0
while k!= len(string):
if string[k] == ",":
lst.append(str(i) + " " + string[n:k])
n=k+1
i = i+1
if k ==len(string)-1:
lst.append(str(i) + " " + string[n:k+1])
k = k+1
return lst
def IN(a):
while 1 :
sms = conect.recv(1024)
if sms:
print sms
def OUT(a):
while 1:
sms = raw_input("")
conect.send(sms)
def ch():
u = raw_input("Input number of user You want to speek")
try: u = int(u)
except ValueError:
print"Try again"
u = ch()
if u in xrange(0,l):
pass
else:
print"Try again"
u = ch()
u = str(u)
return u
def Ans():
ans = raw_input("If you want to choose user to speak press 1, if you want to wait wile sobe body chose youpress2")
if ans =="1" or ans == "2":
pass
else:
print"Try again"
ans = Ans()
ans = str(ans)
return ans
if l==0:
print"You is only one user, whait some body"
sms = conect.recv(1024)
if sms:
print sms
print" _-_-_-_-_-_--___--__--__"
else:
print"Sorry, maybe server is DOWN"
exit()
else:
print "there are users, a waiting you to chat them"
us = conect.recv(1024)
lstus = strtolist(us)
for x in lstus:
print x
ans = Ans()
conect.send(ans)
if ans =="1":
u = ch()
conect.send(u)
sms = conect.recv(1024)
if sms:
print sms
print" _-_-_-_-_-_--___--__--__"
else:
print "Sorry, maybe server is DOWN"
exit()
else:
print"SO... Wait..."
sms = conect.recv(1024)
if sms:
print sms
print" _-_-_-_-_-_--___--__--__"
else:
print"Sorry, maybe server is DOWN"
exit()
thread.start_new(IN,(a,))
OUT(a)
conect.close()
Хмммм. вот писал только что и в голову мысль пришла. Сейчас будет ещё многа букв. Так сказать дополню ещё своим вопросом.
Я столкнулся с проблемой налаживания связи меж клиентом и сервером, ведь именно тогда когда клиент передаёт СООБЩЕНИЕ сервер тоже должени принимать именно СООБЩЕНИЕ, а не например ИМЯ или ещё чего нибудь, я криво -косо справился с этой проблемой, но больно некрасиво както. И вот подумал. А что если клиент будет перед посылкой данных отсылать “ключь ” что это за данные, а сервер будет сначала принимать ключ и уже зависимости от него делать с данными то что надо. Я конечно врятли открыл америку, но мне кажедтся если наладить такого рода связь , то она будет понадёжнее чем то что я (см мой код) понаписывал.