基本概念
TCP TCP(Transmission Control Protocol 传输控制协议)
UDP User Datagram Protocol的简称, 中文名是用户数据报协议
IP 网络之间互连的协议(IP)是Internet Protocol 协议 端口
协议:http https
TCP/IP协议:因为互联网协议本身就包含很多协议标准,但最重要的两个协议就是TCP和IP协议,所以互联网协议可以简称为TCP/IP协议
IP地址:如果想要连接一台电脑,我们就需要知道这台电脑的标识,互联网上为每台电脑都提供一个唯一的标识,这个标识就是ip地址,类似于
123.123.123.123
IP地址对应的实际上是计算机的网路接口IP协议:负责把数据从一台计算机上通过协议发送给另一条计算机,数据会被切割成一小块一小块,通过IP包发送出去
IP包的特点:本身是以块的形式发送数据,但不保证能够全部到达,也不能保证按顺序到达
TCP协议:建立在IP协议之上,TCP协议负责把两台计算机之间建立可靠连接,保证数据按顺序到达,
如果数据包丢失,会自动重新发送IP地址
IPv4:是32位的整数,以字符串形式表示ip地址,以字符串表示的IP地址如192.168.0.1实际上是把32位整数按8位分组后的数字表示,目的是便于阅读。123.123.123.123 0-255.0-255.0-255.0-255
IPv6: 是128位的整数,以字符串形式表示ip地址,它是目前使用的IPv4的升级版,以字符串表示类似于
2001:0db8:85a3:0042:1000:8a2e:0370:7334。
端口:为了区分不同的程序
一个完整的IP地址:
协议 IP 端口号http://10.31.157.61:8080
电脑服务器默认值端口80,人为重新设置端8080
链接新浪客户端
# socket 套接字
# 通常我们用一个Socket表示“打开了一个网络链接”,而
# 打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可
'''
客户端:向服务器发送请求,接受服务器的数据
服务器:接受客户端的数据,发送给客户端数据
'''
import socket
# 1.创建一个socket对象
# 参数一:指定协议,AF_INETH或AF_INET6 (IPv4, IPv6)
# 参数二:SOCK_STREAM 使用TCP协议 以流的形式发送或接收数据
socket1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.建立连接
# connnect的参数为一个元组类型的额数据,第一个是IP 第二个是端口号
socket1.connect(('www.sina.com.cn', 80))
# 3 发送请求,要求请求新浪首页的内容并返回该内容
# send的参数为字节类型
'''
GET/HTTP/1.1
GET:表示的是一种请求方式,将从服务器直接获取数据(网址必须是完整的)
# 请求方式通常使用两种:GET, POST
# 其他的请求方式:PUT DELETE
/ : 表示的是url路径,url总是以/开始
HTTP/1.1: 协议版本, HTTP协议,版本1.1 目前也有支持1.0的版本的服务器
1.0和1.1的区别:1.1版本允许多个HTTP请求一个TCP链接,可以加快传输速度
Host: www.sina.com.cn:请求地址为www.sina.com.cn 如果一个服务器有多个网站
服务器需要使用Host来区别浏览器请求的地址
Connection:close 当服务器发送给客户端数据之后就自动断开连接
\r\n: 每一个请求头(header)使用\r\n分开的
\r\n\r\n:表示Header结束 后面都是Body(请求体)部分
'''
socket1.send(b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n')
# 4. 接受数据
data = []
while True:
# recv:接受数据 1024:每次允许接收1K的数据
tmp = socket1.recv(1024)
if tmp:
data.append(tmp)
else:
break
# 5.拼接数据
# b''join() 按字节拼接 整体为字节类型bytes
dataStr = b''.join(data)
# 6.关闭连接
socket1.close()
header, html = dataStr.split(b'\r\n\r\n', 1)
# 将字节解码(utf-8) 解码为字符串数据类型的数据
print(header.decode('utf-8'))
with open('sina.html', 'wb') as f:
f.write(html)
TCP服务端
# TCP服务端
import socket
# 1.创建一个socket 用作服务端
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.绑定一个IP地址及端口号
# 端口号的范围 1-65536
# ip 地址 端口号
server.bind(('10.31.157.15', 43998))
# 3.监听
# 传入的值在指定的拒绝链接之前允许链接的最大数,该值至少为1
# 大部分设置为5即可
server.listen(5)
print('Waiting for connection...')
# 4.等待客户端连接,会阻塞程序运行
# server.accept() 如果链接成功,会返回客户端的socket及address
clientSocket, clientAddress = server.accept()
print(clientSocket)
print(clientAddress)
while True:
# 5.接受客户端数据
data = clientSocket.recv(1024)
print('客户端说:',data.decode('utf-8'))
# 6.发送数据给客户端
sendDate = input('请输入想要发送的内容:')
clientSocket.send(sendDate.encode('utf-8'))
TCP客户端
# TCP 客户端
import socket
# 1.创建一个socket:用于客户端
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.创建链接:链接服务器
client.connect(('10.31.157.15', 43998))
while True:
# 3.客户端发送给服务器端信息
dataStr = input('请输入想要发送给服务器的内容')
client.send(dataStr.encode('utf-8'))
# 客户端接受服务器端的信息
data = client.recv(1024)
print('服务器说:', data.decode('utf-8'))
多线程服务器
import socket
from threading import Thread # 线程
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('10.31.157.15', 43998))
server.listen(5)
print('Waiting for connection...')
# 等待客户端连接
def chat(client, address):
while True:
data = client.recv(1024)
print('客户端',address,':', data.decode('utf-8'))
sendData = input('服务器说:')
client.send(sendData.encode('utf-8'))
# 等待客户端连接
while True:
clientSock, clientAddress = server.accept()
print(clientAddress)
# 接收数据,发送数据放到线程
threadChat = Thread(target=chat, args=(clientSock, clientAddress))
# 启动线程
threadChat.start()
UDP介绍
TCP: 是建立可靠链接,服务器及客户端都可接受发送数据
UDP : 不需要建立可靠链接,只需要知道对方的IP地址及端口号即可
UDP可以直接发送数据,但对方能不能接收就不一定了
UDP的链接不可靠,但与TCP相比,速度快,对于需求不高的数据可以使用UDP
飞秋群发
import socket
# UDP SOCK_DGRAMY以包的形式传输数据
socket1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
str1 = '1_lbt4_10#32499#002481627512#0#0#0:1289671407:名字:备注:288:发送的内容'
for i in range(1,255):
address = ("10.31.162.%s"%(i),2425)
socket1.sendto(str1.encode("gbk"), address)
UDP服务器
import socket
# 1.创建socket
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.绑定
server.bind(('10.31.157.15', 39999))
while True:
# 3.接受数据 recvfrom
data, address = server.recvfrom(1024)
print(address,'说:', data.decode('utf-8'))
# 4.发送数据
sendStr = input('发送的数据为:')
server.sendto(sendStr.encode('utf-8'), address)
UDP客户端
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print('Waiting for connection...')
while True:
# 发送数据
sendStr = input('客户发送:')
client.sendto(sendStr.encode('utf-8'), ('10.31.157.15', 39999))
# 接收数据
data, address = client.recvfrom(1024)
print(address, '服务端说:', data.decode('utf-8'))