day 26 网络编程基础

1.软件开发架构:
开发软件,必需要开发一套 客户端 与 服务端。

客户端与服务端的做用
服务端: 24小时不间断提供服务
客户端: 若是想要找服务,就去寻找服务并享受

软件开发架构分为两种:
C/S架构:
Client: 客户端
Server: 服务端

优势:
软件的使用稳定,而且能够节省网络资源。

缺点:
1.若用户想在同一个设备上使用多个软件,必须下载多个客户端。
2.软件的每一次更新,客户端也必须跟着从新下载更新。

C/S架构的软件:
例如: 电脑上的QQ、Pycharm等...手机端(移动端)的微信、王者荣耀等...

B/S架构:
Browser: 浏览器(客户端)
Server: 服务端

优势:
以浏览器充当客户端,无需用户下载多个软件,也无需用户下载更新软件版本,
直接在浏览器上访问须要使用的软件。

缺点:
消耗网络资源过大,当网络不稳定时,软件的使用也会不稳定。


B/S架构的软件:
例如: 在浏览器(客户端)上输入某个软件的域名(http://oldboyedu.com/)。


2.后期学习
网络编程、并发编程、数据库开发 能够开发一套C/S架构的软件(防优酷系统)。
前端html、css、js,web框架(网络编程、并发编程) 能够开发一套B/S架构的软件(bbs系统)。


3.网络编程

- 网络编程发展历史
全部先进的技术都源自于军事,但愿经过远程获取数据,因此出现了"网络编程"。

早期如何实现远程通讯:
- 打电话 ---> 电话线
- 纯平电脑(大屁股电脑) ---> 网线,有线网卡
- 笔记本电脑 ---> 有线网卡、无线网卡

要实现远程通讯必须具有:
1.物理链接介质 ---> 网卡....

2.互联网协议
- 人与人之间沟通的介质: 中文、英语
- 计算机之间沟通的介质: "互联网协议"


4.互联网协议
互联网协议又称为网络七层协议,OSI七层协议,OSI是一个世界标准组织。

OSI七层协议:
- 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 数据链路层
- 物理链接层

学习由下到上:
须要优先了解的协议一共5层:

- 物理链接层
基于电信号发送二进制的数据0101010111。
010: 你 you
101: 我 I

- 数据链路层
数据链路层的 "以太网协议",专门用于处理基于电信号发送二进制的数据。

以太网协议:
1.规定好电信号数据的分组方式。
2.每一台链接网线的电脑都必需要由一块 "网卡"。
- 网卡由不一样厂商生产的
- 每块网卡都会有世界上独一无二12位的编号 "mac"地址。
- 前6位: 厂商号
- 后6位: 流水号

- 交换机:
可让多台电脑链接到一块儿。

基于以太网协议发送数据:
特色:
广播、单播

弊端:
广播风暴、不能跨局域网通讯。

- 互联网:
让局域网之间进行通讯。

- 网络层
IP地址: 用于标识惟一的一台计算机(局域网)的地址。
IP: 点分十进制
最小值: 0.0.0.0
最大值: 255.255.255.255

IPV4(了解):
一开始用电脑的人很少,因此出现IPV4的协议版本。

IPV6(了解):
括号IP。

本机IP: 回环地址 127.0.0.1 ---> localhost

- 传输层
TCP/UDP协议,他们都是基于端口工做的。

- 端口号: 标识电脑上某个一个软件。

- 端口号范围: 0-65535

注意:
1.操做系统中,通常0-1024的端口都被默认使用了(0-1024不要动)
2.尽可能使用8000以后的端口号 8001

开发中经常使用软件的默认端口号 (默写) :
mysql: 3306
mongodb: 27017
Django: 8000
Tomcat: 8080
Flask: 5000
Redis: 6379


若想服务端与客户端进行通讯,必需要创建链接,产生双向通道。
一条是客户端往服务端发送消息的。
另外一条是服务端往客户端发送消息的。

- 应用层
http
ftp


总结:
ip:用于惟一标识某一台计算机的位置。
port: 端口用于确认计算机上的一个应用软件。

ip + port: 世界上某一台电脑上的一个应用软件。

- TCP协议的工做原理:

- TCP是一个流式协议

- 三次握手,四次挥手(*******):
- 三次握手建链接:
创建双向通道,创建好链接。
- listen: 监听
- established: 确认请求创建链接

- 发送数据:
write
read
客户端往服务端发送数据,数据存放在内存中,须要服务端确认收到,数据才会在内存中释放掉。

不然,会隔一段时间发送一次,让服务端返回确认收到。
在一段时间内,若服务端仍是不返回确认收到,则取消发送。并释放内存中的数据。

- 四次挥手断链接:
- TIME_WAIT: 时间等待



5.Socket:

1.什么是Socket?
socket是一个模块,能够写一套C/S架构的套接字。

2.为何要使用Socket?
socket套接字会封装好各层协议的工做。
好处:
能够节省开发成本。

3.如何使用
import socket


注意: 客户端与服务端必须尊循:
一端send,另外一端recv
不一样两端同时send或recv

6.初始socket套接字
  1.客户端
#客户端
import socket

# 买手机
client = socket.socket()

# 往服务端拨号
# client: 至关于客户端往服务端挖的管道
client.connect(
    # ip + port: 寻找服务端
    ('127.0.0.1', 9527)
)

# 客户端向服务端说话

client.send('你好 小贱贱'.encode('utf-8'))
data = client.recv(1024)
print(data)

# 关闭链接
client.close()
 
1.客户端
#服务端
import socket

# 默认指定TCP协议
# 买手机
server = socket.socket()
# 插卡
server.bind(
    # ip + port
    ('127.0.0.1', 9527)
)
# 开机,等待接听
server.listen(5)  # listen(5) 半链接池

# 监听是否有消息
# conn: 至关于服务端往客户端挖的管道
conn, addr = server.accept()
print(addr)

# 听客户端给我说话
data = conn.recv(1024).decode('utf-8')  # 能够接收1024字节数据
print(data)

conn.send(b'hello xiao tank')

# 挂电话
conn.close()

# 关机
server.close()
7.循环通讯套接字

  1.客户端css

import socket
client = socket.socket()
client.connect(
    ('127.0.0.1', 9527)
)


while True:
    send_msg = input('client---> server:')

    # 服务端往客户端发送的数据
    client.send(send_msg.encode('utf-8'))

    if send_msg == 'q':
        break

    # 服务端返回的数据
    data = client.recv(1024).decode('utf-8')
    print(data)


client.close()
 2.服务端
import socket

server = socket.socket()
server.bind(
    ('127.0.0.1', 9527)
)
server.listen(5)  # listen(5) 半链接池

conn, addr = server.accept()
print(addr)

while True:
    # 接收客户端发送过来的消息
    data = conn.recv(1024).decode('utf-8')  # 能够接收1024字节数据
    print(data)

    if data == 'q':
        break

    # 让服务端数据发送给客户端的消息
    send_msg = input('server--->client: ').encode('utf-8')
    conn.send(send_msg)


conn.close()
 

8.服务端多个客户端html

  1.客户端前端

import socket

client = socket.socket()

client.connect(
    ('127.0.0.1', 8888)
)

while True:
    send_msg = input('client---》server:')

    client.send(send_msg.encode('utf-8'))

    if send_msg == 'q':
        break

    data = client.recv(1024).decode('utf-8')
    print(data)

client.close()

 

  2.服务端mysql

import socket
server = socket.socket()
server.bind(
    ('127.0.0.1', 8888)
)
server.listen(5)  # 半链接池,能够“等待5个用户接受服务”

while True:
    # 等待客户端链接过来
    conn, addr = server.accept()
    print(addr)

    # 循环接收客户端数据
    while True:
        try:
            data = conn.recv(1024).decode('utf-8')
            print(data)

            # mac和linux系统bug: b''
            if len(data) == 0:
                continue

            if data == 'q':
                break

            conn.send(data.encode('utf-8'))

        except Exception as e:
            print(e)
            break

    conn.close()
相关文章
相关标签/搜索