Python 消息传递器 LAN

标签 python networking lan

尝试制作一个简单的 python 消息发送器,但出现了连接无法访问的错误。我正在努力使其成为点对点。任何人都可以建议如何让它变得更好,我正在考虑添加某种循环来询问用户下一条消息,但不知道如何去做。

服务器.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()                

客户端.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()               

谢谢。

最佳答案

简单的服务器(稍微修改一下你的代码):

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 它应该中断,但那里的错误处理需要更多工作,并且您很可能最终得到“套接字已在使用中” “因为清洁部门不够完善。 但你明白了,你就必须学会自己做一些工作:)

客户, 只要您不写“退出”,它就会首先以尽可能干净的方式连接到服务器,并且将永远向服务器发送+接收消息,直到(如上所述)您写“退出” 。这将断开连接并结束您的程序。

现在,这一切就是向服务器发送一条消息,然后服务器会自动回复。 考虑创建诸如以下内容:

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'))

因此,当客户写下“Torxed:嘿,伙计,怎么了?”它将被重定向到该客户端套接字。这只是一个完全简单明了的想法,向您展示您应该或至少可以做什么。

可能令人困惑的事情

我注意到你写了很多 s = ...c = ...
你在客户端中发生了一些双插槽的事情......? 按事物的本来面目通常是很好的做法..例如, 在服务器中,您可以调用套接字server,但永远不能调用s。 或者,您只需保持其干净简单,并在两端将其称为 socket ,除非在某些情况下,您可能出于任何原因(桥接服务器等)创建多个服务器实例套接字。

请记住,解决方案越简单、越短......您就越有可能记住为什么以及如何解决它。不要过度寻求解决方案。

例如,您的服务器的代码行数与我的解决方案的代码行数大致相同(我知道我的解决方案并不完美),但我设法挤入线程,如果我/您也想要一个“ friend 列表”。 。 充分利用循环、函数和其他东西。它们会拯救你的生命:)

另请注意

如果您打算使用socket作为客户端,则不需要需要执行s.bind(())s.listen(5),这是服务器端属性。

关于Python 消息传递器 LAN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21754547/

相关文章:

go - ssh session 打开请求最终在ssh连接上提供EOF

python - Pygame 的 colliderect 没有注意到碰撞

python - MySQL 连接器 Python 变量未注册

Java 机器因 MySQL 结果太大而崩溃。

ios - 如何在 iOS 和 Mac OS X 上查找接口(interface)的硬件类型?

servlets - 在基于 servlet 的 Web 应用程序中获取 LAN 客户端计算机名称

python - 通过另一个 DataFrame 的索引选择某些行

python - 停止在 Python 中读取进程输出而不挂起?

java - 如何分析 LAN 上运行的 Java 应用程序?

java - 从客户端传输到服务器时字符串被截断 - Java