1、TCP/IP协议包括TCP和UDP协议两种
1)TCP协议类似打电话,传输可靠,但是暂用资源
TCP Socket通信:
TCP Socket通信过程:(一般情况下图形界面程序需要使用多线程,让其中一个线程等待/监听客户端请求,其他线程处理别的任务)
这个Socket通信和TCP的三次握手、四挥手是一码事吗?
1-1)python提供了两个socket模块:socket和socketserver(socketserver是面向socket 服务器端的开发)
一个简单的聊天工具示例:
新建一个server.py编写socket服务器端的程序:
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建socket,AF_INET代表ipv4,SOCK_STREAM代表TCP连接
s.bind(('',8888)) #‘’代表绑定本机ip的8888端口
s.listen(10) #监听8888端口,最大连接数10
print('服务器端启动。。。')
#等待客服端的请求
conn,address=s.accept() #socket.accept()等待客服端的请求,等待成功返回(conn,address)conn是新的socket对象,用来发送接受消息
#客户端连接成功
print(address)
#开始通信
data=conn.recv(1024)
print('从客户端接受到的数据:{0}'.format(data.decode()))
#给客户端发送数据
conn.send('你好'.encode()) #'你好'.encode(),使用b'你好'会报错,因为bytes can only contain ASCII literal characters
#释放资源
s.close()
接着建立一个client.py编写socket客服端的程序:服务器端启动。。。
然后就开始等待了,当运行了client.py后,
server.py的控制台输出:
服务器端启动。。。
('127.0.0.1', 53784)
从客户端接受到的数据:hello
client.py控制台输出:
连接建立
从服务器端接收消息:你好
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#连接服务器
s.connect(('127.0.0.1',8888))
print('连接建立')
#给服务器发送消息
s.send(b'hello')
#从服务器接受数据
data=s.recv(1024)
print('从服务器端接收消息:{0}'.format((data.decode())))
#释放资源
s.close()
运行程序的时候先运行server.py,运行之后可以看到控制台输出:
一个上传文件的示列:
服务端:
# coding=utf-8
# 代码文件:chapter18/18.2.5/upload-server.py
import socket
HOST = ''
PORT = 8888
f_name = 'coco2dxcplus_copy.jpg'
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen(10)
print('服务器启动...')
while True: #这个循环会让服务端一直处于监听状态
with s.accept()[0] as conn:
# 创建字节序列对象列表,作为接收数据的缓冲区
buffer = []
while True: # 反复接收数据
data = conn.recv(1024)
if data:
# 接收的数据添加到缓冲区
buffer.append(data)
else:
# 没有接收到数据则退出
break
# 将接收的字节序列对象列表合并为一个字节序列对象
b = bytes().join(buffer)
with open(f_name, 'wb') as f:
f.write(b)
print('服务器接收完成。')
客服端:
coding=utf-8
# 代码文件:chapter18/18.2.5/upload-client.py
import socket
HOST = '127.0.0.1'
PORT = 8888
f_name = 'coco2dxcplus.jpg'
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
with open(f_name, 'rb') as f:
b = f.read()
s.sendall(b)
print('客户端上传数据完成。')
运行完成后复制了一张一样的图片,并且因为服务端一直在监听,没有断开,只要客户端运行一次服务端就会复制一张
2)UDP协议类似书面信件