python web编程

TCP/IP简介
  • IP协议

IP地址:互联网上每个计算机的唯一标识就是IP地址。IP地址实际上是一个32位整数(IPv4),它是以字符串表示的IP地址,如:172.16.254.1.实际上是把32位整数按8位分组后的数字表示,目的是方便与阅读。

IP协议:负责把数据从一台计算机通过网络发送到另一台计算机数据被分割成一小块一小块,然后通过IP包发送出去。

IP包的特点是按块发送,途径多个路由,但不能保证都能到达,也不能保证顺序到达。

  • TCP协议

TCP协议是建立在IP协议之上的,TCP协议负责在两台计算机之间建立可靠连接,保证数据包按顺序到达。

TCP协议会通过三次握手建立可靠连接。
在这里插入图片描述
然后需要对每个IP包进行编号,确保对方按顺序收到,如果包丢掉了,就自动重发。
在这里插入图片描述
TCP保温处理包含要传输的数据外,还包含源IP地址和目标IP地址、源端口和目标端口。

每个网络程序都向操作系统申请唯一的端口号,这样确保接收的程序作区分

  • UDP简介

​ 相对于TCP协议,UDP协议则是面向无连接的协议。使用UDP协议无需建立连接,只需知道对方的IP地址和端口号,就可以直接发数据包。

​ 但是数据无法保证一定到达。虽然不可靠,但是传输速度比TCP协议的速度快。
在这里插入图片描述

  • Socket简介

    ​ 为了让两个程序通过网络进行通信,二者均伯绪使用Socket套接字。它是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。

    ​ 在Internet上的主机上一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。

python中的socket() 函数

s=socket.socket(socket.AD_INET,socket.SOCK_STREAM)

创建UDP/IP套接字

udpSock=sockey.socket(socket.AD_INET,socket.SOCK_DGRAM)

socket对象到的主要的方法:

函数描述
s.bind()绑定地址(host,port) 到套接字,在AF_ INET下,以元组(host,port)的形式表示地址
s.listen()开始TCP监听。backlog 指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了
s.accept()被动接受TCP客户端连接(阻塞式),等待连接的到来
s.connect()主动初始化TCP服务器连接,一般 address的格式为元组(hostname,port), 如果连接出错,返回socket.error错误
s.recv()接收TCP数据,数据以字符串形式返回,bulsize 指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略
s.send()发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string 的字节大小
s.sendal()完整发送TCP数据,完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常
s.recvfrom()接收UDP数据,与recv()类似,但返回值是(address)。 其中data是包含接收数据的字符串,address 是发送数据的套接字地址
s.sendto()发送UDP数据,将数据发送到套接字,address 是形式为(ipaddr,port) 的元组,指定远程地址。返回值是发送的字节数
s.close()关闭套接字
TCP编程

完成TCP服务器功能的流程:

  1. 使用 socket() 创建一个套接字:
  2. 使用 bind() 绑定IP 和port
  3. 使用 listen() 使套接字变为可被动连接
  4. 使用 accept() 等待客户端的连接
  5. 使用 recv/send() 接收发送数据
import  socket					#导入socket模块
host='127.0.0.1'				#主机IP
port=8080						#端口号
web=socket.socket()				#创建socket对象
web.bind((host,port))			#绑定端口
web.listen(5)					#设置最多连接数
print('服务器等待客户端连接...')
while True:
    conn,addr=web.accept()		#建立客户端连接
    data=conn.recv(1024)		#获取客户端请求数据
    print(data)					#打印接受到的数据
    conn.sendall(b'HTTP/1.1 200 OK\r\n\r\nhello world')		#向客户端发送数据
    conn.close()				#关闭连接
web.close()
创建TCP客户端
import  socket					#导入socket模块
host='127.0.0.1'				#主机IP
port=8080						#端口号
web=socket.socket()				#创建socket对象
s.connect((host,port))			#主动初始化TCP连接
send_data=input("请输入要发送的数据")
s.send(send_data.encode())
#接收对方发送过来的数据,最大接收1024个字节
recvData=s.recv(1024).decode()
print('接收到的数据为:',recvData)
s.close()						#关闭套接字

执行TCP服务器和客户端

服务器端

import socket
import threading
import time
host=socket.gethostname()
port=12345
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((host,port))
s.listen(5)
sock,addr=s.accept()
print('连接已经建立')
class read(threading.Thread):
    def run(self):
        while True:
            recvData =sock.recv(2014).decode()
            print('接收到的数据为:', recvData)
        s.close()

class write(threading.Thread):
    def run(self):
        while True:
            send_data = input('请输入要发送的数据:')
            sock.send(send_data.encode())
            if send_data == 0:
                break
        sock.close()

if __name__ == '__main__':
    read =read()
    write = write()
    read.start()
    write.start()
    resave.join()
    read.join()
    write.join()

客户端

import socket
import threading
s=socket.socket()
host=socket.gethostname()
port=12345
s.connect((host,port))
print('已连接')

class read(threading.Thread):
    def run(self):
        while True:
            recvData = s.recv(2014).decode()
            print('接收到的数据为:', recvData)

class write(threading.Thread):
    def run(self):
        while True:
            send_data = input('请输入要发送的数据:')
            s.send(send_data.encode())
            if send_data == 0:
                break
        s.close()

if __name__ == '__main__':
    read = read()
    write = write()
    write.start()
    read.start()
    read.join()
    write.join()

UDP编程

服务器

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(('127.0.0.1',8888))
print('绑定UDP到8888端口')
data,addr=s.recvfrom(1024)
data=float(data)*1.8+32
send_data='转换后的温度(单位:华氏温度):'+str(data)
print('Recrived from %s:%s.'%addr)
s.sendto(send_data.encode(),addr)				#encode()将字符串类型转byte
s.close()

客户机

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
data=input('请输入要转换的温度(单位:摄氏度):')
s.sendto(data.encode(),('127.0.0.1',8888))
print(s.recv(1024).decode())
s.close()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值