学习笔记——网络编程(二)

Socket是应用层与TCP/IP协议通信的接口,分为基于文件型和网络型。TCP套接字提供可靠的面向连接服务,适合数据传输,而UDP套接字是无保障的面向消息服务,适合广播。文章通过Python代码示例展示了TCP和UDP服务器及客户端的创建和通信过程。
摘要由CSDN通过智能技术生成

Socket

  • socket,简称“套接字”,是进程间通信的一种方式。
  • Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。
  • 套接字有两种(或称为有两个种族),分别是基于文件型的和基于网络型的。
import socket
socket.socket(family=AF_INET,type=SOCK_STREAM,proto=0,fileno=None)
对象说明备注
family地址系列应为AF_INET(默认值)、AF_INET6、AF_UNIX、AF_CAN或AF_RDS。AF_UNIX 域实际上是使用本地 socket 文件来通信。
type套接字类型应为SOCK_STREAM(默认值)、SOCK_DGRAM、SOCK_RAW或其他SOCK_常量之一。SOCK_STREAM 是基于TCP的,有保障的(即能保证数据正确传送到对方)面向连接的SOCKET,多用于资料传送。SOCK_DGRAM 是基于UDP的,无保障的面向消息的socket,多用于在网络上发广播信息。
proto协议号通常为零,可以省略,或者在地址族为AF_CAN的情况下,协议应为CAN_RAW或CAN_BCM之一。
fileno若指定了fileno,则其他参数将被忽略,导致带有指定文件描述符的套接字返回。与socket.fromfd()不同,fileno将返回相同的套接字,而不是重复的。这可能有助于使用socket.close()关闭一个独立的插座。

基于TCP协议的socket

  • TCP通信需要经过创建连接、数据传送、终止连接三个步骤。
  • TCP通信模型的通信类似于生活中的“打电话”。

面向连接

  • 完成数据交换后,双方必须断开此连接,以释放系统资源。
  • 这种连接是一对一的,因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议。

可靠传输

  • 发送应答机制

TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功

  • 超时重传

发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。

  • 错误校验

TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

  • 流量控制和阻塞管理

流量控制用来避免主机发送得过快而使接收方来不及完全收下。

TCP和UDP通信模型

TCP服务器端(server) 

import socket

# 1. 创建套接字
server_socket = socket.socket()
# 2. 绑定ip和端口
server_socket.bind(("192.168.0.1", 8899))
# 3. 监听(被动)
server_socket.listen(120)
# 4. 等待客户端连接,是阻塞状态
while True:
    client_socket,client_addr = server_socket.accept()   # 接受客户端链接
    server_data = client_socket.recv(1024)                   # 接收客户端数据
    print("服务器收到的数据为:", server_data.decode("utf-8"))   # 打印客户端数据
    buf = "hello 我是TCP服务器"                         # 向客户端发送数据
    client_socket.send(buf.encode("utf-8"))     # 向客户端发送数据
# 5.关闭套接字
client_socket.close()
server_socket.close()

TCP客户端(client)

import socket

# 1. 创建socket套接字
client_socket = socket.socket()
# 2. 连接服务器
client_socket.connect(('192.168.0.1',8899))
# 3. 发送数据
send_data = input("请输入要发送的数据:")
client_socket.send(send_data.encode("utf-8"))
# 4. 和服务器对话(发送/接收)
data = client_socket.recv(1024)
print(data.decode("utf-8"))
# 5. 关闭客户端套接字
client_socket.close()

UDP服务器端(server)

import socket

# 1. 创建套接字
udp_server = socket.socket(type=socket.SOCK_DGRAM)
# 2. #绑定ip和端口
udp_server.bind(('192.168.0.1',8899))
msg, addr = udp_server.recvfrom(1024)
print(msg)
# 3. 对话(接收与发送)
udp_sk.sendto(b'hi',addr)
# 4. 关闭套接字
udp_sk.close()

UDP客户端(client)

import socket

# 1. 创建套接字
udp_client = socket.socket(type=socket.SOCK_DGRAM)
# 2. 发送
udp_client.sendto(b'hello',("192.168.0.1",8899))

文件下载服务器

import socket


def send_file(new_socket,new_addr):
    # 接收客户端的文件名
    file_name = new_socket.recv(1024).decode("utf-8")
    print(f"客户端下载的文件名是:{file_name}")
    file_content = None
    try:
        f = open(file_name,"rb")
        file_content = f.read()
        f.close()
    except Exception as ret:
        print(f"没有要下载的文件:{file_name}")

    # 发送文件的数据给客户端
    if file_content:
        new_socket.send(file_content)


def main():
    # 1. 2. 3. 4. 5. 
    server_socket = socket.socket()
    server_socket.bind(("192.168.0.1",8899))
    server_socket.listen(126)
    new_socket,new_addr = server_socket.accept()
    send_file(new_socket,new_addr)

文件下载客户端

import socket


def main():
    # 1. 2. 3. 
    tcp_socket = socket.socket()
    server_addr = (input("请输入ip:"), int(input("请输入端口:")))
    tcp_socket.connect(server_addr)
    # 4. 获取下载文件的名字
    download_file_name = input("请输入要下载的文件名:")
    # 5. 把文件名发给服务器
    tcp_socket.send(download_file_name.encode("utf-8"))
    # 6. 接收服务器中的数据
    recv_data = tcp_socket.recv(1024)

    if recv_data:
        with open("new" + download_file_name, "wb") as f:
            f.write(recv_data)

    tcp_socket.close()

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值