1. 什么是通信协议
通俗:双方约定沟通的方式,好比大家都用英语沟通,同一种语言的人能沟通,不同语言的人沟通有障碍。
1.1 Internet 互联网
1.2 局域网
1.3 广域网
2. TCP/IP简介(tcp/ip协议不等于 tcp和ip)
2.1 ip协议
Ip地址实际是32位的整数 ipv4,他是以字符串表示ip地址:192.168.58.111实际上把32位分为8位一组。
每一组是0-254。
2.2 TCP 协议
TCP协议就是建立在ip协议之上,TCP负责两台计算机的可靠连接,保证数据包按顺序送达。TCP协议会通过三次握手建立可靠连接:
握手之后对每一个IP包进行编号,确保按顺序接收,如果丢包了,自动重发。
许多更高级的协议都是基于TCP的协议的。
端口:两台计算机都拥有许多程序,每个程序都有自己的端口号,用端口号区分指定的程序。
80端口就是网站端口 ;21端口 是ftp服务器。
2.3 UDP简介
UDP是面向无连接的协议。使用UDP时候无需建立连接,只需要知道对方的ip地址,和端口号就可以。
缺点:数据传输不可靠 优点:传输速度快 QQ就是基于UDP的软件.
3. socket(套接字)简介(通信媒介)
为了让两个程序通过网络通讯,这里要使用socket套接字,Socket英文原意 “孔” “插座”
通常也叫做套接字,用于描述IP地址和端口,它是通信链的一个句柄,可以实现不同虚拟机和计算机间的通讯。每种服务都打开一个socket,并绑定到一个端口上,不同端口对应于不同的服务。
Python中使用socket模块的socket()函数可以完成。
'''
TCP服务端
'''
import socket #导入socket模块
host = '127.0.0.1' #主机ip地址
port = 8088 #端口号
web = socket.socket() #创建socket对象(即利用socket.socket模块实例化对象)
web.bind((host,port)) #绑定端口
web.listen(5) #设置最大连接数,开始TCP监听
print("服务器等待客户端连接")
while True:
conn,addr = web.accept() #建立客户端连接
data = conn.recv(1024) #获取客户端请求数据
print(data.decode('utf-8')) #打印接收到的数据
conn.send(b'HTTP/1.1 200 OK\r\n\r\nHELLO WORLD') #向客户端发送数据
conn.close() #关闭连接
'''
TCP客户端
'''
import socket
s = socket.socket() #创建tcp/ip套接字对象
host = '127.0.0.1' #获取主机ip地址
port =8088 #获取设置的端口号
s.connect((host,port)) #初始化TCP服务连接
send_data = input("请输入消息:") #提示用户输入数据
s.send(send_data.encode()) #发送TCP数据
recvData = s.recv(1024).decode()
print('接收到的数据为:',recvData)
s.close()
基于TCP的聊天室:
chat_server
import socket
host = socket.gethostname()
port = 1111
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((host,port))
s.listen(1)
sock,addr = s.accept()
print("连接已经建立")
info = sock.recv(1024).decode()
while info!='886':
if info:
print("接收内容为:"+info)
send_data = input("请输入发送内容:")
sock.send(send_data.encode())
if send_data == "886":
break
info = sock.recv(1024).decode()
sock.close() #关闭客户端套接字
s.close() #关闭服务器套接字
Chat_client
import socket
host = socket.gethostname() #获取主机地址
port = 1111
s =socket.socket()
s.connect((host,port))
print("已连接")
info = ''
while info != '886':
send_data=input("发送消息:")
s.send(send_data.encode())
if send_data == '886':
break
info =s.recv(1024).decode()
print('接受内容为:'+info)
s.close()