zoukankan      html  css  js  c++  java
  • 基于TCP协议的socket编程

    什么是socket

      Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

      所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。

        也有人将socket说成ip+port,ip是用来标识互联网中的一台主机的位置,而port是用来标识这台机器上的一个应用程序,ip地址是配置到网卡上的,而port是应用程序开启的,ip与port的绑定就标识了互联网中独一无二的一个应用程序 而程序的pid是同一台机器上不同进程或者线程的标识。

    TCP协议的特点:

      1.可靠传输。数据从本地发送出去之后,本地内的缓存数据不会清空,只有当服务端收到客户端的应答后,才清除缓存,否则,在规定的时间内则重新发送数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。 

      2.字节流协议。

      3。面向连接。在数据进行传输之前,服务端与客户端必须建立一个双向的连接后,方能传输数据,因此是面向连接服务。

    基于网络类型的套接字家族

    套接字家族的名字:AF_INET

    (还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET)

    代码示例:

    服务端

    import   socket
    import  os
    import pickle
    #创建一个socket对象
    s  = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    #绑定服务端程序的IP地址和端口号
    s.bind(('127.0.0.1',7895))
    #开始TCP监听
    s.listen(5)#设置半连接池的大小
    #被动接受TCP客户的连接,等待连接的到来
    
    while True:
        con, add = s.accept()
        # print('等待客户端接入')
        # 打印客户端的连接信息
        print(add)
        while True:
            try:
                # 接收客户端发送的数据
                data = int(con.recv(1024))
                print(data)
                # 打印数据
                if data  == 1:
                    res = os.listdir(os.chdir('c:\'))
                    #将列表转换为二进制
                    res = pickle.dumps(res)
                    con.send(res)
                elif  data == 2:
                    res = os.getcwd()
                    res = pickle.dumps(res)
                    con.send(res)
            except Exception:
                break
        con.close()
    s.close()
    import  socket
    import  pickle
    # from  socket  import  *
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    s.connect(('127.0.0.1',7895))
    msg = '''
    请输入操作序号:
        1.打印C盘根目录下的文件
        2.打印当前路径
        '''
    print(msg)
    while True:
        str = input('>>>:')
        #若输入为空,则重新输入
        if not  str:continue
        s.send(str.encode('utf-8'))
        data = s.recv(1024)
        #反序列化
        res = pickle.loads(data)
        print(res)
    
    s.close()

     

  • 相关阅读:
    第二十节:Scrapy爬虫框架之使用Pipeline存储
    第十九节:Scrapy爬虫框架之Middleware文件详解
    第十八节:Scrapy爬虫框架之settings文件详解
    第十七节:Scrapy爬虫框架之item.py文件以及spider中使用item
    第十六节:Scrapy爬虫框架之项目创建spider文件数据爬取
    第一节:python提取PDF文档中的图片
    第十五节:Web爬虫之selenium动态渲染爬取
    H5移动开发底部导航-博客园老牛大讲堂
    ajax跨域通信-博客园老牛大讲堂
    博客园模板2--博客园老牛大讲堂
  • 原文地址:https://www.cnblogs.com/liuyinzhou/p/7966740.html
Copyright © 2011-2022 走看看