【发布时间】:2012-12-10 23:36:23
【问题描述】:
好的,所以我正在尝试通过 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 连接相互发送消息。
我知道这是很糟糕的代码,但我只需要知道如何让服务器发回消息,因为每当我尝试它时,最后都会收到错误。
【问题讨论】:
-
为什么需要两个socket?套接字是双向的;您无需单独从服务器连接回客户端以发送数据。 (而且您可能不希望这样做,因为 Internet 上的许多客户端都位于 NAT 之后,并且无法通过这种方式直接访问。)您的设计中是否有某些东西使您没有解释这一点?跨度>
-
原来有一些我想专门与(从服务器)交谈的客户,但我现在意识到我不需要那个。然后我试图让服务器发回数据,但是就像它说的那样,我找不到使用套接字的 SSL 方法,它一直给我一个错误。
-
同时,您得到的错误是告诉您没有人在监听端口 12345。您确定客户端此时实际上正在尝试监听吗?查看您的代码,如果双方都在做“以一种方式做所有事情,然后休眠 6 秒,然后以另一种方式做所有事情”,那么服务器会在客户端开始侦听之前尝试连接是完全合理的......
-
好吧,我假设它自己的线程中的
while True:会在另一个线程运行时继续运行。那个和这个同时运行的另一个版本的事实是相反的,可以说,在端口 12345 上设置服务器并等待连接,然后尝试在 5570 上发送。