Python学习日记(三十) Socket模块使用
程序员文章站
2022-10-04 12:20:05
Socket(套接字) 套接字是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。 发展:套接字最初是由加利福尼亚大学Berkely分校为Unix系统 ......
socket(套接字)
套接字是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像文件一样的打开、读写和关闭等操作。套接字允许应用程序将i/o插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是ip地址与端口的组合。
发展:套接字最初是由加利福尼亚大学berkely分校为unix系统开发的网络通信接口。后来随着tcp/ip网络的发展,套接字成为最为通用的应用程序接口,也是在internet上进行应用开发最为通用的api.
应用:
实现:
基于tcp协议实现sever端和client端的信息互通
sever端:
import socket sk = socket.socket() #创建服务器的套接字 sk.bind(('127.0.0.1',8080)) #把地址绑定到套接字 sk.listen() #监听链接 conn,addr = sk.accept() #接收到客户端的连接和地址 ret = conn.recv(1024) #接收客户端信息 print(ret) #打印客户端的信息 conn.send(b'hi') #向客户端发送信息 conn.close() #关闭客户端的连接 sk.close() #关闭服务器套接字
client端:
import socket sk = socket.socket() #创建客户端的套接字 sk.connect(('127.0.0.1',8080)) #尝试连接服务器 sk.send(b'hello') #向服务器发送消息 ret = sk.recv(1024) #接收服务器发送的消息 print(ret) #打印服务器发送的消息 sk.close() #关闭客户端的套接字
sever端和client端两边都要对应接收和发送信息,不能只接不收或只收不接且执行时要先执行sever端再去执行client端,执行结果:
当重启服务器时遇到地址已被使用的问题
解决方案:
如何让客户端和服务器能够多次进行对话?
sever端:
import socket from socket import sol_socket,so_reuseaddr sk = socket.socket() #创建服务器的套接字 sk.setsockopt(sol_socket,so_reuseaddr,1) sk.bind(('127.0.0.1',8080)) #把地址绑定到套接字 sk.listen() #监听链接 conn,addr = sk.accept() #接收到客户端的连接和地址 print(addr) #打印客户端的地址 ret = conn.recv(1024) #接收客户端信息 print(ret) #打印客户端的信息 conn.send(b'hi') #向客户端发送信息 print(addr) #打印客户端的地址 ret = conn.recv(1024) #接收客户端信息 print(ret) #打印客户端的信息 conn.send(b'hi') #向客户端发送信息 conn.close() #关闭客户端的连接 sk.close() #关闭服务器套接字
client端:
import socket sk = socket.socket() #创建客户端的套接字 sk.connect(('127.0.0.1',8080)) #尝试连接服务器 sk.send(b'hello') #向服务器发送消息 ret = sk.recv(1024) #接收服务器发送的消息 print(ret) #打印服务器发送的消息 sk.send(b'hello') #向服务器发送消息 ret = sk.recv(1024) #接收服务器发送的消息 print(ret) #打印服务器发送的消息 sk.close() #关闭客户端的套接字
执行结果:
因此我们只要在sever端获取到client端后让它去循环接收和发送消息、让client端在连接上sever端后去循环发送和接收消息就能完成一个一直发送接收消息的过程,但这个过程是一个死循环,我们需要加上一些条件让它更加完善
sever端:
import socket import time from json import dumps from socket import sol_socket,so_reuseaddr sk = socket.socket() #创建服务器的套接字 sk.setsockopt(sol_socket,so_reuseaddr,1) sk.bind(('127.0.0.1',8080)) #把地址绑定到套接字 sk.listen() #监听链接 conn,addr = sk.accept() #接收到客户端的连接和地址 while 1: ret = conn.recv(1024).decode('utf-8') #接收客户端信息 if ret.strip() == 'bye' or ret.strip() == 'bye'.capitalize(): #跳出循环的条件 conn.send(b'bye') #发送bytes类型的bye print('client has disconnected!') break print(time.asctime(time.localtime(time.time())) + ' ' + dumps(addr) + ':' + ret) #格式化打印客户端发来的消息 sendinfo = input(time.asctime(time.localtime(time.time())) + ' <<<') conn.send(sendinfo.encode('utf-8')) #向客户端发送信息 conn.close() #关闭客户端的连接 sk.close() #关闭服务器套接字
client端:
import socket import time sk = socket.socket() #创建客户端的套接字 sk.connect(('127.0.0.1',8080)) #尝试连接服务器 while 1: sendinfo = input(time.asctime(time.localtime(time.time())) + ' <<<') sk.send(sendinfo.encode('utf-8')) #向服务器发送消息 ret = sk.recv(1024).decode('utf-8') #接收服务器发送的消息 if ret.strip() == 'bye' or ret.strip() == 'bye'.capitalize(): #跳出循环的条件 sk.send(b'bye') #发送bytes类型的bye print('sever has disconnected!') break print(time.asctime(time.localtime(time.time())) + ' ["127.0.0.1", 8080]:' + ret)#格式化打印服务器发来的消息 sk.close() #关闭客户端的套接字
执行结果:
基于udp协议实现sever端和client端的信息互通
实现简单传递信息
sever端:
import socket sk = socket.socket(type=socket.sock_dgram) #创建服务器套接字 sk.bind(('127.0.0.1',8080)) #绑定服务器套接字 msg,addr = sk.recvfrom(1024) #接收到客户端的信息和地址 print(msg.decode('utf-8')) #将客户端传递来的信息解码并打印出来 sk.sendto(b'hello client!',addr) #将bytes类型的信息发送到客户端的地址 sk.close() #关闭服务器套接字
client端:
import socket sk = socket.socket(type=socket.sock_dgram) #创建客户端套接字 ip_port = ('127.0.0.1',8080) sk.sendto(b'hello sever!',ip_port) #客户端发送信息 ret,addr = sk.recvfrom(1024) #接收到服务器的地址和信息 print(ret.decode('utf-8')) #打印收到的信息 sk.close() #关闭客户端套接字
执行结果:
......
下一篇: QA:无重复字符的最长子串
推荐阅读
-
Python学习日记(三十二) hmac检验客户端的合法性和socketsever模块
-
Python使用socket模块实现简单tcp通信
-
Python中关于模块的使用和学习讲解
-
Python学习日记(三十) Socket模块使用
-
Python学习之time模块的基本使用
-
Python学习日记(十七) os模块和sys模块
-
Python学习日记(十八) 序列化模块
-
python基础学习(十六)——超详细!pickle模块的使用(pickle.dump()和pickle.load())
-
(七) 学习笔记: python文件操作pickle模块使用和时间模块
-
Python学习日记(十四) 正则表达式和re模块