美文网首页计算机网络
《计算机网络——自顶向下方法》应用层——socket编程

《计算机网络——自顶向下方法》应用层——socket编程

作者: YAN_DAOJIANG | 来源:发表于2020-02-13 21:29 被阅读0次

    TCP套接字编程

    典型的网络应用是由一对程序组成的(客户程序和服务器程序),他们位于两个不同的端系统中。当运行这两个程序时,创建了一个客户进程和一个服务器进程,同时它们通过从套接字读出和写入数据彼此进行通信。
    网络应用程序有两类。一类是实现在协议标准中定义的操作;另一类网络应用程序是专用的网络应用程序,这种情况下程序的应用层协议并没有公开发布在某RFC中或者其他地方。
    在研发阶段,开发者必须最先做的一个决定是:程序是运行在TCP上还是运行在UDP上。

    UDP套接字编程

    运行在不同的机器上的进程彼此通过向进程发送报文来进行通信。进程好比是一座房子,进程的套接字就好比是一扇门。应用程序位于房子中门的一侧;运输层位于该门朝外的另一侧。
    当使用UDP时,发送进程为分组附上目的地址是由目的主机IP和目的地套接字端口号组成的。同时,发送方的源地址也是由源主机IP和端口号组成的,该地址也要附在分组上(由底层操作系统完成)。


    image

    示例

    • client.py
    from socket import *
    serverName = '192.168.0.5'
    serverPort = 12000
    clientSocket = socket(AF_INET, SOCK_DGRAM)
    message = input("请输入一串小写字母:")
    clientSocket.sendto(message.encode(), (serverName, serverPort))
    modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
    print(modifiedMessage.decode())
    clientSocket.close()
    
    • server.py
    from socket import *
    serverPort = 12000
    serverSocket = socket(AF_INET, SOCK_DGRAM)
    serverSocket.bind(('', serverPort))
    print("服务器准备就绪:")
    while True:    
        message, clientAddress = serverSocket.recvfrom(2048)
        modifiedMessage = message.upper()
        serverSocket.sendto(modifiedMessage, clientAddress)
    

    TCP套接字编程

    与UDP不同的是,TCP是一个面向连接的协议。则意味着在客户和服务器能够开始互相发送数据之前,他们先要握手和创建一个TCP连接。TCP连接的一端与客户套接字相联系另一端与服务器套接字相联系。当创建TCP连接时,我们将其与客户套接字地址和服务器套接字地址关联起来。使用创建的TCP连接,当一侧要向另一侧发送数据时,它只需经过其套接字将数据丢给TCP连接。


    image

    随着服务器进程的运行,客户程序能够向服务器发起一个TCP连接。这是由客户程序通过创建一个TCP套接字完成的。当客户生成其TCP套接字时,它指定了服务中的欢迎套接字地址,即服务器主机IP地址及其套接字的端口号。生成套接字后,该客户发起一个三次握手并创建与服务器的一个TCP连接。发生在运输层的三次握手对于客户和服务器时完全透明的。


    image

    示例

    • client.py
    from socket import *
    serverName = '192.168.0.5'
    serverPort = 13000
    clientSocket = socket(AF_INET, SOCK_STREAM)
    clientSocket.connect((serverName, serverPort))
    message = input("请输入一段小写字母:")
    clientSocket.send(message.encode())
    modifiedMessage = clientSocket.recv(1024)
    print(modifiedMessage.decode())
    
    • server.py
    from socket import *
    serverPort = 13000
    serverSocket = socket(AF_INET, SOCK_STREAM)
    serverSocket.bind(("", serverPort))
    serverSocket.listen(1)
    while True:    
        connectionSocket, address = serverSocket.accept()
        message = connectionSocket.recv(1024)
        modifiedMessage = message.upper()
        connectionSocket.send(modifiedMessage)
        connectionSocket.close()
    

    相关文章

      网友评论

        本文标题:《计算机网络——自顶向下方法》应用层——socket编程

        本文链接:https://www.haomeiwen.com/subject/bifrfhtx.html