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()

 

posted @ 2018-08-30 11:34  三寸碧玉心  阅读(1003)  评论(0编辑  收藏  举报