socket是通信协议吗,socket协议采用什么通讯
Python内置模块socket模块解决了基于tcp和ucp协议的网络传输。
(1)基于udp协议的网络传输示例1)服务器端:
ImportSocketsk=socket . socket(type=socket . sockdgram)声明udp协议sk.bind ( 127.0.0.1 ,9090))可以由任何人发送。我会在网上接你。而True: msg,addr=sk.recvfrom(1024)接收信息,最多1024字节#服务器肯定会先接收客户端地址。因为不知道地址,不知道把print(addr), 127.0.0.1 63045)报文发给谁,也不知道对方的端口print (msg.decode) (utf8)。
importsocketsk=socket . socket(type=socket . sockdgram)while True:msg _ send=input))sk . send to)msg 990)
你吃过了吗?天气怎么样?我听说台风明天会来。请做好预防准备。
例()多人同时向服务器发送消息)服务器端:
ImportSocketsk=socket . socket(type=socket . sockdgram)sk . bind( 127 . 0 . 0 . 1 ,9847))地址绑定40m包含鸡翅:%s(033(0m),)哑铃):((033)1;33;4m处描哑铃:%s(033(0m))套色等。当True: msg,addr=sk.recvfrom))从addr msg用户接收的消息,msg=msg.decodecodd
importsocketsk=socket . socket(type=socket . sockdgram)addr=(127 . 0 . 0 . 1),947) user===哑铃追击 while true:send _ msg=input()sk . send to))(%:%)(user,sendmsg) _=sk.recvfrom(1024) #此处变量接受下划线打印(msg.decode),表示此变量无用。
importsocketsk=socket . socket(type=socket . sockdgram)addr=(127 . 0 . 0 . 1),947) user===包含鸡翅 while true:send _ msg=input()sk . send to))(%:%()user,send msg))_=sk . recvfrom(1024)print)msg . decode( UTF8))sk . close .
importtimeimportsocketsk=socket . socket(type=socket . sockdgram)sk . bind((127 . 0 . 0 . 0 . 1),8848))
服务器24小时服务msg,addr=sk . recvfrom(1024)fmt _ time=time . strftime(msg . decode( UTF-8 ))sk . send to(fmt _ time . encode( UTF-8 ),addr) sk.close()客户端
导入socket sk=socket . socket(type=socket。SOCK _ DGRAM)sk . send to( % Y-% M-% d % H:% M:% S 。encode(utf-8 ),( 127.0.0.1 ,8848))msg,_=sk . recvfrom(1024)print(msg . decode( UTF-8 )#运行结果:2018-09-14 21:28:09sk.close()二基于tcp协议的网络传输示例1一个终端与两个程序通信(基于tcp)普通会话步骤
服务器:(先启动)1在服务器端创建一个对象。相当于前台,总机。您可以接收来自许多客户端的请求,sk=socket.socket()
绑定本地环回地址和端口,让别人能找到我,因为很多端口都被占用了。将卡安装到新手机中。Sk.bind (127.0.0.1 ,9000) #借用操作系统的一个端口
3 boot sk.listen() #执行完这句话,我成功启动了一个服务器,服务器通过ip和端口识别。当其他人连接到我时,会触发我的accept方法。
4等电话。如果有人打电话来,就会显示conn,(打电话给我接收的链接)addr(对方的地址)。这个方法将
屏蔽和输入法一样,会等到别人来接我,
不然我连上就没人下去了。得到康恩的链接和地址。而且大部分时间都是conn,所以所有的电话都是基于conn的,
比如conn.send(字节型),向对方conn.recv(数字型)发送和接收信息,最多可以接受1024字节的数据。如果对面超过1024字节,我只接受1024字节。
Msg=conn.recv(数字)然后打印等等。Conn.close()表示与之前客户端的连接已经断开,sk.close()表示服务已经关闭。在正常情况下,服务器端
它不应该被轻易关闭,
5当你得到连接时你可以说话,拿着链接发送信息。conn.send(bhello) #在网络上只能传输字节,不能传输字符串。
5开机后和使用后关闭。关闭返回到系统。
客户端:1如果想给别人打电话,需要购买手机sk=socket.socket()
如果你想给别人打电话,你不需要有卡。输入别人的链接,连接他。Sk.connect ((127.0.0.1 ,9000)) #服务器的ip地址和服务器端口
3使用sk接收消息并打印。msg=sk.recv(1024)
Tcp协议
示例2基于Tcp协议的文件传输
Tcp文件传输
示例代码
终端服务器
osimportsocket=socket . socket()sk . bind(( 127 . 0 . 0 . 1 ,8461)) sk.listen () conn,addr=sk.accept () #前面的例程是一样的。建一个服务器,等人用我的file_path=rC:\:连接我。Users\TR\Desktop\python.mp4 #要传输的文件路径filename=OS . path . basename(file _ path)#获取路径的最后一个名称,以便存储conn . send(filename . encode( UTF-*))#文件名file _ size=OS . path . getsize(file _ path)#获取文件大小with open(file_path,Rb) as f: #视频文件以字节模式打开而file_size: #定义独立参数file _ size content=f . read(1024)# reads 1024 光标会自动跳转到最后读取的file_size -=len(content) #每个周期的自变量减去读取的大小conn.send(content) #读取多少就发送多少,直到file_size为0conn.close() #在周期结束时关闭与此ip地址的链接sk.close()客户端。
osimportsocket=socket . socket()sk . connect(( 127 . 0 . 0 . 1 ,8461)) #固定格式,服务器filename=sk.recv(1024) #接收发送的filename=filename . decode( UTF-8 )#用open(filename,Wb) as f对文件名进行解码:#写入模式将创建一个新文件或用true时的同名文件覆盖现有文件:content=sk。recv (1024) #不断从服务器接收信息if content: #如果接收的字节不为空f.write(content) #写入文件else: breaksk.close()。三种tcp协议中的包粘连现象
数据短。
短时间间隔
拆包现象
大数据会被拆分。
不会同时发生在彼此身上。
对方在接受的时候很可能无法一次性接收到所有信息。
那么未完成的信息很可能会粘在后面的信息上。
数据包粘连只发生在tcp协议中。
tcp的传输是流式传输。
每一条信息和信息之间都没有边界。
udp协议中不会发生数据包粘连。
适合发送短数据。
不建议发送太长的数据。
会增加你数据丢失的几率(因为他扔出去了,没有回应,不管有没有那个地址)
粘性包将出现在程序中:
发送和接收数据之间的界限不清晰(清晰的界限)
不知道要接收的数据长度(告诉接收方这个内容的长度是多少)。
import socket sk=socket . socket()sk . bind(( 127 . 0 . 0 . 1 ,9090))sk.listen()conn,addr=sk . accept()conn . send(b hello )conn . send(b world )conn . close()sk . close import socket sk=socket . socket()sk . connect(( 127 . 0 . 0 . 1 ,990)) ret=sk。recv (1024) print (len (ret),ret) # 2b he # ret1=sk。recv(5)# print(ret 1)# b llowo TCP属于流式传输,sk.close()没有分离边界,解决了包卡住现象。
终端服务器
import struct import socket sk=socket . socket()sk . bind(( 127 . 0 . 0 . 1 ,9090))sk.listen()conn,Addr=sk . accept()while true:s=input( )。encode (utf-8) #参数中的默认编码方法是utf-8,它以字节格式返回obj。编码和解码是字节和unicode之间的转换,python中的字符串是unicode。转换成utf-8格式的bytes type pack _ num=struct . pack( I ,len (s)) #使用struct,以便从数字上保证转换后的字节只占用4个字节,然后发送方发送这个字节数据。接收器接收的前4个字节是要传输的文件大小,conn.send (pack _ num) conn.send (s
import socketimport struct sk=socket . socket()sk . connect(( 127 . 0 . 0 . 1 ,9090))while True:pack _ num=sk . recv(4)num=struct . unpack( I ,pack _ num)[0]ret=sk . recv(num)print(ret . decode( utf-8 ))sk . close()
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。