• Python学习笔记——Socket通信


    python中实现tcp/ip通信可以利用内置的socket模块,它提供了标准的BSD Sockets APIsocket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。在TCP/IP协议中,“IP地址+TCPUDP端口号”唯一的标识网络通讯中的一个进程,“IP地址+TCPUDP端口号”就为socket 

    为了建立通信我们要实现服务器端(Server)和客户端(Client)程序,由于在我的同一台电脑上运行,故两个程序的ip地址设置相同。代码如下:

    Server端代码:

    # coding:utf-8
    # server端程序
    import socket #导入socket 模块
    
    address = ('192.168.0.7', 50000) #IP地址和端口号
    print('Waiting for a client now !')
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  #创建一个空的套接字,socket.AF_INET表示创建一个IP套接字;
                                                                #socket.SOCK_STREAM表示流式socket,TCP模式;sock_DGRAM表示数据报式socket,UDP模式
    server.bind(address)    #绑定(监听这个IP地址和端口的所有数据)到这个套接字上
    server.listen(5)        #表示最多可以和5个客户端连接,超过5个就会拒绝
    # 调用accept方法时,socket会时入“waiting”状态。客户请求连接时,方法建立连接并返回服务器。
    # accept方法返回一个含有两个元素的元组(connection,address)。
    # 第一个元素connection是新的socket对象,服务器必须通过它与客户通信;第二个元素address是客户的Internet地址
    client, addr = server.accept()
    data = client.recv(1000)         #指定最大可以接受消息长度为1000字节
    print("Client:", client, "Said", data)  #输出client客户端信息以及接收到的数据data
    client.sendall(b'hello')         #发送数据
    client.close()                   #关闭
    server.close()

    Client端代码:

    # coding:utf-8
    # client端程序
    import socket
    
    address = ('192.168.0.7', 50000)
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(address) #与指定地址建立连接
    print("Connection  succeeded!")
    client.sendall(b'Hi!') #发送数据,注意要加b''
    data = client.recv(1000)
    print("Server reply", data)
    client.close()


    但是我在运行Client端程序时,有时会遇到如下的报错:

    ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。

    这说明服务器已经找到,但连接被服务器拒绝。于是我查了一下,连接失败原因可能有三点:

    1.数据包被服务器端的防火墙过滤掉;

    2.端口号设置错误;

    3.服务器没有处于监听状态,被占用不等于在被监听。


    通过检查发现端口号是一致的,排除原因一;通过检查防火墙设置和利用cmd指令:ping 192.168.0.7,能正常收到如下回复,排除原因二;

    并且我发现当server端程序运行时,程序就能正常运行,运行结果如下:

    于是确定是原因三,由于端口未被监听,造成client.connect()函数连接失败返回异常,最终程序异常退出。

    可以利用python中的try/except语句来处理异常做出改进,当程序运行try下面的client.connect()语句遇到异常后,会进入except异常处理块中执行输出”Connection failed.”,改进后的代码如下:

    # coding:utf-8
    # client端程序
    import socket   # 导入 socket 模块
    
    try:
        address = ('192.168.0.7', 50000)
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client.connect(address) #与指定地址建立连接
        print("Connection  succeeded!")
        client.sendall(b'Hi!') #发送数据,注意要加b''
        data = client.recv(1000)
        print("Server reply", data)
        client.close()
    except:
        print("Connection failed.")
    

    这样,问题就解决了。当遇到server端未启动监听时,程序也不会异常退出,运行结果如下:

  • 相关阅读:
    uu 模块
    程序员都是好男人
    TCP基础知识
    最全 git 命令总结
    iOS 添加UIWindow不显示问题解决
    解决CFBundleIdentifier", Does Not Exist
    Mac 系统OS X>=10.9,怎么把默认的python切换成3.7或者更高
    OC算法练习-Hash算法
    设计模式架构模式
    runtime相关知识
  • 原文地址:https://www.cnblogs.com/yucen/p/9343553.html
Copyright © 2020-2023  润新知