zoukankan      html  css  js  c++  java
  • python概念-Socket到底有多骚

    Socket究竟是什么呢?

    简单来说Socket就是用来完成客户端与服务器之间的通信

    例如浏览器访问网页,例如网络游戏等一切基于客户端服务器来实现的C/S架构程序

    Socket是基于互联网OSI七层协议的一个结构,准确的说是基于建议互联网模型OSI五层协议的接口

    如图所示,自行脑补!

    此处延伸一个概念:套接字

    套接字在最开始的时候,是应用于进程与进程之间的通信,之后被广泛应用到互联网,基本上分为两个种族

    基于文件类型的套接字:AF_UNIX

    基于网络类型的套接字:AF_INET

    而我们今后关心的重点肯定是网络类型,所以今后我们会对AF_INET分解研究

    套接字的工作流程:

    这里我们可以看出来socket的基本工作流程了,也大致看了一下socket通信时所用到的方法

    服务端套接字函数

    服务端套接字函数
    s.bind() 绑定(主机,端口号)到套接字
    s.listen() 开始TCP监听
    s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来

    客户端套接字函数
    s.connect() 主动初始化TCP服务器连接
    s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

    公共用途的套接字函数
    s.recv() 接收TCP数据
    s.send() 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
    s.sendall() 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
    s.recvfrom() 接收UDP数据
    s.sendto() 发送UDP数据
    s.getpeername() 连接到当前套接字的远端的地址
    s.getsockname() 当前套接字的地址
    s.getsockopt() 返回指定套接字的参数
    s.setsockopt() 设置指定套接字的参数
    s.close() 关闭套接字

    面向锁的套接字方法
    s.setblocking() 设置套接字的阻塞与非阻塞模式
    s.settimeout() 设置阻塞套接字操作的超时时间
    s.gettimeout() 得到阻塞套接字操作的超时时间

    面向文件的套接字的函数
    s.fileno() 套接字的文件描述符
    s.makefile() 创建一个与该套接字相关的文件

    以上供了解和学习

    那么如何使用socket进行TCP通信呢?

    代码示例:

     1 # 编辑者:闫龙
     2 import socket
     3 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
     4 phone.bind(("192.168.16.2",8800))
     5 phone.listen(5)
     6 while True:
     7     con,addr = phone.accept()
     8     while True:
     9         try:
    10             datas = con.recv(1024)
    11             if not datas : break # 应对服务死循环
    12             if(datas == b"egon"):
    13                 con.send(b"sb")
    14             else:
    15                 con.send(datas)
    16         except Exception as e:
    17             break
    18     con.close()
    19 phone.close()
    服务器端
    1 # 编辑者:闫龙
    2 import socket
    3 GoPhone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    4 GoPhone.connect(("192.168.16.2",8800))
    5 while True:
    6     msg= input(">>>:")
    7     if not msg : continue
    8     GoPhone.send(msg.encode("utf8"))
    9     print(GoPhone.recv(1024).decode("gbk"))
    客户端

    今天暂时写到这里,明天继续

  • 相关阅读:
    Prime Ring Problem 素数环
    下沙的沙子有几粒?
    小兔的棋盘
    超级楼梯
    一只小蜜蜂...
    变形课
    Buy the Ticket
    How Many Trees?
    通过拦截器来统计每个action的执行时间
    apache+tomcat+session(JK实现方式)
  • 原文地址:https://www.cnblogs.com/DragonFire/p/6803749.html
Copyright © 2011-2022 走看看