zoukankan      html  css  js  c++  java
  • Python网络编程-TCP(基于socket)

    TCP网络编程实战

    基于socket库,socket是Python3的标准库。搭建一个简易的服务器与客户端,让他们之间做简单的数据交互。

    1.TCP数据传输流程

    TCP提供一种面向连接的、可靠的字节流服务。面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接。这一过程与打电话很相似,先拨号振铃,等待对方摘机说“喂”,然后才说明是谁。在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP。

    建立TCP连接需要经过三次握手

    1.主动端先发送SYN报文
    2.被动放回应SYN+ACK报文
    3. 然后主动端再回应ACK

    TCP的一项功能就是确保每个数据段都能到达目的地。位于目的主机的TCP服务对接受到的数据进行确认,并向源应用程序发送确认信息。

    在主动端发送SYN后,如果被动端一直不回应SYN+ACK报文,主动端会不断的重传SYN报文直到超过一定的重传次数或超时时间。在主动端发送SYN后,被动端回应SYN+ACK报文,但主动端不再回复ACK,被动端也会一直重传直到超过一定的重传次数或超时时间。(SYN报文攻击会出现这种情况)可以通过以下命令配置SYN报文的超时时间(发送SYN报文到三次握手成功的最大时间),也就是建立TCP连接的超时时间。

    TCP

    2.TCP服务器搭建

    #Authors:xiaobei
    
    ######搭建服务器######
    import socket
    #创建一个socket
    #socket.AF_INET表示IPv4协议,socket.SOCK_STREAM代表流式传输
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    #绑定IP端口,这里IP就不公布了,大家用自己的IP
    server.bind(("***.***.***.*",8080))
    #监听
    server.listen(5)
    print("服务器已启动")
    #等待链接
    print("等待链接中……")
    clientSocket,clientAddress = server.accept()
    print("%s
    %s
    链接成功"%(str(clientSocket),clientAddress))
    while True:
        print("等待接收数据中……")
        #等待接收数据
        data = clientSocket.recv(1024)
        #判断客户端链接状态
        if(data):
            print("收到"+str(clientAddress)+"的数据:"+str(data.decode("utf-8")))
        else:
            print("%s
    %s
    断开链接"%(str(clientSocket),clientAddress))
            break
        #回应数据
        answer = input("请输入回应客户端的数据:")
        clientSocket.send(answer.encode("utf-8"))
        print("发送成功!")

    这里的IP地址就不公布了,为了安全考虑,这里的IP可以自己使用自己服务器的IP,或者自己电脑的IP也可以。

    3. TCP客户端创建

    #Authors:xiaobei
    
    ######创建客户端######
    import socket
    #创建一个socket
    client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    #创建链接
    #参数:参数是一个元组,第一个元素为要链接的IP地址,第二个元素为端口
    client.connect(("***.***.***.*",8080))
    print("链接成功")
    while True:
        data = input("请输入发送给服务器的数据:")
        if data=="0":
            #断开连接
            client.close()
            print("已断开链接……")
            break
        #发送数据
        client.send(data.encode("utf-8"))
        print("发送成功!")
        #接收数据(每次接受1K数据量)
        answer = client.recv(1024)
        print("服务器响应数据:",answer)

    4.本机IP查找

    打开cmd,输入“ipconfig",可以得到本机的IP。

    >>>ipconfig

  • 相关阅读:
    嵌套循环td时补齐td的解决方法
    [web.aspNet]vs2005无法断点调试网站,断点失效 IE8 vss6.0
    使IE6下PNG背景透明的七种方法任你选
    VBA之Range对象在Excel单元格赋值示例
    css控制透明度
    SQL2000中用backup 备份数据库
    软件开发人才级别划分
    sql server事务全攻略(转载)
    程序员不是神,心态决定一切
    一个真正合格程序员的七种素质
  • 原文地址:https://www.cnblogs.com/slz99/p/12527737.html
Copyright © 2011-2022 走看看