zoukankan      html  css  js  c++  java
  • python基于套接字的简单服务器和客户端的实现

    关于C/S架构和套接字服务在这里就不赘述了,如有不明白的小伙伴请自行查询。

    python提供了socket()函数,用于创建套接字对象用于套接字的网络通信。

    要创建套接字,必须要实例化一个是socket()对象:

    import socket
    server = socket.socket(socket_family,socket_type,protocol=0)
    #其中socket_family指的是地址家族,一般比较受欢迎的平台都使用地址家族缩写AF,而一些比较旧的平台会使用协议家族PF。基于ipv4的家族名称为AF_INET,基于ipv6的家族名称为AF_INET6。
    #socket_type指定了传输协议是什么,TCP套接字必须使用SOCK_STREAM,UDP必须使用SOCK_DGRAM。
    #protocol通常省略,默认为0

    socket对象创建好了,就可以使用套接字方法进行进一步的交互了(本文引用的是《Python核心编程第三版》)。


     服务器套接字方法:

      server.bind()                                    将地址(主机号,端口号)绑定到套接字上

      server.listen()                                     设置并启动TCP监听器

      server.accept()                                   被动接受TCP客户端的连接,一直等待直到连接到达


    客户端的套接字方法:

      server.connect()                                    主动发起TCP服务器连接

      server.connect_ex()                                 connect()的扩展版本,此时会以错误码的形式返回问题,而不是抛出一个异常


    普通的套接字方法:

      server.recv()                                     接收TCP消息

      server.recv_into()                                   接收TCP消息到指定的缓冲区

      server.send()                                      发送TCP消息

      server.sendall()                                     完整的发送TCP消息

      server.recvfrom()                                     接受UDP消息

      server.recvfrom_into()                                       接收UDP消息到制定的缓冲区

      server.sendto()                                      发送UDP消息

      server.getpeername()                                   连接到套接字的远程地址

      server.getsockname()                                     当前套接字地址

      server.getsockopt()                                  返回给定套接字选项的值

      server.setsockopt()                                   设置给定套接字选项的值

      server.shutdown()                                   关闭连接

      server.close()                                       关闭套接字

      server.detach()                                     在未关闭文件描述符的情况下关闭套接字,返回文件描述


    面向阻塞的套接字方法:

      server.setblocking()                                   设置套接字的阻塞或非阻塞模式

      server.settimeout()                                     设置阻塞套接字操作的超时时间

      server.gettimeout()                                     获取阻塞套接字操作的超时时间


    面向文件的套接字方法: 

      server.fileno()                                     套接字的文件描述符

      server.makefile()                                   创建与套接字相关联的文件对象


     一个TCP客户端的栗子:

    import socket
    host = ''
    port = 9999
    print "[*] Waiting for connection."
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server.bind((host,port))  #bind只有一个参数,不可以写成socket.bind(host,port)
    server.listen(5)
    
    while True:
        tcpConn,addr = server.accept()
        if tcpConn:
            data = tcpConn.recv(1024)
            print "[<]",data
            message = raw_input('[>]')
            tcpConn.send(message)

    TCP客户端的栗子:

    import socket
    target_host = 'tcp服务器地址'
    target_port = 9999
    while True:  
        client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        client .connect((target_host,target_port))
        data = raw_input('[>]')
        if not data:
            break
        client.send("%s" %data)
        message = client.recv(1024)
        if not message:
            break
        print '[<]',data.strip()
        client.close()
  • 相关阅读:
    Oracle11g远程连接配置 visual studio 2003
    窗体设计器的使用套件
    Visual Studio 2003“无法启动调试 没有正确安装调试器“请修复调试器的解决办法
    eclipse maven插件安装教程
    遇到错误ERROR 1044 (42000): Access denied for user ''@'localhost'to database 'mysql',的解决办法
    定位
    盒子模型
    CSS3美化网页元素
    CSS随笔
    前端基础随笔
  • 原文地址:https://www.cnblogs.com/gotoMars/p/9558902.html
Copyright © 2011-2022 走看看