import socket # 1.建立流式套接字实例 # server = socket.socket() server = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) # 2.使用bind方法绑定端口号。服务端绑定的ip和port(参数是元组) server.bind(("127.0.0.1", 8832)) # 3.调用listen方法监听,并指定最大的链接数量。设置监听套接字,建立监听队列 server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 设置端口重用 server.listen(5) # 4.等待客户端连接 while True: print("正在等待客户端连接...") conn, addr = server.accept() print("client connent...{0}:{1}".format(addr[0], addr[1])) # python3.x以上,网络数据的发送接收都是byte类型,若是发送的数据是str类型的则须要进行编码. conn.send(("链接成功,服务端端口:%s,客户端端口:%s" % (8832, addr[1])).encode()) # 5.收发消息 while True: data = conn.recv(1024) # 接收客户端发来的消息 # if not data or data.decode("utf-8") == "exit": if not data or data == b"exit": break print(data.decode()) conn.send(("服务端返回信息:%s" % data.decode()).encode()) # 处理客户端数据 conn.close() # 主动关闭链接 # 6.关闭套接字 server.close()
知识点1:设置端口重用:server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)。python
知识点2:conn, addr = server.accept()的返回值是一个元组:返回的conn表明一个新的套接字用来和客户端通讯。返回的addr是链接的客户端的地址(也是元组,包含ip与端口)。python3.x
知识点3:发送send()函数,与接收recv()函数,操做的都是字节串。recv()函数是阻塞函数。服务器
知识点4:Socket()函数的参数有三个:网络
import socket # 1.socket实例初始化 # client = socket.socket() client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2.发起链接:根据服务端绑定的ip和端口,进行链接访问服务端 client.connect(("127.0.0.1", 8832)) # 3.与服务端交互,接收发送信息 while True: data = client.recv(1024) # 接收主机信息 print(data.decode()) # 打印接收的数据,此处的byte类型数据特指python3.x以上 msg = input("请输入要发送的信息...") client.send(msg.encode()) if not msg or msg == "exit": break # 4.关闭套接字 client.close()
1.服务端与客户端能够一直通讯,收发消息。直到客户端输入"exit",客户端退出,服务端等待下一个客户端链接。socket
2.当第一个客户端与服务端一直连着的时候,第二个客户端没法与服务器链接。直到第一个客户端退出与服务器的链接,第二个客户端才能与服务器链接。tcp
3.当第一个客户端退出时,服务器会立马链接第二个客户端。第二个客户端以前发的信息,服务器就会收到,并返回信息。可能第二个发送端发的信息都在发送缓冲区里。函数
参考:https://www.liaoxuefeng.com/wiki/1016959663602400/1017788916649408编码