TCP/UDP简介

基本概念

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'))





    原文作者:rottengeek
    原文地址: https://segmentfault.com/a/1190000014666018
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞