Python安全攻防:渗透测试实战指南
上QQ阅读APP看书,第一时间看更新

2.8 Socket网络编程

Socket是计算机之间进行网络通信的一套程序接口,相当于在发送端和接收端之间建立了一个通信管道。在实际应用中,一些远程管理软件和网络安全软件大多依赖于Socket来实现特定功能,由于TCP(Transmission Control Protocol,传输控制协议)方式在网络编程中应用得非常频繁,此处将对TCP编程进行讲解并给出具体应用实例。

编写TCP时一般会用到的Socket模块,其方法主要包括:

·connect(address):连接远程计算机。

·send(bytes[,flags]):发送数据。

·recv(bufsize[,flags]):接收数据。

·bind(address):绑定地址。

·listen(backlog):开始监听,等待客户端连接。

·accept():响应客户端的一个请求,接受一个连接。

使用TCP进行通信,首先需要在客户端和服务端建立连接,并且要在通信结束后关闭连接以释放资源。由于TCP是面向连接的,因此相对于UDP提供更高的可靠性。下面通过示例展示如何通过TCP进行通信。

例如,设计一个对话系统“小艾”。该应用分为两部分,一部分为服务端,一部分为客户端。客户端发送请求信息,服务端返回应答信息。两部分的代码如下所示。

(1)服务端代码

代码如下:


# coding=UTF-8
import socket
language = {'what is your name':'I am Tom','how old are you':'25','bye':'bye!'}
HOST = "127.0.0.1"
PORT = 6666
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((HOST,PORT))
s.listen(1)
print("Listing at port 6666")
conn,addr = s.accept()
print('Connect by: ',addr)
while True:
    data = conn.recv(1024)
    data = data.decode()
    if not data:
        break
    print('Received message:',data)
    conn.sendall(language.get(data,'Nothing').encode())
conn.close()
s.close()

(2)客户端代码

代码如下:


# coding=UTF-8
import socket,sys
HOST = "127.0.0.1"
PORT = 6666
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
    s.connect((HOST,PORT))
except Exception as e:
    print('server not found!')
    sys.exit()
while True:
    c = input('YOU SAY:')
    s.sendall(c.encode())
    data = s.recv(1024)
    data = data.decode()
    print('Received:',data)
    if c.lower()=='再见':
        break

将以上的代码分别保存为server.py和client.py文件,在cmd窗口运行服务端程序,服务端开始进行监听;启动一个新的cmd窗口并运行客户端程序,服务端程序提示连接已建立;在客户端输入要发送的信息后,服务端会根据提前建立的字典进行自动回复。对话效果如图2-6所示。

图2-6 对话效果