好吧,所以我试图通过SSL套接字连接在服务器和客户端之间来回通信。我认为最好的方法是实现两个线程,每个线程分别充当服务器和客户端。但是当我实现这个代码时(显然使用其他服务器/客户端中相对应的端口) :Python SSL套接字:从服务器和客户端接收和发送
#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')
请帮我计算器,你是我唯一的希望。我知道这应该很容易,但是我的大脑在这一点上很紧张,我再也想不到了。
另外,我对Python非常陌生,所以很有可能它有一些操作方式/加载类/ etc,我只是不明白。
编辑:好的,我知道这段代码是坏的。它不是一个将要上市的产品,它永远不会实时运行,这只是我试图让一个概念工作,而这个概念是:让服务器和客户端通过python ssl连接互相发送消息。
我知道这是可怕的代码,但我只需要知道如何让服务器发回消息,因为每当我尝试它时,我都会在最后得到错误。
为什么你需要两个插座?套接字是双向的;您不需要从服务器向客户端单独建立连接以发送数据。 (你可能不想这样做,因为互联网上的许多客户端都是NAT后面的,无法以这种方式直接联系到。)你的设计中是否有某些东西使得你没有解释这一点? – abarnert
原来那里有一些客户我想单独与服务器通话,但是现在我意识到我不需要这样做。 然后我试图让服务器发回数据,但就像它说的,我无法找到用套接字来实现这一点的SSL方式,它一直给我一个错误。 – user1585054
与此同时,您收到的错误是告诉您没有人在12345端口上收听。您确定客户端实际上是在尝试聆听吗?看看你的代码,如果双方都在做“一切都是单向的,然后睡6秒,然后以其他方式完成所有事情”,服务器在客户端开始收听之前尝试连接是完全合理的。 – abarnert