python <12> socket 编程

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)
原文地址:https://www.cnblogs.com/BookMiki/p/9999000.html