1.socket编程需要两个部分 服务器与客户端我们的python中调用 socket包就不需要自己写协议了(socket编程中windows 与Linux中的效果是完全不相同了,次代码最好是放在Linux上运行)
# _*_coding:utf-8_*_ # /usr/bin/env python3 # Author:book Miki # 服务器 import socket server = socket.socket() # 声明socket类型,同时生成socket连接对象 server.bind(('localhost', 6969)) # 绑定要监听的端口此时绑定的是本地 server.listen() # 监听 括号里面的就是最大允许链接 print('等待电话打进来') coon, addr = server.accept() # 等待 (此时上面加一个while 就可以多个电话打进来并且进行通话) # coon 就是客户端连过来而在服务器端为其生成的一个连接实例 # addr 就是地址 print('电话打进来了') print(coon, addr) # 将coon 与addr 显示出来 while True: # 此时就可以一直不停的发送数据了, 此时的效果就是一个电话可以无阻碍的通话 # 如果此时没有true的话就只能接收一次了 data = coon.recv(1024) # 接收数据 print('recv:', data.decode()) # 此时注意我们需要吧接收的数据解码,因为发过来的是byte类型 coon.send(data.upper()) # 将数据里面的字母转化为大写发送 server.close()
2.客户端
# _*_coding:utf-8_*_ # /usr/bin/env python3 # Author:book Miki # 客户端 import socket client = socket.socket() # 声明socket类型,同时生成socket连接对象 client.connect(('localhost', 6969)) # 连接 while True: ccc = input('>>:') if ccc == '': # 判断是否为空 continue client.send(ccc.encode('utf-8')) # 发送byte类型 data = client.recv(1024) # 接收返回 print(data.decode()) # 解码
那下面我们可以了解一下 完整的程序了
# _*_coding:utf-8_*_ # /usr/bin/env python3 # Author:book Miki # 第一步1.import 模块 然后实例一个模块 若是服务器的话要绑定 在监听,然后等待(返回两个值) 然后接收然后在发送 import os import socket server = socket.socket() server.bind(('localhost', 9999)) # 绑定地址 server.listen() # 监听 print('等待电话') while True: con, addr = server.accept() print('电话来了') while True: data = con.recv(1024) # 接收数据 if not data: print('客户端已断开') break print(data.decode()) cmd_res = os.popen(data.decode()).read() con.send(str(len(cmd_res)).encode('utf-8')) if len(cmd_res) == 0: cmd_res = 'cmd_res has no thing....' client_re = con.recv(1024) # 此处的精妙(隔开两个send) con.send(cmd_res.encode('utf-8')) # 返回数据 server.close() # 关闭 # socker粘包(两个send连在一起缓冲区) 例如 # con.send(str(len(cmd_res)).encode('utf-8')) # con.send(cmd_res.encode('utf-8')) # 此时系统将两个send当作一个发。就需要在中间加一个client_re = con.recv(1024) 来等待 就可以做到 # 也就是等到客户端确认
2.2客户端
# _*_coding:utf-8_*_ # /usr/bin/env python3 # Author:book Miki # 客户端 第一步导入模块,然后实例化一个 然后链接,然后发送 然后接收反回 import socket client = socket.socket() client.connect(('localhost', 9999)) while True: data = input('>>:').strip() if len(data) == 0: continue client.send(data.encode('utf-8')) re_size = client.recv(1024).decode() print(re_size) client.send(b'True') re_cmd_two = 0 print('re_cmd_two:', type(re_cmd_two)) print('re_size: ', type(re_size)) print('大小为:', re_size) while re_cmd_two <= int(re_size): re_cmd_one = client.recv(1024) print(re_cmd_one.decode()) re_cmd_two = re_cmd_two + len(re_cmd_one.decode()) print(re_cmd_two) print(re_cmd_two)