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()

     

  • 相关阅读:
    Codeforces Round #719 (Div. 3) 题解
    Codeforces Global Round 14 A~F题解
    AtCoder Beginner Contest 199 题解
    Codeforces Round #716 (Div. 2) A~D 题解
    Codeforces Round #713 (Div. 3) 题解
    Codeforces Round #712 (Div. 2) A~E 题解
    CodeCraft-21 and Codeforces Round #711 (Div. 2) A~E 题解
    CF839 D 莫比乌斯反演
    java存大数和高精度浮点数(BigInteger与BigDecimal)
    java科学计算常用方法(Math)
  • 原文地址:https://www.cnblogs.com/liuyinzhou/p/7966740.html
Copyright © 2011-2022 走看看