通信与socket初识

网络的产生是由于不同机器之间的通信需求

两类应用,桌面安装的程序和web的网页程序

一.C/S架构

C/S架构:服务端在一直运行,等待服务别人;client/sever
客户端在需要使用的时候才开始用。需求都安装好程序使用


B/S架构(从属于C/S架构):不需要提前安装 browser(浏览器)/sever
软件C/S架构:浏览器,qq等....
硬件C/S架构:打印机...

 

二.网络通信的流程


mac地址是每台机器的出厂地址,走广播的形式,全球范围内会不安全且冗余
ip地址是用来划分广播域的,前三段相同则为同一个ip地址段,为同一子网,以广播的形式进行通信
联网之后,自动获取ip地址,被称为DHCP协议
Arp协议:通过ip地址获取mac地址
子网掩码:计算是否属于同一网段;如果交换机发现不是自己的IP,上传路由器,路由器广播各交换机,再度确认后包含的收到,不是的交换机直接扔掉
上述为内部的通信流程

访问外网
如果路由器发现不是属于自身路由范围下的,就访问DNS服务器 ,把输入的网址域名转化为ip,所有的网址都有ip(对应于服务器)
公网的ip地址(网关),内网ip经net转换,
然后经过路由器间的路由转发,按照路由协议计算出的最优路径,访问目标所在的路由器,
进行端口映射,直接根据该服务器单独的端口号访问程序即可,该子网下其他机器不可使用这个端口号

socket

服务器端

import socket
#导入socket模块

server = socket.socket()      #创建socket对象

ip_port = ('121.195.167.34',8002)   #设置一个ip地址和端口号

server.bind(ip_port)          #绑定ip和端口号

server.listen()               #监听ip和端口号

conn,addr = server.accept()   #等待建立连接,前者为建立的连接通道,后者为客户端地址

from_client_msg = conn.recv(1024)  #通过recv方法,参数是字节(b),1024即为1kb,指一次性接受的消息大小

print(from_client_msg.decode('utf-8'))


#conn.send(b'replay'.encode('utf-8'))   #回复消息,通过send方法,参数必须是字节类型
conn.send(b'replay')
conn.close()           #关闭通道,通过close方法
server.close()         #关闭服务器

客户端

import socket
import time
client = socket.socket()   #创建一个socket对象

server_ip_port = ('121.195.167.34',8002)  #找ip和端口号

client.connect(server_ip_port)  #利用ip和端口号连接服务器程序

client.send(b'hello')     #发消息,用send方法,字节类型
client.send('你好'.encode('utf-8'))     #中文
# client.send(str(time.time()).encode('utf-8'))
from_server_msg = client.recv(1024)  #通过recv方法,参数是字节(b),1024即为1kb,指一次性接受的消息大小

print(from_server_msg.decode('utf-8'))

client.close()

 发送时加.encode;接收时加.decode。

posted @ 2019-07-30 09:29  眼见高楼起  阅读(136)  评论(0编辑  收藏  举报