Хорошо, извините за такой быстрый ответ на мой вопрос, но обратные вызовы являются ВОЛШЕБНЫМИ при использовании многопоточности (по крайней мере, в модели Linux).
Во всяком случае, сделал это:
import socket
import threading
def msg_loop(socket):
msg = ""
if (server == True):
reader = socket_read(channel)
else:
reader = socket_read(sock)
reader.start()
while msg != 'quit':
msg = uname + " said : " + input("Message: ")
print ""
try:
if (server == True):
channel.send('null')
channel.send(msg)
else:
sock.send('null')
sock.send(msg)
except:
break
def data_recieved(data, socket):
print "Hold on...\n\n" + data + "\n"
msg_loop(socket)
class socket_read(threading.Thread):
sock = object
def __init__(self, sock):
threading.Thread.__init__(self)
self.sock = sock
def run(self):
while True:
data = self.sock.recv(1000)
if (data == "\quitting\\" or data == ''):
return
data_recieved(self.sock.recv(1000), self.sock)
####################################################################################
server = False
uname = str(input("What's your username: "))
print "Now for the technical stuff..."
port = input("What port do I connect to ['any' if first]: ")
if (port == "any"):
server = True
port = 9999
err = True
while err == True:
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('', port))
err = False
except:
print "Socket #" + str(port) + " failed"
err = True
sock.close()
port -= 1
print "Bound to port #" + str(port)
print "Waiting for client..."
sock.listen(1)
(channel, info) = sock.accept()
else:
host = input("What's the IP of the other client: ")
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, int(port)))
if (server == True):
msg_loop(channel)
else:
msg_loop(sock)
reader.join()
channel.send("\quitting\\")
sock.close()
Как видите, я добавил цикл сообщений в качестве обратного вызова.
Также обратите внимание, я отправляю нулевое значение, чтобы обойти проблему "любой другой".
То есть, и я использую символ новой строки в конце печати в data_recieve, чтобы отключить символ новой строки.
(Если вам нравится код, он не так хорошо работает в Windows. Это потому, что, по-видимому, модель потоков Python там не выполняется так же неосторожно. Попробуйте его на своем локальном Linux-компьютере)