基本概念
TCP TCP(Transmission Control Protocol 传输控制协议) UDP User Datagram Protocol的简称, 中文名是用户数据报协议 IP 网络之间互连的协议(IP)是Internet Protocol 协议 端口协议:http https
TCP/IP协议:因为互联网协议本身就包含很多协议标准,但最重要的两个协议就是TCP和IP协议,所以互联网协议可以简称为TCP/IP协议
IP地址:如果想要连接一台电脑,我们就需要知道这台电脑的标识,互联网上为每台电脑都提供一个唯一的标识,这个标识就是ip地址,类似于
IP地址对应的实际上是计算机的网路接口123.123.123.123
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.1GET:表示的是一种请求方式,将从服务器直接获取数据(网址必须是完整的)# 请求方式通常使用两种: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() 按字节拼接 整体为字节类型bytesdataStr = 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及addressclientSocket, 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 socketfrom 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.创建socketserver = 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 socketclient = 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'))