网络编程
Posted blue-tea
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络编程相关的知识,希望对你有一定的参考价值。
1.socket模块
两个在网络上的程序通过一个双向的通信连接,实现数据的交换,此连接的一端称为一个socket
socket.socket( ) 的两种类型:
socket.socket( ) ,括号里面不写,默认为是TCP套接字类型。
socket.socket(type=socket.SOCK_DGRAM) 为UDP套接字类型。
基于TCP的套接字
服务端
1 ss = socket() #创建服务器套接字 2 ss.bind(address) #把地址绑定到套接字,常以元(host,port)的形式表示地址。 3 ss.listen() #监听链接, 括号内的数字表示允许连接的最大数量 4 cs = ss.accept() #接受客户端链接,返回值是一对(conn,adress)#阻塞 5 cs.recv()/cs.send() #对话(接收与发送) 6 cs.close() #关闭客户端套接字 7 ss.close() #关闭服务器套接字(可选)
基于UDP的套接字
服务端
1 ss = socket() #创建一个服务器的套接字 2 ss.bind() #绑定服务器套接字 3 inf_loop: #服务器无限循环 4 cs = ss.recvfrom()/ss.sendto() # 对话(接收与发送) 5 ss.close() # 关闭服务器套接字
客户端
1 cs = socket() # 创建客户套接字 2 comm_loop: # 通讯循环 3 cs.sendto()/cs.recvfrom() # 对话(发送/接收) 4 cs.close() # 关闭客户套接字
2.粘包
只有TCP有粘包现象,UDP永远不会粘包。
粘包问题主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的。
两种情况下会发生粘包。
1).发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据了很小,会合到一起,产生粘包)。
2).接收方不及时接收缓冲区的包,造成多个包接收(客户端发送了一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次遗留的数据,产生粘包)
解决方法:为字节流加上自定义固定长度报头,报头中包含字节流长度,然后一次send到对端,对端在接收时,先从缓存中取出定长的报头,然后再取真实数据。
3.struct模块
该模块可以把一个类型,如数字,转成固定长度的bytes。
我们可以把报头做成字典,字典里包含将要发送的真实数据的详细信息,然后json序列化,然后用struck将序列化后的数据长度打包成4个字节(4个自己足够用了)
发送时:
先发报头长度
再编码报头内容然后发送
最后发真实内容
接收时:
先手报头长度,用struct取出来
根据取出的长度收取报头内容,然后解码,反序列化
从反序列化的结果中取出待取数据的详细信息,然后去取真实的数据内容。
4.TCP协议和UDP协议
TCP(可看为打电话):可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信、面向字节流。使用TCP的应用:Web浏览器;电子邮件、文件传输程序。
UDP(可看为发短信):不可靠的、无连接的服务,传输效率高(发送前时延小),可多对多、面向报文,尽最大努力服务,无拥塞控制。使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)。UDP通信
数据报协议(自带报头),没有双向通道 通信类似于发短信。
udp协议客户端允许发空;udp协议不会粘包;udp协议支持并发;udp协议服务端不存在的情况下,客户端照样不会报错。
5.异常处理
什么是异常?
程序在运行过程中出现了不可预知的错误,并且该错误没有对应的处理机制,那么就会以异常的形式表现出来,造成的影响就是整个程序无法再正常运行。
异常处理的结构分成三种。
1.异常的类型。2.异常的信息。3.异常的位置
常见的错误类型
1 NAMERROR #名字错误 2 SyntaxError #语法错误 3 KeyError #键不存在 4 ValueError # 值错误 5 IndexError #索引错误
异常的种类
1).语法错误
是你程序立刻就能解决的,这种错误是不能被容忍的,语法上的错误 发现之后应该立刻解决。
2).逻辑错误
这种错是可以被容忍的 因为一眼看不出来,针对逻辑上的错误 可以采用异常处理机制进行捕获
以上是关于网络编程的主要内容,如果未能解决你的问题,请参考以下文章