Day27--Python--初识socket

一. C\S架构, 客户端服务端架构
客户端(client): 享受服务端提供的服务
服务端(server): 给客户端提供服务
B\S 浏览器和服务端 B (browser)

二. 网络通信的整个流程(硬件\名词)
集线器: 将所有的插上集线器的电脑连通起来
交换机: 升级版集线器
网卡: 接收电信号 网络插口:插网线
mac地址(物理地址): ‎D8-C4-97-6C-0A-E5 16进制的6个数表示,前三位厂商编号,后三位生产流水号
就是网卡的mac地址,全球唯一,相当于身份证
广播\单播
广播风暴: 不安全,拥堵信息
IP地址: 192.168.15.87 四个点分十进制组成
192.168.15.0 -- 192.168.15.255 共256个IP地址, 交换机给自动分配
101010101010 2**8 = 256

作用: 划分广播域
IPv4: 4个点分十进制
IPv6: 6个冒号分十六进制 # fe80::e018:1a0e:cb9d:8d79%13

DHCP协议: 自动分配IP地址
子网掩码: 255.255.255.0 # 计算IP是否是同一网段的,属于同一个网段的,我们称为属于同一个子网
另外一个班的同学的IP地址为192.168.14.12
11000000.10101000.00001110.00001100 # 此同学IP地址的8位2进制
子网掩码255.255.255.0
11111111.11111111.11111111.00000000 # 子网掩码的二进制
先转化成2进制,然后对应值做and运算
11000000.10101000.00001110.00000000
返回192.168.14.0 交换机计算出不是15网段的,就上报广播给各个交换机.
路由器管辖所有交换机,交换机管辖子网
路由器: 管理网络, 联通外网,并且由路由器转发,就是转发消息
DNS服务器: 域名: www.jd.com => ip地址
路由协议: 计算转发消息的最优路径
网关: 公网IP,把关,也是路由器的IP地址
NAT: 网络地址转换,把内网,也是局域网的IP地址,转化为公网的IP地址,也就是网关的IP地址
局域网\内网
端口: 电脑创建的标识程序用的
0-65535 # 范围
0-1024 属于电脑内部的一些服务用的,千万别用. 一般自己写都用8000以后的

三. 初识socket 套接字(网络通信考点)
  阻塞: 程序卡住了,不继续往下运行


# 创建服务端

import
socket # 创建了一个socket对象 server = socket.socket() # 一个元组 ip_port = ('192.168.15.87', 8001) # 8001 自己设置的服务端的端口号 # 绑定IP地址和端口 server.bind(ip_port) # 监听IP地址和端口 server.listen(3) # 后面等待连接的个数 3 个 print('等待连接中...') # 等待客户端连接 conn, addr = server.accept() # 等着连接,阻塞住 print('连接成功!') print(conn) # 连接通道 print('>>>', addr) # 客户端的IP地址和端口 # 接收消息. 接收的消息是bytes类型,需要转化成字符串 msg_from_client = conn.recv(1024).decode('utf-8') # 1024b 为能接收到的消息大小,如果消息是2048b,那么只能接收到1024b; 只能 传输字节,接收消息需要解码,发送消息需要编码 print(msg_from_client) conn.send('没吃呢,你请客吗?'.encode('utf-8')) # 关闭连接 conn.close() server.close()

 

# 创建客户端

import socket

client = socket.socket()

server_ip_port = ('192.168.15.87', 8001)

# 连接服务端
client.connect(server_ip_port)

client.send('你吃了吗?'.encode('utf-8'))    # send里面的消息必须是字节类型的

msg_from_server = client.recv(2048).decode('utf-8')
print(msg_from_server)

client.close()

 

import socket

server = socket.socket()
ip_port = ('192.168.15.87', 8000)
server.bind(ip_port)
server.listen(3)
print('等待连接中...')
conn, addr = server.accept()
print('连接成功!')
while 1:
    msg_from_client = conn.recv(2048).decode('utf-8')
    print(msg_from_client)
    content = input('请输入,按Q退出,按Enter继续:')
    if content.upper() == 'Q':
        break
    elif content == '':
        continue
    conn.send(content.encode('utf-8'))

conn.close()
server.close()
View Code 服务端问答模式
import socket

client = socket.socket()
# server_ip_port = ('192.168.15.91', 8002)
server_ip_port = ('192.168.15.107', 8001)
client.connect(server_ip_port)
while 1:
    msg = input('请输入,按Q退出,按Enter继续:')
    if msg.upper() == 'Q':
        break
    elif msg == '':
        continue
    client.send(msg.encode('utf-8'))
    msg_form_server = client.recv(2048).decode('utf-8')
    print(msg_form_server)

client.close()
View Code 客户端问答模式

 当listen里面写了等候数量,已经有客户端处于等待状态的时候,如果强行关闭连接中的客户端,则会报错.如果将客户端优雅地关闭,则等待中的客户端可以依次连接.

import socket

server = socket.socket()
ip_port = ('192.168.15.87', 8001)
server.bind(ip_port)
server.listen(3)
flag = 1
while flag:
    print('等待连接中...')
    conn, addr = server.accept()
    print('连接成功!')
    while 1:
        print('等待接收消息...')
        msg_from_client = conn.recv(1024).decode('utf-8')
        print(msg_from_client)
        if msg_from_client == 'bye':
            break
        msg = input('服务端:')
        conn.send(msg.encode('utf-8'))
        if msg == 'bye':
            flag = 0
            break

    conn.close()


server.close()
 服务端准备服务多个客户端
服务端准备服务多个客户端

 

# 优雅地关闭客户端

import socket

client = socket.socket()
server_ip_port = ('192.168.15.87', 8001)
client.connect(server_ip_port)

while 1:
    msg = input('客户端:')
    client.send(msg.encode('utf-8'))
    if msg == 'bye':
        break
    print('等待接收消息...')
    msg_from_server = client.recv(1024).decode('utf-8')
    print(msg_from_server)
    if msg_from_server == 'bye':
        break

client.close()
View Code 优雅地关闭客户端

 

posted @ 2018-10-15 14:52  SuraSun  阅读(249)  评论(0编辑  收藏  举报