应用程序两端经过“套接字”向网络发出请求或者应答网络请求。能够把socket理解为通讯的把手(hand),是一个接口,封装了大量方法html
socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在创建链接打开后,能够向本身文件写入内容供对方读取或者读取对方内容,通信结束时关闭文件。socket的英文原义是“插槽”或“插座”,就像咱们家里座机同样,若是没有网线的那个插口,电话是没法通讯的。Socket是实现TCP,UDP协议的接口,便于使用TCP,UDP。java
注意:Socket不能发送为空的字符[直接回车]编程
服务器端:服务器
# 服务端 import socket # family=AF_INET, 表明使用IPV4的IP协议 # type=SOCK_STREAM 表明使用TCP协议进行链接 server = socket.socket() # 建立socket ip_addr = ('127.0.0.1', 9999) # 1024以前的端口,默认是OS使用 server.bind(ip_addr) # 要求必须是一个元组 server.listen(3) # 开始监听传入链接。在拒绝链接以前,能够挂起的最大链接数量。 while True: conn, addr = server.accept() # 接受链接并返回(conn,address) # 其中conn是新的套接字对象[客户端],能够用来接收和发送数据。 # address是链接客户端的地址。 exit_flag = True while exit_flag: print('当前链接对象', addr) # 发送必定要有接收 try: data = conn.recv(1024) print('服务器:', str(data, 'utf-8')) inp = input('>>>:') if inp != 'bye': conn.send(bytes(inp, 'utf-8')) exit_flag = True else: conn.send(bytes(inp, 'utf-8')) exit_flag = False except Exception as e: print('已关闭当前链接对象', addr, '等待链接...') exit_flag = False finally: conn.close() server.close()
客户端:网络
# 客户端 import socket # family=AF_INET, 表明使用IPV4的IP协议 # type=SOCK_STREAM 表明使用TCP协议进行链接 client = socket.socket() ip_addr = ('127.0.0.1', 9999) try: client.connect(ip_addr) exit_flag = True while exit_flag: # 发送必定要有接收 inp = input('>>>:') if inp != 'bye': client.send(bytes(inp, 'utf-8')) exit_flag = True else: client.send(bytes(inp, 'utf-8')) exit_flag = False info = client.recv(1024) # 最大接收1024K数据,# 传送/接收的数据必定是byte类型 print('客户端:', str(info, 'utf-8')) except Exception as e: print('客户端关闭链接', e) finally: client.close()
Server:app
import socket
import select
sk=socket.socket()
sk.bind(("127.0.0.1",8801))
sk.listen(5)
inputs=[sk,]
while True:
r,w,e=select.select(inputs,[],[],5)
print(len(r))
for obj in r:
if obj==sk:
conn,add=obj.accept()
print(conn)
inputs.append(conn)
else:
data_byte=obj.recv(1024)
print(str(data_byte,'utf8'))
inp=input('回答%s号客户>>>'%inputs.index(obj))
obj.sendall(bytes(inp,'utf8'))
print('>>',r)
client:socket
import socket sk=socket.socket() sk.connect(('127.0.0.1',8801)) while True: inp=input(">>>>") sk.sendall(bytes(inp,"utf8")) data=sk.recv(1024) print(str(data,'utf8'))