zoukankan      html  css  js  c++  java
  • Python socket 编程实验

    实验内容

    1.编写一个基于UDP协议的客户机与服务器程序,实现相互通讯。
    2.编写一个基于TCP协议的客户机与服务器程序,实现相互通讯。
    3.捕获以上两种通讯的数据包,使用Wireshark进行分析,以深入了解TCP、UDP协议的数据传输机制。

    TCP编程及监听分析

    1、建立一个TCP服务器连接需要6个步骤:

    (1)创建socket对象。
    调用socket构造函数:
    socket=socket.socket(familly,type)
    family的值可以是AF_UNIX(Unix域,用于同一台机器上的进程间通讯),也可以是AF_INET(对于IPV4协议的TCP和 UDP),至于type参数,SOCK_STREAM(流套接字)或者 SOCK_DGRAM(数据报文套接字)、SOCK_RAW(raw套接字),TCP使用SOCK_STREAM参数。
    (2)将socket绑定(指派)到指定地址上,socket.bind(address)
    address必须是一个双元素元组,((host,port)),主机名或者ip地址+端口号。如果端口号正在被使用或者保留,或者主机名或ip地址错误,则引发socke.error异常。
    (3)绑定后,必须准备好套接字,以便接受连接请求。
    socket.listen(backlog)
    backlog指定了最多连接数,至少为1,接到连接请求后,这些请求必须排队,如果队列已满,则拒绝请求。
    (4)服务器套接字通过socket的accept方法等待客户请求一个连接:
    connection,address=socket.accept()
    调用accept方法时,socket会进入'waiting'(或阻塞)状态。客户请求连接时,方法建立连接并返回服务器。accept方法返回一个含有两个元素的元组,形如
    (connection,address)。第一个元素(connection)是新的socket对象,服务器通过它与客户通信;第二个元素(address)是客户的internet地址。
    (5)处理阶段,服务器和客户通过send和recv方法通信(传输数据)。
    服务器调用send,并采用字符串形式向客户发送信息。send方法返回已发送的字符个数。服务器使用recv方法从客户接受信息。调用recv时,必须指定一个整数来控制本次调用所接受的最大数据量。recv方法在接受数据时会进入'blocket'状态,最后返回一个字符串,用它来表示收到的数据。如果发送的量超过recv所允许,数据会被截断。多余的数据将缓冲于接受端。以后调用recv时,多余的数据会从缓冲区删除。
    (6)传输结束,服务器调用socket的close方法以关闭连接。

    2、建立一个TCP客户端连接则需要4个步骤:

    (1)创建一个socket以连接服务器 socket=socket.socket(family,type)
    (2)使用socket的connect方法连接服务器 socket.connect((host,port))
    (3)客户和服务器通过send和recv方法通信。
    (4)结束后,客户通过调用socket的close方法来关闭连接。

    3、建立TCP服务器与TCP客户端程序
    tcp-server.py
    创建套接字,绑定套接字,开始监听,就是一个while循环一直监听有没有消息连接。

    #-*- coding: utf-8 -*-
    #@Time : 2021/4/15 15:16
    #@Author : HUGBOY
    #@File : tcp-server.py
    #@Software: PyCharm
    
    import socket
    
    # 开启ip和port
    ip_port = ('192.168.1.111', 666)
    # 生成一个句柄
    sk = socket.socket()
    # 绑定ip和port
    sk.bind(ip_port)
    # 最多连接数
    sk.listen(5)
    
    # 开启死循环
    print('server waiting...')
    # 等待链接 阻塞
    conn, addr = sk.accept()
    # 获取客户端请求
    print('链接成成功, 客户端为:', addr)
    
    while True:
        client_data = conn.recv(1024)
        print('[收到客户端数据]:' + client_data.decode('utf-8'))
    
        if client_data == 'q':
            break
    
        # 发送数据
        msg = input('回复客户端:>>>')
        conn.sendall(msg.encode('utf-8'))
    
    # Close
    conn.close()
    sk.close()
    

    ctp-client.py
    创建套接字,连接,等待输入,发送。

    #-*- coding: utf-8 -*-
    #@Time : 2021/4/15 15:09
    #@Author : HUGBOY
    #@File : tcp-client.py
    #@Software: PyCharm
    
    import socket
    # 服务端ip和port
    ip_port = ('192.168.1.111', 666)
    # 生成一个句柄
    sk = socket.socket()
    # 请求链接服务器
    sk.connect(ip_port)
    
    while True:
        msg = input('向服务端发送:')
        # 发送数据
        sk.sendall((msg.encode('utf-8')))
    
        if msg == 'q':
            break
    
        # 接收数据
        server_reply = sk.recv(1024)
    
        if not server_reply:
            break
    
        print('[收到服务端数据]:' + server_reply.decode('utf-8'))
    
    # Close
    sk.close()
    


    实验任务
    查出通讯三次握手、源端口、目的端口、TTL值、IP版本号、协议类型、IP头长度以及传输的数据内容。

    三次握手


    源端口
    目的端口

    TTL值

    IP版本号

    协议类型

    IP头长度

    传输数据内容

    UDP编程及监听分析

    由于UDP是无连接的,与TCP的区别在服务器端表现为,无需监听函数listen()对客户端的连接进行监听; 在客户端的表现为客户端的socket无需与服务器建立连接就能够进行数据的发送与接收,即无需connect()函数。

    1、建立一个UDP服务器连接需要4个步骤:

    1)创建socket对象。调用socket构造函数:
    socket=socket.socket(familly,type)
    family的值可以是AF_UNIX(Unix域,用于同一台机器上的进程间通讯),也可以是AF_INET(对于IPV4协议的TCP和 UDP),至于type参数,SOCK_STREAM(流套接字)或者 >SOCK_DGRAM(数据报文套接字),SOCK_RAW(raw套接字),UDP 使用SOCK_DGRAM参数。
    2)将socket绑定(指派)到指定地址上,socket.bind(address)
    address必须是一个双元素元组,((host,port)),主机名或者ip地址+端口号。如果端口号正在被使用或者保留,或者主机名或ip地址错误,则引发socke.error异常。
    3)处理阶段,服务器和客户通过sendto()和recvfrom()方法通信(传输数据)。
    4)传输结束,服务器调用socket的close方法以关闭连接。

    2、建立一个UDP客户端连接则需要4个步骤:

    1)创建一个socket以连接服务器 socket=socket.socket(family,type)
    2)使用socket的connect方法连接服务器 socket.connect((host,port))
    3)客户和服务器通过sendto()和recvfrom()方法通信。
    4)结束后,客户通过调用socket的close方法来关闭连接。

    3、编写UDP服务器与客户端程序
    udp-server.py
    创建套接字,开始监听,就是一个while循环一直监听有没有消息连接。

    #-*- coding: utf-8 -*-
    #@Time : 2021/4/15 18:55
    #@Author : HUGBOY
    #@File : udp-server.py
    #@Software: PyCharm
    
    from socket import *
    
    host = '192.168.1.111'
    port = 666
    addr = (host, port)
    
    s = socket(AF_INET, SOCK_DGRAM)
    s.bind(addr)
    
    print('等待客户端连接...')
    while True:
        data, addr = s.recvfrom(1024)
        print(addr + ':' + data.decode('utf-8'))
        msg = '收到。'
        s.sendto(msg.encode('utf-8'), addr)
    
    s.close()
    

    udp-client.py
    创建套接字,while循环一直监听有没有消息连接。

    #-*- coding: utf-8 -*-
    #@Time : 2021/4/15 17:13
    #@Author : HUGBOY
    #@File : udp-client.py
    #@Software: PyCharm
    
    from socket import *
    
    host = '192.168.1.111'
    port = 666
    addr = (host, port)
    
    s = socket(AF_INET, SOCK_DGRAM)
    while True:
        msg = input('向客户端发送:')
        s.sendto(msg.encode('utf-8'), addr)
        data, addr = s.recvfrom(1024)
        print(addr, ':', data.decode('utf-8'))
    s.close
    
    
    


    实验任务:
    查出通讯的源端口、目的端口、TTL值、IP版本号、协议类型、IP头长度以及传输的数据内容。

    查出通讯的源端口 目的端口

    TTL值

    IP版本号

    协议类型

    IP头长度

    传输的数据内容

    参考

    三次握手


    ________________________________________________________

    Every good deed you do will someday come back to you.

    Love you,love word !
  • 相关阅读:
    UVa 12174 (滑动窗口) Shuffle
    UVa 1607 (二分) Gates
    CodeForces ZeptoLab Code Rush 2015
    HDU 1525 (博弈) Euclid's Game
    HDU 2147 (博弈) kiki's game
    UVa 11093 Just Finish it up
    UVa 10954 (Huffman 优先队列) Add All
    CodeForces Round #298 Div.2
    UVa 12627 (递归 计数 找规律) Erratic Expansion
    UVa 714 (二分) Copying Books
  • 原文地址:https://www.cnblogs.com/hugboy/p/socket_tcp_udp.html
Copyright © 2011-2022 走看看