当一台电脑中两个程序进行交互式,可以通过一个文件来交流: 故:同一台机器上的两个程序之间的通讯就需要依赖文件

如图:

 

 

当两台或者多台电脑进行交流时,可以通过交换机来进行交流。 故;两台机器之间的两个程序之间的通讯就需要依赖网络

 

 当不在一台交换机上的两台电脑的交互时,需要用到路由器

 

 交换机 :负责一个网络内的多台机器之间的信息交换
 网卡 :身份证 mac地址 计算机在网络上的身份证
mac地址 :16进制的数 全球唯一
 区域性
ip地址
4位的点分十进制数 IPV4
192.168.10.xxx
 IPV6
6位的点分十进制数
0.0.0.0.0.0 - 255.255.255.255.255.255
 127.0.0.1 :本地回环地址 本机的地址
0.0.0.0 : ip地址的、回环地址的所有的用户都能找到你这台机器
局域网
网关ip 不同局域网之间通信依赖的ip地址
子网掩码 判断两个ip地址是否在同一个网段内
网段
局域网的概念
外网ip 我们谁都能访问
内网ip 从外部不能访问,只能在内部环境中互相访问
外网ip永远不会和内网ip冲突?
端口:
 端口的概念 —— 帮助你找到一个应用
每一个网络服务都会占用计算机上的一个端口
计算机上的端口范围 0-65535
在同一时刻 同一台计算机上 不同的网络应用 占用的端口一定是不同的

osi七层模型
应用层 http、https

传输层 TCP、UDP协议

网络层 ip协议

数据链路层 arp协议

物理层

理解socket

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,

Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用

户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

 

tcp协议与udp协议

 tcp 面向连接的 可靠的 但是慢
tcp协议
两个应用之间要想通信 必须先建立连接
然后基于连接来通信
比较重要的文件 邮件的发送 下载安装包
udp 无连接的 快 能够发送的信息长度是有限的
快 但 不可靠 不能发送过长的数据
即时通讯类的程序

 

 

socket的初始

基于tcp协议的socket的应用

Server段

import socket
sk = socket.socket()     # 初始化一个对象
sk.bind(('127.0.0.1',9000))     # 把地址绑定到socket
sk.listen()                     # 监听链接

conn,addr = sk.accept()         # 接受客户端链接

msg = conn.recv(1024)      # 接受客户端信息
print(msg.decode('utf-8'))  # 打印

conn.send('你好'.encode('utf-8'))  # 向客户端发送信息

conn.close()    # 关闭客户端
sk.close()      # 关闭服务器

 

Client端

import socket
sk = socket.socket()

sk.connect(('127.0.0.1',9000))

sk.send('哈哈'.encode('utf-8'))

msg = sk.recv(1024)
print(msg.decode('utf-8'))
sk.close()
基于UDP协议的socket应用
Server端
import socket
sk = socket.socket(type = socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',9000))

msg,addr = sk.recvfrom(1024)
print(addr,msg.decode('utf-8'))

sk.sendto('再见'.encode('utf-8'),addr)

sk.close()

Client端

import socket
sk = socket.socket(type= socket.SOCK_DGRAM)

sk.sendto('你好'.encode('utf-8'),('127.0.0.1',9000))

msg,addr = sk.recvfrom(1024)
print(addr,msg.decode('utf-8'))

sk.close()

大文件的上传

Server端

import socket
import time

sk = socket.socket()
sk.bind(('127.0.0.1',9000))
sk.listen()

conn,addr = sk.accept()

filename = conn.recv(1024)
print('>>>',filename.decode('utf-8'))
with open(filename,'wb') as f:
    countent = conn.recv(4096)
    f.write(countent)
conn.close()
sk.close()

Client端

import socket
import time
sk = socket.socket()
sk.connect(('127.0.0.1',9000))
sk.send('答案'.encode('utf-8'))
time.sleep(0.1)
with open('D:\骑士计划\第二次测试\答案','rb') as f:
    countent = f.read()
    print('大小>>>',len(countent))
    sk.send(countent)
sk.close()

 大文件的下载

Server端

import os
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',9000))
sk.listen()

conn,addr = sk.accept()
# 先传文件名
file_path =r'D:\Users\Seus.mp4'
filename = os.path.basename(file_path)
conn.send(filename.encode('utf-8'))

# 再传文件
file_size = os.path.getsize(file_path)
with open(file_path,'rb') as f :
    while file_size:
        countent = f.read(1024)
        file_size -= len(countent)
        conn.send(countent)
conn.close()
sk.close()

Client端

import socket
# 下载
sk = socket.socket()
sk.connect(('127.0.0.1',9000))

filename = sk.recv(1024)
filename = filename.decode('utf-8')
print('--->',filename)
with open(filename,'wb') as f :
    while True:
        content = sk.recv(1024)
        if content:
            f.write(content)
        else:
            break
sk.close()

 时间的更新

Server端

import time
import socket

sk = socket.socket(type= socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',9001))

while True:
    msg,addr = sk.recvfrom(1024)
    fmt_time = time.strftime(msg.decode('utf-8'))
    sk.sendto(fmt_time.encode('utf-8'),addr)
sk.close()

# fmt_time = time.strftime('%Y-%m-%d %H:%M:%S')
# print(fmt_time)        # 这样可以得到格式化时间

Client端

import socket
sk = socket.socket(type=socket.SOCK_DGRAM)

sk.sendto('%Y-%m-%d %H:%M:%S'.encode('utf-8'),('127.0.0.1',9001))
msg,_ = sk.recvfrom(1024)
print(msg.decode('utf-8'))

sk.close()

解决粘包问题

Server端

import socket
import struct

sk = socket.socket()
sk.bind(('127.0.0.1',9090))
sk.listen()

conn,addr = sk.accept()
while True:
    s = input('>>>').encode('utf-8')
    pack_num = struct.pack('i',len(s))
    conn.send(pack_num)
    conn.send(s)
conn.close()
sk.close()

Client端

import socket
import struct

sk = socket.socket()
sk.connect(('127.0.0.1',9090))

while True:
    pack_num = sk.recv(4)
    num = struct.unpack('i',pack_num)[0]
    print(num)
    ret = sk.recv(num)
    print(ret.decode('utf-8'))
sk.close()