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

  • 相关阅读:
    Effective Java 第三版——72. 赞成使用标准异常
    Effective Java 第三版——71. 避免不必要地使用检查异常
    Effective Java 第三版——70. 对可恢复条件使用检查异常,对编程错误使用运行时异常
    Effective Java 第三版——69. 仅在发生异常的条件下使用异常
    Effective Java 第三版——68. 遵守普遍接受的命名约定
    Effective Java 第三版——67. 明智谨慎地进行优化
    Effective Java 第三版——66. 明智谨慎地使用本地方法
    Effective Java 第三版——65. 接口优于反射
    Effective Java 第三版——64. 通过对象的接口引用对象
    Effective Java 第三版——63. 注意字符串连接的性能
  • 原文地址:https://www.cnblogs.com/slz99/p/12527737.html
Copyright © 2011-2022 走看看