Python学习---Socket编程

雷亚荣

关注

阅读 75

2022-02-21

Python学习---Socket编程


1.1. ​Socket -服务端/客户端编程

   应用程序两端通过“套接字”向网络发出请求或者应答网络请求。可以把socket理解为通信的把手(hand),是一个接口,封装了大量方法

   socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。socket的英文原义是“插槽”或“插座”,就像我们家里座机一样,如果没有网线的那个插口,电话是无法通信的。Socket是实现TCP,UDP协议的接口,便于使用TCP,UDP。

注意:​Socket不能发送为空的字符[直接回车]

Python学习---Socket编程_客户端​​

Python学习---Socket编程_服务端_02​​


1.2 单人聊天

服务器端:

# 服务端
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()

1.3 多人聊天

Server:

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:

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





作者:​​小a玖拾柒​​​ ​

-------------------------------------------

个性签名: 所有的事情到最後都是好的,如果不好,那說明事情還沒有到最後~

本文版权归作者【​​小a玖拾柒​​​】,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利!



精彩评论(0)

0 0 举报