python实现socket多客户端连接

文章介绍了如何使用Python的socket库和多线程技术实现一个服务器,该服务器能同时接受多个客户端的连接。服务器端通过创建多个监听线程来处理来自不同客户端的请求,而客户端则发送字符串数据到服务器。此外,文章还提及了网络连接的原理,以及对于服务器主动返回数据的可能性,并讨论了利用socket进行抓包,暗示了Python可以实现类似mitmproxy的抓包功能。
摘要由CSDN通过智能技术生成

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

套接字协议

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值