1.Tcp/Ip 协议:互联网通讯协议,互联网可依据此协议规范进行通讯
TCP协议:(打电话)面向连接,安全可靠
UDP协议:(发短信)
ip协议(门牌号:ip地址) TCP/UDP(收件人:端口号)
2.通讯流程:
3.socket模块:python通过socket模块实现互联网通讯,是一个接口,封装了TCP/ip通讯的模块
4.一次通讯socket代码
服务端代码的实现:同步:
import socket
host = '127.0.0.1'
port = 9009
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(8)
conn, addr = s.accept()
print('连接的客户端主机地址为: % s' % str(addr))
text = conn.recv(1024)
print('接受客户端发来的消息为 % s' % text.decode('utf-8'))
content = input('请输入您要返回给客户端的信息:')
conn.sendall(content.encode('utf-8'))
conn.close()
s.close()
客户端代码: 参数一:基于ipv4协议的tcp和udp;参数二:流套接字,数据报文套接字
import socket
host = '127.0.0.1'
port = 9009
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
text = input('请输入发送给服务器的内容:')
s.send(text.encode('utf-8'))
content = s.recv(1024)
print(content.decode('utf-8'))
s.close()
5.建立多次连接的交互通讯(半双工聊天)
服务端程序: Python socket半双工聊天
import socket
host = '127.0.0.1'
port = 9008
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(8)
while 1:
conn, addr = s.accept()
print(conn, addr)
while 1:
text = conn.recv(1024)
if len(text.strip()) == 0:
print('接受到客户端发来的数据为空')
else:
print('接受到客户端发来的数据为%s' % text.decode('utf-8'))
print('服务器接受到的数据为:%s' % text.decode('utf-8'))
content = input('请输入要发送给客户端的数据:')
conn.send(content.encode('utf-8'))
print('\n')
conn.close() # 和while对其
s.close()
对于第二个while循环来说服务端不断从连接的客户端接受数据,如果没有客户端连接
过来,会一直处于等待状态
对于第一个while循环来说,是服务端不断等待客户端的连接
客户端的代码:
import socket
host = '127.0.0.1'
port = 9008 # 端口号保持相同
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
while 1:
content = input('请输入您要发给服务端的信息:')
s.sendall(content.encode('utf-8'))
text = s.recv(1024)
print('接受服务器发来的信息为 % s' % text.decode('utf-8'))
print('!!!!!!!!!!!!!!!!!!!')
6.分叉多进程技术下的通讯,一个服务端可以接受两个或多个客户端电话(全双工)
服务端代码:
import socketserver
from socketserver import StreamRequestHandler as srh
from time import ctime
host = '127.0.0.1'
port = 9999
addr = (host,port)
class Servers(srh):
def handle(self):
print('连接到服务器的客户端地址为%s' % str(self.client_address))
while True: # (函数内)
date = self.request.recv(1024)
if not date:
break
print('服务端接受到数据为:%s' % date.decode('utf-8'))
print('客户端地址为%s' % self.client_address[0])
content = input('请输入发送给客户端的信息:')
self.request.send(content.encode('utf-8'))
print('服务器端开始运行')
server = socketserver.ThreadingTCPServer(addr, Servers)
server.serve_forever()
客户端代码:
import socket
import time
host = '127.0.0.1'
port = 9999
addr = (host,port)
buff_size= 1024
s= socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(addr)
while 1:
date = input('请输入要发送给服务端的信息:')
if not date or date == 'exit':
break
s.sendall(date.encode('utf-8'))
content = s.recv(buff_size)
if not content:
break
print(content.decode('utf-8'))
s.close()
注意:
recv()无法传输空信息
发短信的,是不是服务器没开,客户端发送的信息就丢失了呢?