socket实现同网络下不同机器之间互联,常规写法,直接创建后只能有一个客户端连接到服务端,无法实现多客户端连接。在这里使用多线程的方法创建多个监听来实现多客户端连接同一个服务端。
server端代码:
import socket
import sys
import threading
from concurrent.futures import thread
ip = socket.gethostbyname(socket.gethostname())
port = 9876
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.bind((ip,port))
server_socket.listen(10)
def get_conn():
recv_socket,addr = server_socket.accept()
while True:
recv_str = recv_socket.recv(1024).decode()
if recv_str == "" or recv_str == 'exit':
# server_socket.close()
sys.exit(0)
else:
print(recv_str)
if __name__ == '__main__':
threads = thread.ThreadPoolExecutor(max_workers=10)
for i in range(10):
threads.submit(get_conn)
client客户端代码如下:
import socket
import sys
ip = socket.gethostbyname(socket.gethostname())
port = 9876
client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client_socket.connect((ip,port))
while True:
input_str = input('>>').encode()
if input_str == 'exit' or input_str == "":
# client_socket.close()
sys.exit(0)
else:
client_socket.sendall(input_str)
代码量其实并不多,只是简单实现了输入的字符串传递,而且服务端是只能接收数据,并且被动返回数据,无法主动返回数据。这个涉及到网络连接,还需要再深入了解原理做处理。目前使用这个可以实现远程操作其他的机器,我们这边可以把输入的字符串转换为可执行的命令即可。需要思考的一个问题是服务器可以被动返回数据,那么就证明网络一定是通的,那么主动返回数据应该也是可以做到的,也就是从理论上来讲,一定是可行的。
还有需要解决的一个问题是利用socket进行抓包,目前mitmproxy已经实现了抓包,那就是说python一定是可以实现了,还需要去了解对应的原理。自己实现抓包工具,这样在后续的工作中,灵活性就更强了,不需要一直去调用外部包来实现一些新的功能,而是可以自己实现。
名 称 | 描 述 |
服务端 | 服务器套接字方法 |
s.bind(ADDR) | 将地址(主机名、端口号对)绑定到套接字上 |
s.listen([backlog]) | 设置并启动 TCP 监听器,如果指定backlog,则必须至少为0(如果低于0,则设置为0); |
s.accept() | 被动接受 TCP 客户端连接,一直等待直到连接到达(阻塞) |
客户端 | 客户端套接字方法 |
s.connect() | 主动发起 TCP 服务器连接 |
s.connect_ex() | connect()的扩展版本,此时会以错误码的形式返回问题,而不是抛出一个异常 |
普通通用 | 普通的套接字方法 |
s.recv() | 接收 TCP 消息 |
s.recv_into() | 接收 TCP 消息到指定的缓冲区 |
s.send() | 发送 TCP 消息 |
s.sendall() | 完整地发送 TCP 消息 |
s.recvfrom() | 接收 UDP 消息 |
s.recvfrom_into() | 接收 UDP 消息到指定的缓冲区 |
s.sendto() | 发送 UDP 消息 |
s.getpeername() | 连接到套接字(TCP)的远程地址 |
s.getsockname() | 当前套接字的地址 |
s.getsockopt() | 返回给定套接字选项的值 |
s.setsockopt() | 设置给定套接字选项的值 |
s.shutdown() | 关闭连接 |
s.close() | 关闭套接字 |
s.detach() | 在未关闭文件描述符的情况下关闭套接字,返回文件描述符 |
s.ioctl() | 控制套接字的模式(仅支持 Windows) |
阻塞 | 面向阻塞的套接字方法 |
s.setblocking() | 设置套接字的阻塞或非阻塞模式 |
s.settimeout() | 设置阻塞套接字操作的超时时间 |
s.gettimeout() | 获取阻塞套接字操作的超时时间 |
文件方法 | 面向文件的套接字方法 |
s.fileno() | 套接字的文件描述符 |
s.makefile() | 创建与套接字关联的文件对象 |
属性 | 数据属性 |
s.family | 套接字家族 |
s.type | 套接字类型 |
s.proto | 套接字协议 |