【问题标题】:Encoded Communication编码通信
【发布时间】:2015-12-17 03:21:39
【问题描述】:

我正在尝试使用 Python 语言学习网络编程。为此,我用 python 创建了一个简单的聊天程序。现在我想加密服务器和客户端之间的通信。我怎样才能做到这一点?以下代码是我的服务器代码:

        TcpSocket.bind(("0.0.0.0",8000))
        TcpSocket.listen(2)
        print("I'm waiting for a connection...!")
        (client, (ip, port)) = TcpSocket.accept()
        print("Connection recived from the {}".format(ip))
        messageToClient = "You connected to the server sucessfuly.\n"
        client.send(messageToClient.encode('ascii'))

        dataRecived = "Message!"

        while True:
                dataRecived = client.recv(1024)
                print("Client :", dataRecived)
                print("Server :")
                dataSend = raw_input()
                client.send(str(dataSend) + "\n")


        print("Connection has been closed.")
        client.close()
        print("Server has been shutdowned.")
        TcpSocket.close()



def main():

        try:
                print("Server has started.")
                connectionOrianted()

        except :
                print("Maybe connection terminated.")
        finally:
                print("Session has closed.")



if __name__ == "__main__": main()

以下代码是我的客户端代码。

#!/usr/bin/python3

import socket
import sys
from builtins import input

def main():

    try:
        serverHostNumber = input("Please enter the ip address of the server: \n")
        serverPortNumber = input("Please enter the port of the server: \n")

        # create a socket object
        TcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
        # connection to hostname on the port.
        TcpSocket.connect((serverHostNumber, int(serverPortNumber)))                                                                    

        while True:
            data = TcpSocket.recv(1024)
            print("Server : ", data)
            sendData = input("Client : ")

            if sendData == "exit":
                    TcpSocket.close()
                    sys.exit()

            TcpSocket.send(sendData.encode(encoding='ascii', errors='strict'))

    except Exception as e:
        print("The error: ", e) 
        TcpSocket.close()
        sys.exit()      

if __name__ == "__main__" : main()

【问题讨论】:

  • “编码”是什么意思?加密?转换到/从特定字符编码,例如UTF8,iso-8859-1?还有什么?
  • 我的意思是加密。我想加密我的通信。

标签: python network-programming chat encode


【解决方案1】:

我假设您想使用网络加密 SSL(安全套接字层)的事实标准。

客户端很简单,基本上你用 SSL 套接字包装你的标准套接字,客户端是内置的,所以没有什么特别的安装或导入。

#!/usr/bin/python3

import socket
import sys
from builtins import input

def main():

    try:
        serverHostNumber = input("Please enter the ip address of the server: \n")
        serverPortNumber = input("Please enter the port of the server: \n")

        # create a socket object
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # connection to hostname on the port.
        sock.connect((serverHostNumber, int(serverPortNumber)))
        TcpSocket = socket.ssl(sock)



        while True:
            data = TcpSocket.recv(1024)
            print("Server : ", data)
            sendData = input("Client : ")

            if sendData == "exit":
                    TcpSocket.close()
                    sys.exit()

            TcpSocket.send(sendData.encode(encoding='ascii', errors='strict'))

    except Exception as e:
        print("The error: ", e) 
        sys.exit()      

if __name__ == "__main__" : main()

服务器端更难。

首先你需要安装pyopenssl

之后你需要生成一个私钥和一个证书(除非你已经有一个),这在 linux 上非常简单,只需从命令行运行:

openssl genrsa 1024 > key
openssl req -new -x509 -nodes -sha1 -days 365 -key key > cert

对于 Windows,您需要 use one of these methods

最后,一旦完成所有先决条件,SSl 就会为服务器端包装套接字,就像它为客户端所做的那样。

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(("0.0.0.0",8000))
        s.listen(2)
        print("I'm waiting for a connection...!")
        (client, (ip, port)) = s.accept()
        print("Connection recived from the {}".format(ip))
        messageToClient = "You connected to the server sucessfuly.\n"
        client.send(messageToClient.encode('ascii'))

        dataRecived = "Message!"

        while True:
                dataRecived = client.recv(1024)
                print("Client :", dataRecived)
                print("Server :")
                dataSend = raw_input()
                client.send(str(dataSend) + "\n")


        print("Connection has been closed.")
        client.close()
        print("Server has been shutdowned.")
        s.close()



def main():

        try:
                print("Server has started.")
                connectionOrianted()

        except :
                print("Maybe connection terminated.")
        finally:
                print("Session has closed.")

我还没有机会测试这些脚本,但它们应该可以工作。我希望这能回答你的问题。

【讨论】:

  • 我修复了服务器的问题,但是客户端代码显示如下错误:TcpSocket.close() UnboundLocalError: local variable 'TcpSocket' referenced before assignment
  • 嗯...如果连接失败,脚本似乎正在尝试关闭连接,但在它发生之前没有定义变量。如果您在变量起作用之前定义了变量,或者您可以像我在代码中所做的那样删除 TcpSocket.close()。
猜你喜欢
  • 1970-01-01
  • 2016-09-23
  • 1970-01-01
  • 2021-12-18
  • 2020-05-25
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多