好吧,所以我試圖通過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