gpt4 book ai didi

Python SSL 套接字 : receiving and sending from both server and client

转载 作者:太空宇宙 更新时间:2023-11-03 15:21:45 26 4
gpt4 key购买 nike

好的,所以我正在尝试通过 SSL 套接字连接在服务器和客户端之间来回通信。我认为最好的方法是在每个线程中实现 2 个线程,每个线程分别充当服务器和客户端。但是当我实现此代码时(显然在其他服务器/客户端中使用相反的相应端口) :

#secserv.py

import socket
from OpenSSL import SSL
import threading
import time

class SecureIn(threading.Thread):
context = SSL.Context(SSL.SSLv23_METHOD)
context.use_privatekey_file('key')
context.use_certificate_file('cert')

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s = SSL.Connection(context, s)
s.bind(('', 5570))
def run(self):
while True:
self.s.listen(5)
(connection, address) = self.s.accept()
print repr(connection.recv(5570))


class SecureOut(threading.Thread):
time.sleep(6)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 12345))
sslSocket = socket.ssl(s)
print repr(sslSocket.server())
print repr(sslSocket.issuer())
def run(self):
sslSocket.write('Hello secure socket\n')

s.close()


si = SecureIn()
si.start()
time.sleep(6)
so = SecureOut()
so.start()

我收到这个错误:

Traceback (most recent call last):
File "secserv.py", line 25, in <module>
class SecureOut(threading.Thread):
File "secserv.py", line 28, in SecureOut
s.connect(('localhost', 12345))
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 111] Connection refused

或者,我尝试让独立服务器向所有客户端发送广播消息。我到处搜索,但似乎找不到使用 SSL 套接字的有效方法,只能找到常规套接字。当我尝试 s.write()s.sendall() 时出现此错误:

Traceback (most recent call last):
File "secserv.py", line 19, in <module>
s.write('hello client\n')
OpenSSL.SSL.Error: [('SSL routines', 'SSL_write', 'uninitialized')]

来自这段代码:

import socket
from OpenSSL import SSL
context = SSL.Context(SSL.SSLv23_METHOD)
context.use_privatekey_file('key')
context.use_certificate_file('cert')
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s = SSL.Connection(context, s)
s.bind(('', 12345))
while True:
s.listen(5)
(connection, address) = s.accept()
print repr(connection.recv(12345))
#This could also be s.sendall()
s.write('hello client\n')

请帮助我 StackOverFlow,你是我唯一的希望。我知道这应该很容易,但此时我的大脑非常紧张,我无法再思考了。

此外,我对 python 还很陌生,所以很有可能它的操作/加载类/等等的方式有些我不明白的地方。

编辑:好的,我知道这段代码不好。它不是要上市的产品,它永远不会实时运行,这只是我试图让一个概念起作用,这个概念是:让服务器和客户端通过 python ssl 连接相互发送消息。

我知道这是糟糕的代码,但我只需要知道如何让服务器发回消息,因为每当我尝试它时,我都会在最后遇到错误。

最佳答案

您的设计似乎在很多层面都被误导了。

首先,您不需要两个套接字来双向发送数据;套接字是双向的。

而且您可能不希望建立从服务器到客户端的连接——这在本地主机测试中可能有效,但一旦部署到互联网,大多数客户端就会落后NAT 路由器,并且不会有您可以连接到的公共(public)地址。

同时,你的逻辑很奇怪。你在一个方向开始连接,然后休眠 6 秒,然后在另一个方向开始连接。为什么要这样做?

如果服务器调用它的 SecureOut 之前,或者甚至在客户端调用它的 SecureIn 的同时调用它,它会在有人监听之前尝试连接,这将得到您所看到的错误。

此外,每个线程都有一个非常奇怪的运行循环:

def run(self):
while True:
self.s.listen(5)
(connection, address) = self.s.accept()
print repr(connection.recv(5570))

这一次只接受一个连接,从中读取一次,然后泄漏连接,不再与其通信,然后去获取下一个客户端。 (我也不确定在已经监听的套接字上再次调用 listen(5) 是否真的有效,或者它做了什么。)当然,它永远无法完成。 (这不完全正确——如果,例如,客户端连接然后在你调用 recv 之前离开,你可能会得到一个你没有捕捉到的异常,所以你的程序将退出…) 这就是你想要的吗?

另外,为什么 recv(5570)?该数字是要读取的最大字节数,而不是端口号。

为什么要打印字符串的 repr

与此同时,您是否意识到 recv,无论您为缓冲区长度传递什么,都不能保证获得完整的消息(或者只获得一条消息而不是两条消息,如果您有曾经发送过不止一个的客户)?它几乎肯定会在 localhost 上工作,并且对于这么小的消息,它可能会在 大部分 时间在互联网上工作,但不是所有时间。 p>

您似乎也对类变量和实例变量之间的区别感到困惑,因为您在 SecureInSecureOut 中都设置了一堆类变量。这意味着如果您可以拥有该类的两个实例,它们将共享相同的 SSL.Context 等。即使您在现实生活中不需要同时拥有两个实例,因为测试你几乎肯定会想要创建一个新实例,并且你会希望它创建一个新套接字等,而不是继续使用旧的。所以不是这个:

class SecureIn(threading.Thread):
context = SSL.Context(SSL.SSLv23_METHOD)
context.use_privatekey_file('key')
context.use_certificate_file('cert')

这样做:

class SecureIn(threading.Thread):
def __init__(self):
self.context = SSL.Context(SSL.SSLv23_METHOD)
self.context.use_privatekey_file('key')
self.context.use_certificate_file('cert')

(当然,您也可以将它放在 run 方法中。)

基本上,无论有无 SSL,这都不可能做任何有用的事情。我建议您退后一步,复习一些教程,编写一些适用于普通旧式 TCP 套接字的东西,然后再考虑如何对其进行 SSL 化处理。

关于Python SSL 套接字 : receiving and sending from both server and client,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13811173/

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