首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Messager LAN

Python Messager LAN
EN

Stack Overflow用户
提问于 2014-02-13 12:40:42
回答 1查看 255关注 0票数 1

试图制作一个简单的python消息传递程序,得到一个无法到达的关联错误。我正在努力使它成为peer2peer。如果有人也建议如何使它更好,我正在考虑添加一个循环,以要求用户的下一条消息,但不确定如何继续这样做。

Server.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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()               

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-13 13:00:48

简单的服务器(稍微修改了代码):

代码语言:javascript
复制
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)

这个服务器(也是基本的)将处理多个客户端。

下面是一个有效的客户端解决方案:

代码语言:javascript
复制
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消息,直到(如前所述)编写“退出”为止。这将断开和结束您的程序。

现在,所有这一切,是发送一条消息到服务器和它自动回复。考虑创建如下内容:

代码语言:javascript
复制
clients = {}
...
clients[self.addr[0]] = self.socket

甚至是

代码语言:javascript
复制
clients['Torxed'] = self.socket

使你能做以下事情:

代码语言:javascript
复制
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),这是服务器端属性。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21754547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档