gpt4 book ai didi

Python 消息传递器 LAN

转载 作者:行者123 更新时间:2023-11-30 23:28:10 27 4
gpt4 key购买 nike

尝试制作一个简单的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com