客户端与服务端交互的基本流程

  1. 服务端server

    #!/usr/bin/env python
    # -*- coding;utf-8 -*-
    import socket sk = socket.socket()
    sk.bind(("127.0.0.1", 9999))
    sk.listen(5)
    while True:
    conn, address = sk.accept()
    conn.sendall(bytes("欢迎访问老男孩!",encoding="utf-8"))
    while True:
    ret_bytes = conn.recv(1024)
    ret_str = str(ret_bytes, encoding="utf-8")
    print(ret_str)
    if ret_str == "q":
    break
    conn.sendall(bytes("答:" + "好!", encoding="utf-8"))
  2. 客户端client
    #!/usr/bin/env python
    # -*- coding;utf-8 -*-
    import socket obj = socket.socket()
    obj.connect(("127.0.0.1", 9999))
    ret_bytes = obj.recv(1024)
    ret_str = str(ret_bytes, encoding="utf-8")
    print(ret_str)
    while True:
    inp = input("请输入内容:\n 问:")
    obj.sendall(bytes(inp, encoding="utf-8"))
    if inp == 'q':
    break
    else:
    ret = str(obj.recv(1024), encoding="utf-8")
    print(ret)
    obj.close()

粘包问题解决方案:一个类型文件发送完毕之后进行一次确认信息交互。

  1. server(粘包)

    #!/usr/bin/env python
    # -*- coding;utf-8 -*- import socket sk = socket.socket()
    sk.bind(("192.168.1.107", 9999,)) # 传入元组
    sk.listen(5) # 监听客户端请求,最多有五个客户端请求等待)
    # 连接,客户端的地址信息(IP,port)
    while True:
    conn, address = sk.accept() # accept表示阻塞,等待连接请求
    conn.sendall(bytes("欢迎访问老男孩!", encoding="utf-8"))
    file_size = str(conn.recv(1024), encoding="utf-8")
    print(file_size)
    conn.sendall(bytes("开始吧!", encoding="utf-8"))
    total_size = int(file_size)
    has_recv = 0
    with open("c11.py", "wb") as f:
    i = 0
    while True:
    if total_size == has_recv:
    print("接收完毕!")
    break
    data = conn.recv(1024)
    f.write(data)
    has_recv += len(data)
    obj.close()
  2. client(粘包)
    #!/usr/bin/env python
    # -*- coding;utf-8 -*-
    import socket
    import os obj = socket.socket()
    obj.connect(("192.168.1.107", 9999))
    result_bytes = obj.recv(1024) # 等待发送消息
    result_str = str(result_bytes, encoding="utf-8")
    print(result_str)
    # 发送当前文件大小
    file_size = os.stat("client(粘包).py").st_size
    print("文件大小:" + str(file_size))
    obj.sendall(bytes(str(file_size), encoding="utf-8"))
    obj.recv(1024)
    with open("client(粘包).py", "rb") as f:
    seed_size = 0
    for i, line in enumerate(f, 1):
    obj.sendall(line)
    seed_size += len(line)
    if seed_size == file_size:
    print("发送完毕!")
    obj.close()

IO多路复用在socket中的运用:针对老用户和新用户,服务器做出不同的响应

  1. server服务端

    #!/usr/bin/env python
    # -*- coding;utf-8 -*-
    """
    IO多路复用socket实例代码
    """
    import socket
    import select sk1 = socket.socket()
    sk1.bind(("127.0.0.1", 8001))
    sk1.listen(5)
    inputs = [sk1, ]
    info_sender = []
    message = {} while True:
    # select自动监听文件描述符,发生变化则放入r_list列表中
    r_list, w_list, e_list = select.select(inputs, info_sender, [], 1)
    # print("正在监听的对象数量:%d" % len(inputs))
    for sk in r_list:
    # sk 表示每个连接对象
    if sk == sk1:
    # 有新用户建立连接
    conn, address = sk.accept()
    conn.sendall(bytes("hello", encoding="utf-8"))
    inputs.append(conn)
    message[conn] = []
    else:
    # 有老用户发送信息
    try:
    date = str(sk.recv(1024), encoding="utf-8")
    except Exception as e:
    e_list.append(sk)
    else:
    if sk not in info_sender:
    info_sender.append(sk)
    message[sk].append(date) for sk in w_list:
    re = message[sk][0]
    del message[sk][0]
    sk.sendall(bytes(re + "hello", encoding="utf-8"))
    # 给我发送信息的对象,我回复了信息就要把它排除,不然前面有while循环,和for循环,就会不断给对方回复消息!
    info_sender.remove(sk) for sk in e_list:
    inputs.remove(sk)
  2. 客户端client(client1,client2,client3):当用户第一次连接时执行相同的操作,支持多用户与服务器交互,客户端断开连接,服务器不受影响
    #!/usr/bin/env python
    # -*- coding;utf-8 -*-
    import socket sk1 = socket.socket()
    sk1.connect(("127.0.0.1", 8001))
    while True:
    content1 = str(sk1.recv(1024), encoding="utf-8")
    a = []
    print(content1)
    while True:
    inp = input(">>>")
    if inp == "q":
    a.append(inp)
    break
    else:
    sk1.sendall(bytes(inp, encoding="utf-8"))
    content2 = str(sk1.recv(1024), encoding="utf-8")
    print(content2)
    if a == ["q"]:
    break
    sk1.close()

      

  

Python全栈开发:socket代码实例的更多相关文章

  1. Python全栈开发:递归实例

    #!/usr/bin/env python # -*- coding;utf-8 -*- """ 递归不能无限,python会限制递归深度,递归主要用于费布拉切数列 &q ...

  2. Python全栈开发【面向对象】

    Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...

  3. Python全栈开发【模块】

    Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...

  4. Python全栈开发【基础三】

    Python全栈开发[基础三]  本节内容: 函数(全局与局部变量) 递归 内置函数 函数 一.定义和使用 函数最重要的是减少代码的重用性和增强代码可读性 def 函数名(参数): ... 函数体 . ...

  5. python 全栈开发,Day99(作业讲解,DRF版本,DRF分页,DRF序列化进阶)

    昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...

  6. 学习笔记之Python全栈开发/人工智能公开课_腾讯课堂

    Python全栈开发/人工智能公开课_腾讯课堂 https://ke.qq.com/course/190378 https://github.com/haoran119/ke.qq.com.pytho ...

  7. Python全栈【Socket网络编程】

    Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...

  8. Python全栈开发【面向对象进阶】

    Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...

  9. Python全栈开发【基础四】

    Python全栈开发[基础四] 本节内容: 匿名函数(lambda) 函数式编程(map,filter,reduce) 文件处理 迭代器 三元表达式 列表解析与生成器表达式 生成器 匿名函数 lamb ...

  10. Python全栈开发【基础一】

    Python全栈开发[第一篇] 本节内容: Python 的种类 Python 的环境 Python 入门(解释器.编码.变量.input输入.if流程控制与缩进.while循环) if流程控制与wh ...

随机推荐

  1. (干货)java中如何根据一个时间获取属于本年那一周,本周的开始时间以及最后一天时间。并且设置起始时间为周6.结束时间为周5

    本人亲测,有用,适用性比较强,直接上代码说话. package com.helloBike.data; import java.text.ParseException; import java.tex ...

  2. Python 数据结构_队列

    目录 目录 队列 队列 Queue 队列是一种先进先出(FIFO)的数据类型, 新的元素通过 入队 的方式添加进 Queue 的末尾, 出队 就是从 Queue 的头部删除元素. 用列表来做 Queu ...

  3. 基于Netty的RPC架构学习笔记(七):netty学习之心跳

    文章目录 idleStateHandler netty3

  4. IAsyncResult

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. LeetCode刷题笔记-回溯法-组合总和问题

    题目描述: <组合总和问题>给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. cand ...

  6. k8s 对接glusterfs存储

    service 与 endpoint 是通过namespace相同,name相同,相互关联的 创建endpoint [root@k8s-master glusterfs]# cat glusterfs ...

  7. 纯CSS3制作的“Ribbons”效果

    在看具体每个demo之前,我们一起来看下面一个截图: 上图是一个典型的“Ribbons”各部位的示意图,但每一个“Ribbons”并不会都使用上图示意的各个部分,在下面的实例中大家可以明显的看 到或者 ...

  8. hadoop 8088 看不到mapreduce 任务的执行状态

    进到8088页面后,怎么看不到mapreudce的执行状态,有哪里需要配置的 解决办法: 在$HADOOP_HOME/conf/mapred-site.xml 在原来的配置文件基础之上添加: < ...

  9. 【POJ】1251 Jungle Roads

    题目链接:http://poj.org/problem?id=1251 题意:n个村庄字母标号,每个字母后跟m个字母,表示该字母到mi的距离.求构建所有村庄道路的最短距离. 题解:最小生成树裸题.注意 ...

  10. D3.js坐标轴的绘制方法、添加坐标轴的刻度和各比例尺的坐标轴(V3版本)

    坐标轴(Axis)   坐标轴(Axis)在很多图表中都可见到,例如柱形图.折线图.散点图等.坐标轴由一组线段和文字组成,坐标轴上的点由一个坐标值确定.但是,如果使用SVG的直线和文字一笔一画的绘制坐 ...