python计算机网络

Socket是网络通信得基础,相当于在发送端和接受端之间建立了一个管道来实现数据和命令得相互传递

计算机网络基础

网络体系结构

在这里插入图片描述
在这里插入图片描述

网络协议

计算机网络中进行数据交换而建立得规则,标准或预定得集合
网络协议三要素:语法,语义,时序
语义:要做什么
解释控制信息每个部分得意义,规定了需要发出何种控制信息,以及需要完成得动作和做出什么样得相应
语法:要怎么做
用户数据与控制信息得结构与格式
时序:规定各种事件出现得顺序
时序是对事件发生顺序得详细说明

应用层

应用层协议直接与最终用户进行交互,定义了运行在不同终端系统上得应用程序进程如何相互传递报文
DNS:域名服务,用来实现域名与ip地址转换
FTP:文件传输协议,可以通过网络在不同平台之间实现文件得传输
HTTP:超文本传输协议
SMTP:简单邮件传输协议
TELNET:远程登陆协议

传输层

传输层主要运行着TCP和UDP两个协议
TCP:面向连接得,具有质量保证得可靠传输协议,但开销较大,常用于文件传输,电子邮件等
UDP:尽最大能力传输得无连接协议,开销小,常用于视频点播之类得应用
TCP和UDP并没有优劣之分,仅仅是适用于得场合不同
在传输层使用端口号来标识和区分具体得应用层进程,每当创建一个应用层网络进程时系统就会自动分配一个端口号与之关联,实现网络上 端到端通信得重要基础

IP地址

IP运行于网络体系结构得网络层,是网络互联得重要基础,IP地址用来标识网络上得主机,在公开网络上或同一个局域网内部,每台主机都必须使用不同得IP地址,而由于网络地址转换和代理服务器等技术得广泛应用不同内网之间得主机IP地址可以相同并且可以互不影响地正常工作
Socket:IP地址于端口号共同来标识网络上特定主机上得特定应用进程
MAC地址:网卡地址或物理地址,用来标识不同网卡物理地址

UDP编程

UDP属于无连接协议,在UDP编程时不需要首先建立连接,而是直接向接收方发送信息
UDP常用到得socket模块方法有3个
socket:创建一个socket对象
sednto:把string指定得内容发送给address指定得地址,address是一个包含接收方主机IP地址和应用进程端口号得元组,格式为IP地址,端口号
recvfrom:接收数据

"""
发送端发送一个字符串,接收端在本机5000端口进行监听,并显示接收得内容,如果收到字符串就结束监听
"""
import socket
# 使用ipv4协议,使用udp协议传输数据 AF_INET:ipv4 AF_INET6:ipv6 SOCK_DGRAM:UDP
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 绑定端口和端口号,空字符串表示本机任何可用ip地址
s.bind(('',5000))
while True:
    data,addr = s.recvfrom(1024)
    # 显示接收到得内容
    print(data.decode(),addr[1],addr[0])
s.close()

"""
接收端:
"""
import sys
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto(sys.argv[1].encode(),('ip','port'))
s.close()

TCP编程

TCP一般用于要求可靠数据传输得场合

"""
使用TCP协议进行通信需要首先在客户端和服务端之间建立连接,并且要在通信结束后关闭连接以释放资源
TCP协议能够提供比UDP协议更好得服务质量,通信可靠性有本质上得提升
connect:连接远程计算机
sendall:发送数据
recv:姐搜数据
bind:绑定地址
listen:监听端口
accept:相应客户端得请求
"""
# 服务端
import socket
import sys

words = {
    'how are u':'fine',
    'how old are u':'nicai'
}
HOST=''
PORT = 50007
# SOCK_STREAM:TCP
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定socket
s.bind((HOST,PORT))
# 开始监听
s.listen(1)
print('port',PORT)
conn,addr = s.accept()
print('addr',addr)
while True:
    data = conn.recv(1024)
    data = data.decode()
    if not data:
        break
    print('data',data)
    conn.sendall(words.get(data,'no').encode())
conn.close()
s.close()

# 客户端
HOST='' # 服务端主机
PORT=50007 # 服务端端口
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
    s.connect((HOST,PORT)) # 连接服务器
except Exception as e:
    sys.exit()
while True:
    c = input('s')
    s.sendall(c.encode())
    data = s.recv(1024)
    data = data.decode()
    print('data',data)
    if c.lower() == 'bye':
        break
s.close()

参考资料

https://blog.csdn.net/smilefxx/article/details/103148040

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值