Socket抽象层(socket编程)

本文介绍了Socket在IT技术中的作用,包括其作为应用层和传输层之间的抽象层,展示了基于TCP和UDP协议的套接字编程,以及客户端和服务端的交互过程。详细讲解了如何创建服务器监听、接受连接并处理数据,以及客户端的连接发送和接收操作。
摘要由CSDN通过智能技术生成

Socket抽象层(socket编程)

能够唯一标示网络中的进程后,它们就可以利用Socket进行通信了,什么是Socket呢?我们经常把Socket翻译为套接字,Socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信

基于文件类型的套接字家族:
    # 套接字家族的名字:AF_UNIX

基于网络类型的套接字家族
    # 套接字家族的名字:AF_INET

                 

基于TCP协议的套接字(socket)编程

客户端和服务端应该是谁先发送消息:
客户端先发送消息,需要服务端先运行起来

服务端代码

"""服务端代码:"""
import socket
from socket import AF_INET
# socket.socket() # AF_INET, type=SOCK_STREAM: 基于TCP协议的
server=socket.socket(family=AF_INET, type=socket.SOCK_STREAM) # AF_INET, type=SOCK_DGRAM: 基于UDP协议的

# 绑定IP地址和port
server.bind(('127.0.0.1', 8000))

# 服务端做监听,也称为是半链接池(服务端能够同时等待客户端的数量)
server.listen(3)
print(123)
# 该接收客户端发来的消息
sock, addr = server.accept() #  """我们知道代码运行到这里,就会卡主,等待客户端开发链接和发送消息"""
"""sock:当前链接的客户端的链接, addr:就是客户端的地址:ip,port"""
print(234)
# 想拿到客户端实际发过来的数据
data=sock.recv(1024) # 接收的数据类型是bytes类型,二进制的 1024 代表接收的最多的字节数
print("接收客户端的数据:",data)
# 要给客户端返回一个数据
sock.send(data.upper()) # 发送的数据是字节类型的

# 关闭链接
sock.close()

server.close()

客户端代码

import socket
from socket import AF_INET
client=socket.socket(family=AF_INET, type=socket.SOCK_STREAM)
# socket.socket()

client.connect(('127.0.0.1', 8000))

# 开始给服务端发送消息
client.send('hello'.encode('utf-8'))

# 接收服务端发来的消息
data=client.recv(1024)
print("服务端发来的消息:", data)
client.close()

加上通信和通信循环

服务端代码

import socket
from socket import AF_INET
# socket.socket() # AF_INET, type=SOCK_STREAM: 基于TCP协议的
server=socket.socket(family=AF_INET, type=socket.SOCK_STREAM) # AF_INET, type=SOCK_DGRAM: 基于UDP协议的

# 绑定IP地址和port
server.bind(('127.0.0.1', 8000))

# 服务端做监听,也称为是半链接池(服务端能够同时等待客户端的数量)
server.listen(3)

while True:
    # 该接收客户端发来的消息
    sock, addr = server.accept() #  """我们知道代码运行到这里,就会卡主,等待客户端开发链接和发送消息"""
    """sock:当前链接的客户端的链接, addr:就是客户端的地址:ip,port"""

    while True:
        # 想拿到客户端实际发过来的数据
        try:
            """客户端发送过来的数据是个空,或者"""
            data=sock.recv(1024) # 接收的数据类型是bytes类型,二进制的 1024 代表接收的最多的字节数
            print("接收客户端的数据:",data)
            # 要给客户端返回一个数据
            sock.send(data.upper()) # 发送的数据是字节类型的
        except Exception as e:
            print(e)
            break
    # 关闭链接
    sock.close()

server.close()

客户端

import socket
from socket import AF_INET
client=socket.socket(family=AF_INET, type=socket.SOCK_STREAM)
# socket.socket()

client.connect(('127.0.0.1', 8000))

while True:
    send_data = input('请输入你要发送给服务端的数据:')

    # 开始给服务端发送消息
    client.send(send_data.encode('utf-8'))

    # 接收服务端发来的消息
    data=client.recv(1024)
    print("服务端发来的消息:", data)
client.close()

基于UDP协议的套接字编程

"""客户端"""

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 数据报协议-》UDP

while True:
    msg = input('>>: ').strip()  # msg=''
    client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8080))
    data, server_addr = client.recvfrom(1024)
    print(data)

client.close()

"""服务端"""

import socket

server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 数据报协议-》UDP
server.bind(('127.0.0.1', 8080))

while True:
    """client_addr: 客户端的地址"""
    data, client_addr = server.recvfrom(1024) # 接收的最大字节数
    print('===>', data, client_addr)
    server.sendto(data.upper(), client_addr)

server.close()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值