|
|
发表于 2018-3-6 23:05:58
|
显示全部楼层
- # -*- coding: utf-8 -*-
- from socket import *
- s = socket(AF_INET, SOCK_STREAM, 0)
- #参数一:地址簇
- # AF_INET IPv4(默认)
- # AF_INET6 IPv6
- # AF_UNIX 只能够用于单一的Unix系统进程间通信
- #参数二:类型
- # SOCK_STREAM 流式socket , for TCP (默认)
- # SOCK_DGRAM 数据报式socket , for UDP
- # SOCK_RAW 原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;
- # 其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL
- # 套接字选项由用户构造IP头。
- # SOCK_RDM 是一种可靠的UDP形式,即保证交付数据报但不保证顺序。
- # SOCK_RAM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文。
- # SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。
- # SOCK_SEQPACKET 可靠的连续数据包服务
- #参数三:协议
- # 0(默认)与特定的地址家族相关的协议,如果是 0 ,则系统就会根据地址格式和套接类别,
- # 自动选择一个合适的协议
- s.bind(('', 6666)) #注意里面是tuple
- # 用法详解
- # s.bind(address) 将套接字绑定到地址。address地址的格式取决于地址族。
- # 在AF_INET下,以元组(host, port)的形式表示地址。host空代表本机,后面端口号6666是通讯端口
- s.listen(1)
- # 用法详解
- # s.listen(backlog)开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。
- # backlog等于5,表示内核已经接到了连接请求,但服务器还没有调用accept进行处理的连接个数
- # 最大为5,这个值不能无限大,因为要在内核中维护连接队列
- sock, addr = s.accept() #类似raw_input,需要等待输入,变量名无所谓,我个人觉得用sock好理解
- # 接受连接并返回(conn, address),其中conn是新的套接字对象,可以用来接收和发送数据。
- # address是连接客户端的地址。接收TCP 客户的连接(阻塞式)等待连接的到来。
- print('Connected by ', addr) #看下连接过来的IP地址
- sock.send('Welcome!!!aaabbbccc')
- #注:sock.send(string[, flag])
- # 将string中的数据发送到连接的套接字。返回值是要发送的字节数量,
- # 该数量可能小于string的字节大小。即:可能未将指定内容全部发送。
- text = sock.recv(1024) #获取客户端数据
- #注:sock.recv(bufsize[,flag])
- # 接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。
- # flag提供有关消息的其他信息,通常可以忽略。
- print(text) #打印获得的数据
- sock.close()
- s.close() #关闭相应的socket
复制代码 |
|