Я пытаюсь создать небольшую программу чата, которые подключаются два (или больше) компьютеров, поэтому я попытался это:Thread, Сеть и Python
import socket
tcpSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
tcpSocket.bind(("0.0.0.0",8000))
tcpSocket.listen(3)
print "Waiting for a Client ... "
(client, (ip,sock)) = tcpSocket.accept()
print "Received connection from : ",ip
print "Starting ECHO output ..."
data = 'dump'
client.send("Enter you're name : ")
name=client.recv(1024)
name=name.strip()
while len(data) :
send_data = raw_input("Me : ")
try :
client.send("Server : "+send_data)
client.send("\n"+name+" : ")
except :
print "Connection lost !"
break
data = client.recv(2048)
data = data.strip()
print name+" : "+data
print "Closing connection ..."
client.close()
print "Shutting down server ..."
tcpSocket.close()
И она работала хорошо, единственная проблема в том, что я не может подключить к серверу более одного компьютера! Я попытался с помощью модуля нити с помощью этого fonction:
import socket
import thread
def thread_send() :
print "Received connection from : ",ip
print "Starting ECHO output ..."
data = 'dump'
client.send("Enter you're name : ")
name=client.recv(1024)
name=name.strip()
while len(data) :
send_data = raw_input("Me : ")
try :
client.send("Server : "+send_data)
client.send("\n"+name+" : ")
except :
print "Connection lost !"
break
data = client.recv(2048)
data = data.strip()
print name+" : "+data
tcpSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
tcpSocket.bind(("0.0.0.0",8000))
tcpSocket.listen(5)
print "Waiting for a Client ... "
(client, (ip,sock)) = tcpSocket.accept()
for i in range(5) :
thread.start_new_thread(thread_send,())
while True :
pass
print "Closing connection ..."
client.close()
print "Shutting down server ..."
tcpSocket.close()
Но это не работает:/
Где ваша программа водителя, которая вызывает эту функцию? В принципе, вы вызываете «принимать» в основном потоке и передаете новое соединение/сокет в новый поток. – Arunmu
Хорошо спасибо, поэтому я попытался вызвать «принять» вне функции, но теперь клиент подключается к пяти потокам, но я хочу, чтобы 5 клиентов подключились к одному серверу:/(я редактировал сообщение, чтобы показать весь код!) –
Нет, это не работает. 1) Запустите цикл accept in while (для нескольких клиентов). # 2) Каждый раз, когда вы принимаете возврат, начинаете новый поток и передаете ему новый сокет (клиент) и другие необходимые данные (ip и носок). # 3) Как закончить нить, обслуживающую соединение, зависит от вашего пути. – Arunmu