python基础_网络编程_socket
一、什么是socket
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
简单来说就是,socket 就像是一个门,从数据从本地传输至网络,或者从网络传输至本地,均需要通过这个门

二、使用python 实现一个socket 客户端和服务端的例子
服务端代码:
import socket # 创建一个服务端对象 server = socket.socket() # 绑定服务端ip以及端口 server.bind(('192.168.0.105',8002)) # 设置服务端最大连接数 server.listen(5) while True: # 等待客户端连接,连接成功则返回客户端的套接字对象conn,和客户端地址信息 addr ,数据通过客户端的套接字对象进行传输 con,addr = server.accept() print('与客户端{}建立了连接通道'.format(addr[0])) while True: # 通过连接通道获取通信数据 (设置了 数据传输的最大长度:1024字节) data = con.recv(1024).decode('utf-8') #收到的消息 if data == 'exit': print('客户端{}关闭了当前连接通道'.format(addr[0])) break else: # 打印 获取到的数据 print(data) # 服务端通过客户端的的套接字对象向客户端发送 数据 con.send(('服务端收到消息{}'.format(data)).encode('utf-8')) con.close()
客户端代码:
import socket # 创建一个客户端的sock 对象 client = socket.socket() # 连接服务端 client.connect(('192.168.0.105',8002)) while True: req = input('输入要传给服务端的数据:') # 客户端通过客户端的套接字对象调用send方法 向服务端发送数据 client.send(req.encode('utf-8')) if req == 'exit': break else: # 客户端通过客户端的套接字对象调用recv方法接收服务端数据 res = client.recv(1024).decode('utf-8') print(res) client.close()
流程:

注意点:
1、通信方式:
客户端和服务端连接成功后,其数据通信均是通过客户端套接字对象完成
2、流程中的阻塞状态有:
'''服务端阻塞状态''' server.accept() #服务端等待连接,连接成功才能继续执行 server.recv() #服务端等待接收消息,接收成功才能继续执行 '''客户端阻塞状态''' client.connect #客户端等待连接成功,连接成功才能继续往下执行 client.recv() #客户端等待接受数据,数据接收到了才能继续往下执行
三、服务端通过多线程方式,实现一个服务端同时对接多个客户端
server 代码:
''' 通过多线程的方式 实现 一个服务端 同时对接 多个 客户端 ''' import socket,threading def thread_server(conn,addr): while True: # 通过连接通道获取通信数据 (设置了 数据传输的最大长度:1024字节) data = conn.recv(1024).decode('utf-8') # 收到的消息 if data == 'exit': print('客户端{}关闭了当前连接通道'.format(addr[0])) break else: # 打印 获取到的数据 print(data) # 服务端通过连接通道向客户端发送 数据 conn.send(('服务端收到消息{}'.format(data)).encode('utf-8')) conn.close() # 创建一个服务端对象 server = socket.socket() # 绑定服务端ip以及端口 server.bind(('192.168.0.105',8005)) # 设置服务端最大连接数 server.listen(5) while True: conn,addr = server.accept() t1 = threading.Thread(target=thread_server,args=(conn,addr)) t1.start()
client 代码:
import socket # 创建一个客户端的 对象 client = socket.socket() # 客户端对象向服务端 发起连接 client.connect(('192.168.0.105',8005)) while True: req = input('输入要传给服务端的数据:') # 客户端直接调用send方法 向服务端发送数据 client.send(req.encode('utf-8')) if req == 'exit': break else: # 客户端通直接接收服务端的通信数据 res = client.recv(1024).decode('utf-8') print(res) client.close()

浙公网安备 33010602011771号