网络编程

程序之间通讯大致可分为两种:
CS  应用类:QQ,微信,优酷
BS  web,浏览器:谷歌,火狐,百度,知乎等

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一个组接口。
在设计在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,
对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

其实站在你的角度看,Socket就是一个模块,我们通过调用模块中已经实现的方法建立两个进程之间的连接和通信。
也有人将Socket说成IP+Port,因为IP是用来标识互联网中的一台主机的位置,而Port是用来标识这台机器上的一个应用程序,
所以我们只要确立了IP和Port就能找到一个应用程序,并且使用Socket模块来与之通信。

TCP是基于链接的,必须先启动服务端,然后在启动客户端去链接服务端
import socket
server = socket.socket()    创建socket连接
server.bind(('192.168.1.77',8001))  绑定IP和端口到套接字
server.listen(5)        监听数量
conn,addr = server.accept()  阻塞状态,等待客户端来连接,conn是客户端和服务端连接的对象(相当于介质),服务器以后要通过该对象进行收发数据,addr客户端地址信息
data = conn.recv(1024)    通过对象获取消息
print(data)
conn.send(b'hello')

conn.close()    关闭连接对象
server.close()    关闭服务

import socket
client = socket.socket()
client.connect(('192.168.1.77',8001))

client.send(b'hellooo')  发送

data = client.recv(1024)
print(data)
client.close()


UDP是无链接的,启动服务之后可以直接接收消息,不需要提前建立连接


粘包
什么是粘包
只有TCP有粘包现象,udp永远不会粘包
粘包不一定会发生
如果发生了:1可能是在客户端已经粘了
      2客户端没有粘,可能实在服务单粘了
情况一:发送方的缓存机制
发送端需要等缓存区满才发送出去,造成粘包 (发送数据时间间隔很短,数据很小,会合到一起,产生粘包)
情况二:接收方缓存机制
接收方不及时接受缓存区的包,,造成多个包接受(客户单发送了一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓存区拿上次一流的数据,产生粘包)

server
import struct
构建报头
header_pack = struct.pack("i",len(stdout))
发送报头
conn.send(header_pack)
发送数据
conn.send(stdout)

client
header_pack = client.recv(4)
data_length = struct.unpack("i",header_pack)[0]

recv_data_length = 0
recv_data = b""
while recv_data_length < data_length:
  data = client.recv(1024)
  recv_data_length += len(data)
  recv_dara += data
print(recv_data.decode("gbk"))






  

 

posted @ 2019-06-21 23:44  凛凛七  阅读(100)  评论(0编辑  收藏  举报