108.网络编程-TCP/UDP

网络编程-TCP/UDP

基本概念

  • IP地址:在互联网上定位一部计算机
    • 192.168.000.000:局域网IP
    • 127.0.0.1:指本机
  • 端口:本机中各个软件的编码
    • 范围0-65535
    • 知名端口:预留端口,一般0-1023
    • 非知名端口:不是预留端口,1024-65535

TCP/UDP协议

  • SOCKET编程
    • 通过IP加端口的定位方式,发送消息的机制
    • socket(套接字):是一个网络通讯的端点,能实现不同主机的进程通信,网络大多基于socket通信
    • 分为UDP和TCP
    • 客户端CLIENT
    • 服务器端SERVER
  • TCP:安全的面向连接的传输
    • 安全
    • 速度慢
  • UDP:非安全的不面向连接的传输
    • 安全性差
    • 大小限制65kb
    • 没顺序
    • 速度快
    • 即使通讯一般用UDP

UDP编程

  • Server端流程
    1. 建立socket,socket是负责具体通信的一个实例
    2. 绑定IP地址和PORT
    3. 接受对方发送内容
    4. 给对方反馈,非必须
  • Client端流程
    1. 建立socket
    2. 发送内容到服务器
    3. 接受服务器给定的反馈内容

-服务器端

import socket
#建立socket连接
#socket.AF_INET(IPV4协议族)或AF_UNIX
#socket.SOCK_DGRAM(面向非链接UDP)或SOCK_STREAM(面向链接TCP)
s_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

#地址为tuple类型
#此处用host = socket.gethostname()获取本机名代替127.0.0.1也可
addr = ("127.0.0.1", 9550)
s_sock.bind(addr)

#.recvfrom()返回的是一个tuple类型,第一个为接收内容,第二个为对方的地址
#参数值为缓冲区大小
#data是bytes格式,必须通过解码,才能得到str格式内容
js_data, df_addr = s_sock.recvfrom(500)

#解码data信息.decode()默认是utf-8编码
jm_data = js_data.decode("utf-8")

print(jm_data)

#要给对方发送的消息
fs_data = "你是谁啊?~~~"
#编码消息,接受的编码和发送的编码必须一致
bm_data = fs_data.encode("utf-8")
#发送编码
#.sendto()是UDP .send()是TCP
s_sock.sendto(bm_data, df_addr)

s_sock.close()
  • 客户端
import socket

#建立连接
s_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

#要发送的信息
fs_data = "你好啊~~"

#编码消息
bm_data = fs_data.encode("utf-8")

#发送信息
addr = ("127.0.0.1", 9550)
s_sock.sendto(bm_data, addr)

#接收消息
js_data, addr = s_sock.recvfrom(500)

#解码消息
jm_data = js_data.decode("utf-8")

print(jm_data)

s_sock.close()

TCP编程

  • Server端的流程
    1. 建立socket,可以理解为只是负责接受对方请求
    2. 绑定端口及地址
    3. 监听接入的访问socket
    4. 接受访问的socket,可以理解为真正的建立连接
    5. 接收消息
    6. 给对方反馈,如果有必要
    7. 关闭链接
  • Client端的流程
    1. 建立socket通信
    2. 请求和对方建立通路
    3. 发送信息
    4. 接收反馈,如果有必要
    5. 关闭链接
  • 服务器端
import socket

s_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

addr = ("127.0.0.1", 9550)
s_sock.bind(addr)

s_sock.listen()

while True:

    #接收客户端建立连接的请求,并建立通讯链路
    #返回值 第一个为真正建立的链路 第二个为对方地址
    rel_sock, addr = s_sock.accept()

    #接收信息
    #500是接收的最大数据量
    js_data = rel_sock.recv(500)

    #解码
    jm_data = js_data.decode("utf-8")

    print(jm_data, addr)

    #编码
    fs_data = "你是谁啊? ~~"
    bm_data = fs_data.encode("utf-8")

    #发送
    rel_sock.send(bm_data)

    rel_sock.close()
  • 客户端
import socket

s_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#通过服务器的IP,和服务器建立连接
fwq_addr = ("127.0.0.1", 9550)
s_sock.connect(fwq_addr)

#编码信息
fs_data = "你好啊~~"
bm_data = fs_data.encode("utf-8")

#发送信息
s_sock.send(bm_data)

#接收信息
js_data = s_sock.recv(500)

#解码信息
jm_data = js_data.decode("utf-8")

print(jm_data)

s_sock.close()

猜你喜欢

转载自www.cnblogs.com/TK-tank/p/12329241.html