zoukankan      html  css  js  c++  java
  • 初识python:scoket 单用户互发消息

    实现功能:

      启动“服务器”、通过“客户端1”连接“服务器”,然后互发消息。在此过程中,有“客户端2”连接到“服务器”,此时,“客户端2”处于占线状态,必须要等“客户端1”退出之后才能与“服务器”互发消息。

    知识点:

      s = socket.socket(family,type)  声明一个socket类型,同时创建连接(套接字),一般默认就可以

     family 参数:

      socket.AF_UNIX # 只能够用于单一的Unix系统进程间通信

      socket.AF_INET # IPV4 服务器之间网络通信

      socket.AF_INET6 # IPV6

     type 参数:

      socket.SOCK_STREAM # 流式socket 用于 TCP

      socket.SOCK_DGRAM # 数据报式socket 用于 UDP

    主要方法:

      s.send(以字节类型发送,要发送的信息),返回值为要发送的字节数量,可能小于要发送的字节数。

      s.sendall(以字节类型发送,要发送的信息),发送所有。实际是内部递归调用send,发送所有内容。

      s.setblocking(True/False) accept或recv时是否阻塞,等待连接。若False,在接收时无数据,则会报错。

      s.recv(指定最多可以接收的字节数) 接收信息,以字符串形式返回

      s.recvfrom(指定最多可以接收的字节数) 接收信息,返回2个值(要接收的字符串,发送信息的地址)

      s.settimeout(多少秒)  设置等待多长时间之后端口连接,单位秒

      s.sendfile() 发送文件

      s.getpeername() 返回连接的远程地址:ip,端口

      s.getsockname() 返回自己的地址:ip,端口

      s.close() 关闭连接

      s.bind(address) 绑定地址,一般情况是元组形式:(ip,端口)

      s.listen(最大连接数) 开始监听传入连接,连接数不能无限大

      s.accept() 接收连接(阻塞式),并返回2个值(新的连接对象,连接地址),同时等待连接的到来。

      s.connect(address)  连接到指定地址(服务器)

      s.connect_ex(address)  连接到指定地址(服务器),连接成功返回0,否者返回错误代码

    服务器端流程:声明、绑定监听、获取连接、接收、发送、关闭

    1、创建连接(套接字)

    2、绑定要监听的ip(本地)、端口

    3、开始监听连接

    4、连接客户端请求

    5、接收客户端信息

    6、给客户端发送信息

    7、关闭连接

    客户端流程:声明、连接、发送、接收、关闭

    1、创建连接(套接字)

    2、通过ip、端口连接服务器

    3、给服务器端发送信息

    4、接收服务器端信息

    5、关闭连接

    整体流程:服务器监听连接,客户端发送连接请求,服务器接收请求,互发信息

    具体代码:

    #!/user/bin env python
    # author:Simple-Sir
    # time:2020/7/22 17:01
    import socket
    
    # 服务器端
    s = socket.socket()  # 声明一个socket类型,同时创建连接(套接字)
    s.bind(('10.108.226.140', 6969))  # 绑定要监听的ip、端口
    s.listen(5)  # 开始监听连接
    print('等待连接...')
    while 1:
        conn,address = s.accept()  # 连接客户端请求(筛选连接对象,在服务器端生产新的连接)
        ip_c, port_c = conn.getsockname()  # 本地IP
        ip_s, port_s = conn.getpeername()  # 远程IP
        print('{0}:{1}已连接上了。'.format(ip_s,port_s))
        while 1:
            data2 = conn.recv(1024)  # 接收信息,字符串
            if not data2:
                print('客户端{0}:{1}已断开连接。'.format(ip_s,port_c))
                break
            print('客户端 {0}:{1}:{2}'.format(ip_s,port_s,data2.decode('utf-8')))
            while 1:
                info = input('服务器 {0}:{1}:'.format(ip_c, port_c))
                if len(info) == 0:
                    print('不能输入空值,请重新输入!')
                else:
                    break
            conn.send(info.encode('utf-8'))  # 发送信息,字节
    s.close()  # 关闭连接
    服务器端
    #!/user/bin env python
    # author:Simple-Sir
    # time:2020/7/22 17:35
    import socket
    
    # 客户端
    c = socket.socket()  # 定义协议类型、链接对象
    c.connect(('10.108.226.140',6969))
    while 1:
        ip_c,port_c = c.getsockname()  # 本地IP
        ip_s,port_s = c.getpeername()  # 远程IP
        info = input('客户端 {0}:{1}:'.format(ip_c,port_c))
        if len(info) == 0:
            continue
        c.send(info.encode('utf-8'))
        data1 = c.recv(1024)
        print('服务器 {0}:{1}:{2}'.format(ip_s,port_s,data1.decode('utf-8')))
    c.close()
    客户端

    运行结果:

    启动“服务器”:

     启动客户端1:

     客户端1和服务器互发消息:

     此时客户端2“呼叫”服务器,服务器还在与客户端1连接中,无法“接通”客户端2,客户端2处于等待状态:

     客户端1与服务器断开连接,客户端2接通:

     其他连接情况:

  • 相关阅读:
    KMP算法
    数据库建立索引为什么会加快查询速度
    腾讯2014实习生4月20日笔试题(分析与解答)
    智能指针auto_ptr & shared_ptr
    用C++实现一个不能被继承的类
    2014金山笔试_编写一个数组类 MyVector
    TCP分组交换详解
    子网掩码的计算
    服务器端 安装svn
    yii2之ActiveForm表单使用
  • 原文地址:https://www.cnblogs.com/simple-li/p/13371825.html
Copyright © 2011-2022 走看看