一. IP地址
ip是可联网设备在网络中的逻辑地址,在同一网络中是唯一的
1、IP地址作用:
用来在网络中标记某个设备
2、查看ip地址:
ifconfig/ipconfig查看网卡信息
3、测试连通性:ping 域名/IP地址
4、IP地址分类:(了解)
192.168.xxx.xxx 私有ip
127.0.0.1 环回地址(本机ip地址)
二. 端口 port
1、作用
端口是传输数据的通道,好比教室的门,是数据传输必经之路
端口号用来标识主机中的网络进程
2、端口号范围和知名端口
端口号范围:0-65535
知名端口范围:0-1023
知名端口列举:
80 HTTP服务
21 FTP服务
23 telnet服务
22 ssh服务
443 HTTPS服务
三、socket套接字
1、不同电脑上进程通信如何标识
IP地址+端口号
2、socket是什么
socket是进程间通信的一种方式,简称套接字
3、socket的作用
使用socket套接字来完成进程间的通信
四、TCP介绍
TCP 即传输控制协议,它是一种面向连接的、可靠的、基于字节流的传输层通信协议。
TCP特点:
1、面向连接
在通信之前需要先创建连接,通信完成后,再断开连接
2、可靠传输
TCP 采用发送应答机制
超时重传
错误校验
流量控制和阻塞管理
五、TCP客户端程序的开发流程
1、创建tcp套接字
2、跟服务器建立链接
3、发送数据
3.1、发送数据
3.2、接收数据
4、关闭tcp套接字
六、TCP服务端
1、实现流程(列举生活中例子)
生活中如何使用手机?
1、买手机 ------------>(创建一个tcp_server_socket服务端对象 )
2、插入手机卡、使手机有电话号码 ------------>(绑定端口)
3、把手机设置为接听状态 ------------> (tcp_server_socket.listen())
4、等着别人打电话 ------------> (new_socket, client_address = tcp_server_socket.accept())
5、通话聊天(收发数据) ------------> ( .recv() .send())
6、挂断电话 ------------> (new_socket.close())
7、晚上11点睡觉,关机 ------------> (tcp_server_socket.close())
2、具体实现流程
1、创建tcp服务端套接字
2、绑定端口
3、设置套接字对象为被动监听状态,因为默认是主动的
4、阻塞等待接收客户端的连接
5、收发数据
6、关闭新创建出来的套接字
7、关闭tcp服务端套接字
3、tcp服务器如何循环接收一个客户端消息?
while True:
# 5、收发数据
recv_data = new_socket.recv(1024)
print("接收到来自%s的消息:%s" % (addr, recv_data.decode("gbk")))
new_socket.send("收到了你的消息".encode())
4、tcp服务器如何循环为多个客户端提供服务?
5、recv返回值的含义
正常情况下 在通信过程中recv函数的返回值就是 接收到的数据
如果客户端先断开了TCP连接,那么recv()将会解阻塞,接收到一个0字节数据
七、 OSError: [Errno 98] Address already in use产生原因和解决办法
1、产生时机
pycharm运行tcp服务端,已经有客户端连接的情况下,服务器先断开连接, 之后马上重启服务器
2、产生原因
现象:
pycharm后台会继续让程序再执行一会(端口会被占用多一些时间)
原因:
TCP协议规定 - 2MSL时间(1-4min, 实际一般30s到2min) 内主动断开连接的一方 不能重新绑定 刚刚使用的端口
3、怎么解决: 在绑定端口之前设置套接字重用地址选项
设置套接字选项的目的:
忽略2MSL时间限制 可以立即重新绑定 刚刚使用的端口
设置套接字选项 set socket option 针对套接字设置选项 重用地址选项 1设置 0取消
socket.SOL_SOCKET表示当前套接字
socket.SO_REUSEADDR表示重用地址选项
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)