一、服务器
1.创建服务器的套接字,绑定服务器的地址接口
2.进行服务器的监听
3.使用select模块的方法对指定的文件描述符进行监听。
开始:select有三个参数,等待输入,输出和错误的文件描述符,我们把服务器 的套接字加到inputs列表,把inputs列表给select,select对inputs中的套接字进行监听
结果:当select监听到有输入的时候,就会返回一个元组,元组的内容就是三个参数中已经准备号的文件描述符。当有新连接来的时候会返回服务器本身的文件描述符,当是客户端传送数据的时候会返回客户端的文件描述符
4.判断是否是新连接
是 的话则把客户端的套接字添加到inputs中,让select进行监听
否 的话那么是客户端传数据来了
5.获取数据,判断是否有数据
有数据的话,则打印这个数据 并且传送数据给客户端
没有数据的话则说明连接已经断开,把这个客户端的套接字从inputs中移出去
import socket,select
s=socket.socket()
host=socket.gethostname() #获得本机的主机名
port=1234 #端口
s.bind((host,port)) #绑定套接字接口地址
s.listen(5) #开始服务器的监听
print(s) #服务器的套接字地址
inputs=[s]
while True:
rs,ws,es=select.select(inputs,[],[]) # select方法是对指定的文件描述符进行监视,并在文件描述符集改变的时候做出响应,三个必选参数
#等待输入、输出和错误的文件描述符
print('这是监听输入打印结果:',rs)
for r in rs: #select方法返回一个有3个列表值组成的元组,即为前3个参数中已经准备好的文件描述符
if r is s: #如果返回的输入列表的值是服务器的值,说明有新连接进来
c,addr=s.accept() #服务器端使用accept开始连接客户端
print(c,'---',addr) #返回的是客户端的套接字和客户端的地址
print('Get connection from ',addr)
inputs.append(c) #把新连接到的这个客户端的套接字接口地址加到select监听的等待输入列表中,等待客户端传送数据
else: #说明是客户端在传送数据
try:
data=r.recv(1024) #接收客户端的数据
disconnected = not data
if disconnected: #如果没有数据,说明客户端已经断开连接了
print(r.getpeername(),'disconnected') #r.getpeername()是获取连接的客户端的接口地址
inputs.remove(r) #把这个客户端从select监听的输入列表中移除
else:
print(data) #如果有数据过来的话,打印这个数据
datas=bytes(input('请输入服务器要返回给客户端的数据:'),encoding='utf-8')
r.send(datas)
except Exception:
inputs.remove(r) #报出异常的话也删除这个客户端连接
二、客户端
1.创建套接字
2.连接服务器,需要提供服务器的地址接口
3.传送数据
4.接收数据
5.关闭客户端
from socket import socket
from socket import gethostname
Host=gethostname() #获取服务器的主机,因为我是在本机运行的,所以可以用这个
port=1234
ADDR=(Host,port)
s=socket()
s.connect(ADDR)
while True:
data=bytes(input('请输入你要传给服务器的内容:'),encoding='utf-8') #python3.x已经删除了raw_input
if not data:
break
s.send(data) # send只能传送bytes的数据
print(s.recv(1024))
s.close()
三、运行
1.先运行服务器
2.运行客户端
3.输入要发送给服务器的内容
4.输入要返回给客户端的内容
服务器
客户端:
注意事项:
1.当导入的模块的时候是import socket
那么在创建 套接字的时候就要使用socket.socket()
当导入模块的时候是from socket import socket
那么在创建套接字的时候要使用socket()