编写基于tcp协议的套接字程序

一:网络知识复习

1.cs架构和bs架构:

 1.1什么cs架构和bs架构是?

  CS即Client/Server(客户机/服务器)结构,C/S结构在技术上很成熟,它的主要特点是交互性强、具有安全的存取模式、网络通信量低、响应速度快、利于处理大量数据。但是该结构的程序是针对性开发,变更不够灵活,维护和管理的难度较大。通常只局限于小型局域网,不利于扩展。并且,由于该结构的每台客户机都需要安装相应的客户端程序,分布功能弱且兼容性差,不能实现快速部署安装和配置,因此缺少通用性,具有较大的局限性。要求具有一定专业水准的技术人员去完成。

  BS即Browser/Server(浏览器/服务器)结构,就是只安装维护一个服务器(Server),而客户端采用浏览器(Browse)运行软件。B/S结构应用程序相对于传统的C/S结构应用程序是一个非常大的进步。 B/S结构的主要特点是分布性强、维护方便、开发简单且共享性强、总体拥有成本低。但数据安全性问题、对服务器要求过高、数据传输速度慢、软件的个性化特点明显降低,这些缺点是有目共睹的,难以实现传统模式下的特殊功能要求。例如通过浏览器进行大量的数据输入或进行报表的应答、专用性打印输出都比较困难和不便。此外,实现复杂的应用构造有较大的困难。

1.2他们的比较

2.公网和私网:

公网、私网是两种Internet的接入方式。

公网接入方式:上网的计算机得到的IP地址是Internet上的非保留地址,公网的计算机和Internet上的其他计算机可随意互相访问。
内网:也就是常说的局域网。是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理、应用软件共享、打印机共享、工作组内的日程安排、电子邮件和传真通信服务等功能。局域网是封闭型的,可以由办公室内的两台计算机组成,也可以由一个公司内的上千台计算机组成。

3.arp协议

  地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等

arp协议可以解析成它对应的那个mac地址

arp协议计算 ip和子网是否在局域网,在的话ip要mac地址  目标主机mac  目标主机ip

arp协议计算 ip不在一个子网,网关mac(数据往外发),目标主机mac

 往外发送时候,原ip向网关发送,网关向原ip要mac,后再向外部发送

4.本地回环地址:

127.0.0.1,通常被称为本地回环地址(Loopback Address),不属于任何一个有类别地址类。它代表设备的本地虚拟接口,所以默认被看作是永远不会宕掉的接口。在Windows操作系统中也有相似的定义,所以通常在安装网卡前就可以ping通这个本地回环地址。一般都会用来检查本地网络协议、基本数据接口等是否正常的。

https://www.cnblogs.com/linhaifeng/p/8566036.html      子网划分

5.字符串前面+b是专程bash类型等同于(‘hello’.emcod('utf-8)

二:编写基于tcp协议的套接字程序

socket是对应用层以下的层进行封装

1.套接字工作流程

2.tcp如何使用

服务端:


import
socket import subprocess #1买手机 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #流式协议 #phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR) #2绑定银行卡 phone.bind(('127.0.0.1',8082)) #元组内放自己的ip地址 #再次启动服务端,告诉端口已经占用,解决办法有:1.换个端口,8080换掉同时客户端也需要换掉 2.在绑定之前加上下面内容:phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR) # 防止位置在 #2绑定银行卡 上面 #3开机 phone.listen(5) #半连接池,5以内接受访问请求。 5是访问数量,也就是说除了正在访问的这个,最多再有5个 #4建立链接的请求 while True: #需要一个循环不停地与客户端交互 connect,client_addr=phone.accept() print(client_addr) #5 收/发消息 while True: try: #避免客户端突然中断,不会造成服务端崩溃,针对Windows date=connect.recv(1024) #最大的接受字节数 if len(date)==0: #针对linux系统的 break cmd=date.decode('utf-8') obj=subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) res1=obj.stdout.read() res2=obj.stderr.read() connect.send(res1+res2) #print(date.decode('utf-8')) #connect.send(date.upper()) except Exception: break #6挂电话 connect.close() #7关机 phone.close()
客户端


import socket
#1买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)  #流式协议

#2打电话
phone.connect(('127.0.0.1',8082))

#3发/收数据
while True:
    msg=input('<<<<').strip()
    if len(msg)==0:                      #避免客户端输入是空的时候出现异常,下面的无法操作
        continue
    phone.send(msg.encode('utf-8'))
    date=phone.recv(1024)
    print(date.decode('utf-8'))

#4关闭
phone.close()

 ('127.0.0.1', 53338)      分别为客户端ip和接口

原文地址:https://www.cnblogs.com/dayday-up-a/p/14281975.html