网络编程
-
Linux:Centos、
- 服务器:服务别人
-
网:到处连接
-
服务器开发:运维
- 游戏服务器,DOTA2 保存玩家的饰品记录
- 邮件服务器
- 视频服务器:youtube,B站
-
服务器:需要被别人连接
-
1:联网
-
2:找别人,别人地址
- IP:192.168.1.104 唯一 #IPV4
- 255.255.255.255
- 客户端没有必要用这个公网IP
- fe80::d435:5cce:10a3:191f%19
- 端口:电脑的大门,操作系统虚拟化出来的
- IP:192.168.1.104 唯一 #IPV4
-
服务端:等待别人连接,上门,服务他们
- 大家都知道的地址,唯一的,告诉大家
- IP:PORT 一定要告诉大家,率先定义好
-
客户端:连接服务器,索取资源的
- IP:可以是任意的
- PORT:可能是操作系统,网络算法随机使用的
-
网络环境错综复杂
- 连接不到别人
- 地址不存在(不用再走了)
- 你可以找到,但是别人不让你进(尝试)
- 走到半路丢了(尝试再走)
-
公网IP:大家可以通过这个数字字符串,绝对找到你
-
局域网:只在当前网络下生效
- 子网掩码
- 网段
- 网关
-
TCP:网络中传输数据的协议,打电话
- 解决了我可能在网络中找不到别人(数据无法传输到)
- 1:保证数据传输的稳定性,可靠性
- 2:保证数据的安全性,完整性
- 3:对方要有响应
- 尝试重新发送
- A,B,C
- A,B,C
- A,B,C:为了数据顺序,进行数据重组
- A,C:AC直接回去
- 三次握手:连接
- 四次挥手:断开
- TIMEWAIT:连接中止请求发起之后,并且得到了确认,不会真正断开,还会在等待
- 2MSL
- PORT:0~65535
- Web服务:80
- 邮箱服务:556
- 0~1024 不能你用的
- 套接字:socket
- IP:PORT,有协议加持
-
UDP:传输数据的协议
- 不可靠的
- 只管发
- 效率非常高,视频流:UDP协议
- QQ聊天
-
套接字:绑定了IP属性,协议属性变量
-
import socket s = socket.socket(IP是啥,协议是啥) socket.AF_INET ipv4的 socket.AF_INET6 ipv6的 socket.SOCK_STREAM TCP协议的 流 socket.SOCK_DGRAM UDP协议的 报文
-
s.bind( (ip,port) ) #绑定可用IP和端口 ip可以是一个空字符串,代表所有可用IP 公网IP 47.98.190.149 私网IP 172.16.253.97 本地回环 127.0.0.1 虚拟机
-
s.listen(5) # 服务器开启监听 #参数:连接等待个数
-
c,addr = s.accept() # 阻塞 等待别人连接 c:套接字 addr:来访者IP和端口的元组
-
c.recv(1024) 参数:你一次性拿取对方传递来的多少数据,字节单位 c.send(data.encode()) data: 编码过后的字符串对象 (二进制)
-
s.close() c.close() #关闭套接字
-
c.connect( (ip,port) ) #通过IP和端口的元组连接服务器
-
文件描述符:
- 一个操作系统,一个服务器可以打开的文件个数有限的
- 我能构成的连接也是有限的
- DDOS:大规模建立连接 TCP连接
- 让你无法和别人连接 WEB
-
阻塞:只要我进去了,别人别想进厕所,一直等到我上完厕所
-
非阻塞:出来了,真的啥时候想上厕所我在上
-
打饭:
- 阻塞:一直等着
- 非阻塞:先做别的,不停的回来看
-
Vmware centos
-
Atom:写Linux上的代码
实例
- 服务器代码
import socket
ip = '' #IPV4
port = 8000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind( (ip,port) ) #绑定可用IP和端口
s.listen(5)
print('服务器开启...')
#服务别人
while True:
try:
c,addr = s.accept() #阻塞 就等了 没有人连接我,下面的代码不能执行
# print(addr) #客户端的来访IP和端口元组
# print(c)
while True:
#具体的服务这个c
data = c.recv(1024) #接收客户端的数据
if data:
print('[%s]:%s' % (addr,data.decode('utf-8')))
msg = input('>>> ')
c.send(msg.encode('utf-8')) #向客户端返回数据
else:
c.close()
break
except KeyboardInterrupt:
s.close()
break
print('服务器关闭')
#OSError: [Errno 98] Address already in use 立即释放
- 客户端代码
import socket
ip = '47.98.190.149' #IPV4
port = 8000
c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
c.connect( (ip,port) )
while True:
try:
msg = input('>>> ')
c.send(msg.encode('utf-8')) #向服务端发送数据
data = c.recv(1024)
if data:
print('[服务器]:',data.decode('utf-8'))
else:
print('服务端关闭')
c.close()
break
except KeyboardInterrupt: #ctrl + c
c.close()
break
#UE: 对比差异
#GUI编程
#UE: 对比差异
#GUI编程