zoukankan      html  css  js  c++  java
  • python之socket

    理解概念

    之前了解到了网络编程的基本层面,以及数据传输的形式,接下来我们来了解一下python socket。
    先来看看socket的解释:

    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。

    那么我们来理解就是在网络编程时候别人把比较复杂的一些协议啊,规定啊写好成接口,咱们只需要调用这些接口,自己写一些逻辑代码来实现我们需要的功能就行了。

    socket
    socket在协议下它是IP+端口,ip是标识互联网中的一台主机的位置,端口来标识这台机器的一个应用程序,ip+port绑定就标识了互联网中独一无二的一个应用程序。

    了解历史

    Socket最初是加利福尼亚大学Berkeley分校为Unix系统开发的网络通信接口。后来随着TCP/IP网络的发展,Socket成为最为通用的应用程序接口,也是在Internet上进行应用开发最为通用的API。unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信

    UDP协议

    之前了解过TCP协议了,来看看UDP协议:
    无连接协议,也称透明协议,也位于传输层。

    看看它与TCP协议的区别:

    1) TCP提供面向连接的传输,通信前要先建立连接(三次握手机制); UDP提供无连接的传输,通信前不需要建立连接。
    2) TCP提供可靠的传输(有序,无差错,不丢失,不重复); UDP提供不可靠的传输。
    3) TCP面向字节流的传输,因此它能将信息分割成组,并在接收端将其重组; UDP是面向数据报的传输,没有分组开销。
    4) TCP提供拥塞控制和流量控制机制; UDP不提供拥塞控制和流量控制机制。

    所以来说,打电话,聊天使用相对稳定连接的tcp协议,在看网络电影,电视时候用的是udp协议,所以有时会电影卡顿失帧。

    那我们再看看看看具体socket工作流程:
    TCP

    先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

    具体实现一个本地聊天功能:

    # 服务端
    import socket
    HostPort = ('127.0.0.1',9999) #
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.bind(HostPort)
    s.listen(1)
    conn,addr = s.accept()
    # print('Connecting by : %s ' % addr)
    while True:
        data = conn.recv(1024).decode()
        print ('客户端的消息:',data)
        user_input = input('>>>')
        conn.send(user_input.encode('utf8'))
    s.close()
    

    服务端

    # 客户端
    import socket
    
    hostport = ('127.0.0.1', 9999)
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.connect(hostport)
    
    while True:
        user_input = input('>>> ').strip()
        s.send(user_input.encode('utf-8'))
        if len(user_input) == 0:
            continue
        if user_input == 'quit':
            s.close()
            break
        server_reply = s.recv(1024).decode()
        print('来自服务器的回复:',server_reply)
    

    客户端

    爱,就是你和某个人一起经历的一切。
  • 相关阅读:
    Python 通过最低位判断数字是偶数还是奇数
    C语言 windows下Ansi和UTF-8编码格式的转换
    C语言 Ubuntu系统 UTF-8 文字处理
    C语言 使用char字符实现汉字处理
    C# GUI应用 实现 2048游戏
    Docker部署Minio
    Ubuntu18.04开启root
    Ubuntu18.04安装Docker
    docker安装mysql
    idea启动项目端口被占用
  • 原文地址:https://www.cnblogs.com/afly-8/p/13561142.html
Copyright © 2011-2022 走看看