socket 网络编程

本文介绍了使用Python的Socket库进行网络通信的基本操作,包括UDP的单播收发数据和广播发送,以及TCP的收发数据测试和服务器端实现。示例代码展示了如何创建和管理Socket对象,进行数据的编码与解码,以及连接和关闭套接字。
摘要由CSDN通过智能技术生成

Socket是两个程序之间的双向通信链路。它是一种网络通信协议,用于不同计算机之间的进程间通信或同一计算机内部进程之间的通信。

import socket

s = socket.socket(AddressFamily, Type) # 创建socket套接字对象
# Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET
# Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)

s.close() # 关闭套接字

UDP

1、单播收发数据测试

import socket

udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 创建udp套接字

local_addr = ('127.0.0.1',8887) # 这里ip不写默认为本机ip,需要先绑定再发送
udp_socket.bind(local_addr) # 设置发送源ip + 端口

dest_addr = ('127.0.0.1',8888) # 设置目标ip + 端口
data = input("输入发送数据:")
send_data = udp_socket.sendto(data.encode('utf-8'), dest_addr) # 发送数据


receive_data = udp_socket.recvfrom(1024) # 一直等待(堵塞),直到接收到数据为止
print("从{}的{}端口接收到信息:{}".format(receive_data[1][0],receive_data[1][1],receive_data[0].decode('utf-8'))) 

udp_socket.close()

在这里插入图片描述

在这里插入图片描述

2、广播发送

import socket

udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 创建udp套接字
udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST, 1) # 设置允许该udp套接字进行广播
dest_info = ('<broadcast>',9001) # 设置广播地址与端口

data = input("请输入要发送数据")
udp_socket.sendto(data.encode('utf-8'),dest_info) # 发送数据

udp_socket.close()

TCP

1、收发数据测试

# -*- coding: utf-8 -*-
import socket

tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建tcp套接字

tcp_socket.connect(("127.0.0.1", 9002)) # 连接目标服务器+端口

send_data = input("输入发送数据:")
tcp_socket.send(send_data.encode("utf-8")) # 发送数据

receive_data =  tcp_socket.recv(1024) # 接收数据
print("收到返回信息: ", receive_data.decode('utf-8'))

tcp_socket.close()  # 关闭套接字

发送数据:
在这里插入图片描述
在这里插入图片描述
接收数据:
在这里插入图片描述
在这里插入图片描述

2、TCP 服务端

# -*- coding: utf-8 -*-
import socket

tcpServer_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建等待客户端连接的tcp套接字
tcpServer_socket.bind(("", 8899)) # 绑定本地端口
tcpServer_socket.listen(128) # 更改为监听模式

connectionNewSocket,  connectionInfo = tcpServer_socket.accept() # 等待客户端连接
print(connectionNewSocket) # 返回一个新的专门用于与客户端通信的套接字
print(connectionInfo) # 返回客户端ip与端口

while 1:
    receive_data = connectionNewSocket.recv(1024) # 接收客户端发来的信息
    """
    如果客户端关闭,则会发过来空信息,此时进行判断
    有信息则不关闭tcp连接需要循环接收信息
    无信息则表示客户端主动关闭连接,此时服务端再关闭连接
    """
    if len(receive_data) != 0:
        print("从{}的{}端口发来信息:{}".format(connectionInfo[0], connectionInfo[1], receive_data.decode("utf-8")))
    else:
        print("客户端已关闭")
        connectionNewSocket.close()
        break

tcpServer_socket.close()

在这里插入图片描述
在这里插入图片描述
此时客户端关闭连接:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值