试图制作一个简单的python消息传递程序,得到一个无法到达的关联错误。我正在努力使它成为peer2peer。如果有人也建议如何使它更好,我正在考虑添加一个循环,以要求用户的下一条消息,但不确定如何继续这样做。
Server.py
import socket
s = socket.socket()
host = socket.gethostbyname(socket.gethostname())
port = 1337
s.bind((host, port))
s.listen(5)
while True:
c, addr = s.accept()
print ("Got connection from", addr)
c.send("Thank you for connecting to {0}".format(host).encode())
msg1 = input("Enter Message: ")
c.send(msg1.encode())
msg2 = input("Enter Message: ")
c.send(msg1.encode())
msg3 = input("Enter Message: ")
c.send(msg1.encode())
msg4 = input("Enter Message: ")
c.send(msg1.encode())
c.close() Client.py
import socket
s = socket.socket()
host = ""
port = 1337
s.bind((host, port))
print("""
================================================================================
Welcome to Coder77's local internet message for avoiding surveillance by the NSA
================================================================================
The current soon to be encrypted server is {0}
""".format(host))
host = input("Please select the IP you would like to communicate to: ")
print("Now connecting to {0}....".format(host))
try:
s.connect((host, port))
s.listen(5)
while True:
c, addr = s.accept()
msg1 = input("Enter Message: ")
c.send(msg1.encode())
msg2 = input("Enter Message: ")
c.send(msg1.encode())
msg3 = input("Enter Message: ")
c.send(msg1.encode())
msg4 = input("Enter Message: ")
c.send(msg1.encode())
except socket.error:
print ("Host is unreachable")
input("Enter to lose")
s.close() 谢谢。
发布于 2014-02-13 13:00:48
简单的服务器(稍微修改了代码):
from threading import *
import socket
s = socket.socket()
host = socket.gethostbyname(socket.gethostname())
port = 1337
s.bind((host, port))
s.listen(5)
def getMainThread():
for thread in enumerate(): # Imported from threading
if thread.name == 'MainThread':
return thread
return None
class client(Thread):
def __init__(self, socket, address):
Thread.__init__(self)
self.socket = socket
self.address = address
self.start() # Initated the thread, this calls run()
def run(self):
main = getMainThread()
while main and main.isAlive():
message = self.socket.recv(8192).decode('utf-8')
self.socket.send(b"Got your message.. send another one!")
self.socket.close()
while True:
c, addr = s.accept()
client(c, addr)这个服务器(也是基本的)将处理多个客户端。
下面是一个有效的客户端解决方案:
import socket
print("""
================================================================================
Welcome to Coder77's local internet message for avoiding surveillance by the NSA
================================================================================
The current soon to be encrypted server is {0}
""".format(host))
host = input("Please select the IP you would like to communicate to: ")
print("Now connecting to {0}....".format(host))
sock = socket.socket()
try:
sock.connect((host, 1337))
while True:
message = input("Enter Message: ")
if message == 'quit':
break
sock.send(bytes(message, 'UTF-8'))
recieved = sock.recv(8192).decode('utf-8')
print('Server responded with:', recieved)
except socket.error:
print ("Host is unreachable")
sock.close()关于服务器的短消息。服务器的目的是处理多个客户端,这需要一些基本的线程。每个连接、接受并抛入线程的客户端(当您调用client()时,它将激发它自己的线程,应用程序的其余部分将沿着该客户端线程继续运行)。
当主线程死掉时,所有客户端线程都应该死掉,例如,如果您抛出一个CTRL+C,它应该会中断,但是那里的错误处理需要更多的工作,而且由于清理部门缺乏完善,您很可能最终会得到一个“已在使用的套接字”。但是你有了这个想法,你必须学会自己做一些工作:)
客户端,只要您不写“退出”,它将首先以尽可能干净的方式连接到服务器,并将永远从服务器发送SEND+Recieve消息,直到(如前所述)编写“退出”为止。这将断开和结束您的程序。
现在,所有这一切,是发送一条消息到服务器和它自动回复。考虑创建如下内容:
clients = {}
...
clients[self.addr[0]] = self.socket甚至是
clients['Torxed'] = self.socket使你能做以下事情:
message = self.socket.recv(8192).decode('utf-8')
toWho = message.split(': ', 1)[0]
if toWho in clients:
clients[toWho].send(bytes(message, 'UTF-8'))所以当客户写“托勒克斯:嘿,伙计?”它将被重定向到那个客户端套接字。这只是一个简单明了的想法,让你知道你应该或者至少能做些什么。
可能会让人困惑的事情
我注意到你写了很多s = ...和c = ...。
你在客户身上发生了什么事.?把事情说出来通常是很好的做法。例如,在服务器中,您可以调用套接字server,但不可以调用s。或者,您只需保持它的整洁和简单,并在两端将其命名为socket,除非在某些情况下,您可能出于任何原因创建多个服务器实例套接字(桥接服务器和非桥接服务器)。
记住,解决办法越简单越短。更有可能的是,你会记得为什么和如何解决它。不要在解决方案上过份。
例如,您的服务器的代码行数与我的解决方案大致相同(我知道我的解决方案并不完美),但是我设法挤进了线程,如果我/您也有一个“朋友列表”。好好利用循环、函数和其他东西。他们会救你的命
也请注意
如果您打算使用socket作为客户端,则不需要执行s.bind(())或s.listen(5),这是服务器端属性。
https://stackoverflow.com/questions/21754547
复制相似问题