使用 python socket 实现UDP/TCP网络通信

这篇具有很好参考价值的文章主要介绍了使用 python socket 实现UDP/TCP网络通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

目录

1.socket简介

2.创建socket

2.1创建UDPSocket

2.2创建TCPSocket

3.使用UDPSocket发送数据并接收

4.使用UDPSocket发送广播

5.UDPSocket聊天器 (多线程实现消息的收发功能)

6.使用TCPSocket建立客户端

7.使用TCPSocket建立服务端


1.socket简介

       socket(简称:套接字),是支持TCP和UDP(网络传输方式)网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。

        它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于socket来完成通信的,例如浏览的网页、qq聊天、收发email等等。

使用 python socket 实现UDP/TCP网络通信

2.创建socket

        socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用打开、读写、关闭模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket类就是对其进行的操作(读写IO、打开、关闭)

在Python中使用socket模块的socket类来完成:

import socket
socket.socket(AddressFamily, Type)

说明:

        1. 参数:AddressFamily(地址簇)

        socket.AF_INET IPv4          (默认)       

        socket.AF_INET6 IPv6

        socket.AF_UNIX                    只能够用于单一的Unix系统进程通信

        2.参数:Type(类型)

        socket.SOCK_STREAM        流式socket,for TCP(默认)

        socket.SOCK_DGRAM         数据报式socket,for UDP

2.1创建UDPSocket

import socket


# 使用IPv4 UDP方式来创建套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  # 参数socket.AF_INET表示使用IPv4,参数socket.SOCK_DGRAM表示使用UDP

# 省略数据传递过程

# 关闭套接字
udp_socket.close()

2.2创建TCPSocket

import socket


# 使用IPv4 TCP方式来创建套接字
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  # 参数socket.AF_INET表示使用IPv4,参数socket.SOCK_STREAM表示使用TCP

# 省略数据传递过程

# 关闭套接字
tcp_socket.close()

3.使用UDPSocket发送数据并接收

核心方法:

        socket.sendto

sendto方法的参数:

        1.要发送的二进制数据        (使用.encode()方法可以将字符串转为二进制)

        2.接收者的ip地址和端口号  (元组类型:("127.0.0.1", 8080))

import socket


# 使用IPv4 UDP方式来创建套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

#2.绑定一个本地信息
localaddr = ("192.168.68.196",8081)
udp_socket.bind(localaddr)

# 发送数据
udp_socket.sendto("hello".encode(),("192.168.68.196",8080))

# 关闭套接字
udp_socket.close()

接收数据(两种方式):

        方式一:通过网络调试助手接收(下载地址:NetAssist.exe下载)

使用 python socket 实现UDP/TCP网络通信

对于接收到的中文是乱码的问题:

        可能是由于encode()方法默认使用UTF-8的编码方式

.encode()

 将其改为gb2312编码方式:

.encode("gb2312")

如下图标注部分为修改编码方式前后的对比: 

使用 python socket 实现UDP/TCP网络通信

        方式二:通过python代码制作一个接收端

import socket

def main():
    #1.创建套接字
    udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

    #2.绑定一个本地信息
    localaddr = ("192.168.68.196",8080)
    udp_socket.bind(localaddr)

    #3.接收数据
    while True:
        recv_data = udp_socket.recvfrom(1024) #1024表示每次接收1024字节
        recv_msg = recv_data[0] #存储接收到的数据
        send_addr = recv_data[1]#存储发送方的地址信息

    #4.打印接收到的数据
    # print(recv_data)
        print("%s:%s" % (str(send_addr),recv_msg.decode("gb2312")) )

    #5.关闭套接字
    udp_socket.close()

if __name__ == "__main__":
    main()

4.使用UDPSocket发送广播

        广播地址(Broadcast Address)是专门用于同时向网络中所有工作站进行发送的一个地址。在使用TCP/IP 协议的网络中,主机标识段host ID 为全1 的IP 地址为广播地址,广播的分组传送给host ID段所涉及的所有计算机。例如,对于10.1.1.0 (255.0.0.0 )网段,其广播地址为10.255.255.255 (255 即为二进制的11111111 ),当发出一个目的地址为10.255.255.255 的分组(封包)时,它将被分发给该网段上的所有计算机。

import socket


# 使用IPv4 UDP方式来创建套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

#2.绑定一个本地信息
localaddr = ("192.168.68.196",8081)
udp_socket.bind(localaddr)

# 设置允许发送广播
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)

# 发送信息
udp_socket.sendto("大家好,我宣布个事儿".encode("gb2312"), ("255.255.255.255", 8080))

# 关闭套接字
udp_socket.close()

运行结果:(此时处于同一网段,端口为8080的客户端应该都能接收到广播信息)

使用 python socket 实现UDP/TCP网络通信

5.UDPSocket聊天器 (多线程实现消息的收发功能)

实现效果:

python UDPSocket聊天器 (多线程实现消息的收发功能)

代码:

import socket
from threading import Thread,Lock

def send_msg(udp_socket):
    """发送信息的函数"""
    while True:
        input_msg = input("请输入聊天内容:\n")  # 用户输入一些信息
        udp_socket.sendto(input_msg.encode("gb2312"), ("192.168.68.196", 8081))

def recv_msg(udp_socket):
    """接收信息的函数"""
    while True:
        recv_data, tuple_ip_port = udp_socket.recvfrom(1024)
        recv_text = recv_data.decode("gb2312")
        print("接受到[%s]的信息:%s" % (str(tuple_ip_port), recv_text))

def main():
    # 创建套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 绑定端口
    udp_socket.bind(("", 8080))

    # 接收信息
    t1 = Thread(target=recv_msg, args=(udp_socket,))
    t1.start()

    # 发送信息
    t2 = Thread(target=send_msg, args=(udp_socket,))
    t2.start()

    # # 关闭套接字
    # udp_socket.close()

if __name__ == '__main__':
    main()

6.使用TCPSocket建立客户端

import socket

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

# 建立连接
tcp_client_socket.connect(("192.168.68.196", 8081))

# 发送数据
tcp_client_socket.send("你好".encode("gb2312"))

# 接收数据
recv_data = tcp_client_socket.recv(1024).decode("gb2312")
print(recv_data)

# 关闭套接字
tcp_client_socket.close()

7.使用TCPSocket建立服务端

        ·能够实现一个客户端发来的多条信息

        ·能够接收多个客户端连接

import socket
from threading import Thread


def new_client_connect(new_client_socket, client_ip_port):
    while True:
        # 收发数据
        recv_data = new_client_socket.recv(1024)
        if len(recv_data) != 0:
            recv_text = recv_data.decode("gb2312")
            print("接收到[%s]的信息:%s" % (str(client_ip_port), recv_text))
        else:
            print("客户端断开连接")
            break

        # # 关闭连接
        # new_client_socket.close()  # 表示断开与当前的客户端的通信

def main():
    # 创建套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 绑定端口和ip
    tcp_server_socket.bind(("", 8081))

    # 设置套接字为被动监听模式,不能主动发送数据,128为允许接收的最大连接数
    tcp_server_socket.listen(128)

    while True:
        # 接收客户端连接
        new_client_socket, client_ip_port = tcp_server_socket.accept()

        t1 = Thread(target=new_client_connect, args=(new_client_socket, client_ip_port))
        t1.start()

        # tcp_server_socket.close()  # 表示不再接受新客户端的连接,已经连接的可以继续服务

if __name__ == '__main__':
    main()

 效果:

python TCPSocket服务器 (多线程实现消息的接收功能)文章来源地址https://www.toymoban.com/news/detail-409054.html

到了这里,关于使用 python socket 实现UDP/TCP网络通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于UDP/TCP的网络通信编程实现

    红色是心中永不褪色的赤诚 操作系统为网络编程提供了 Socket api , Socket是基于TCP/IP协议的网络通信的基本单元, 基于Socket的网络程序开发就是 网络编程. 由于直接与应用层联系的是传输层, 所以针对应用层协议(TCP, UDP), Shocket提供了三种套接字, 分别是 流套接字(使用TCP) , 数据报

    2024年02月08日
    浏览(51)
  • Java【网络编程2】使用 TCP 的 Socket API 实现客户端服务器通信(保姆级教学, 附代码)

    📕各位读者好, 我是小陈, 这是我的个人主页 📗小陈还在持续努力学习编程, 努力通过博客输出所学知识 📘如果本篇对你有帮助, 烦请点赞关注支持一波, 感激不尽 📙 希望我的专栏能够帮助到你: JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统

    2024年02月05日
    浏览(62)
  • 【Unity】Socket网络通信(TCP) - 实现简单的多人聊天功能

    多客户端连接服务器其原理是在服务端保存客户端连入后与客户端通信的socket,由于等待客户端连接会阻塞主线程,所以结合多线程就能实现多客户端连入功能。多人聊天只需要将A客户端发来的消息,转发给除A客户端外的其他客户端,即可实现。如果你还不怎么熟悉服务端

    2024年02月03日
    浏览(62)
  • 【Java网络编程】基于UDP-Socket 实现客户端、服务器通信

    ​ 哈喽,大家好~我是你们的老朋友: 保护小周ღ   本期为大家带来的是网络编程的 UDP Socket 套接字,基于 UDP协议的 Socket 实现客户端服务器通信 ,Socket 套接字可以理解为是,传输层给应用层提供的一组 API,如此程序,确定不来看看嘛~~ 本期收录于博主的专栏 : JavaEE_保

    2024年02月02日
    浏览(62)
  • socket概述 python中如何使用TCP/UDP协议实现通信-教程

    很多编程语言中,都 使用scoket套接字实现网络通信。 Socket是对TCP/IP协议的封装,Socket本身就是一个调用接口(API),方便程序员用Socket使用TCP/IP协议簇,实现网络通信。 不同编程语言,shiyongSocket通信的语法有所区别,但基本原理类型相似。 它的两种方式,分别是TCP和UDP协

    2024年02月13日
    浏览(41)
  • 「网络编程」第二讲:网络编程socket套接字(三)_ 简单TCP网络通信程序的实现

    「前言」文章是关于网络编程的socket套接字方面的,上一篇是网络编程socket套接字(二),下面开始讲解!  「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 「枫叶先生有点文青病」「每篇一句」 I do not know where to go,but I have been on the road. 我不知

    2024年02月11日
    浏览(50)
  • Linux网络编程:socket、客户端服务器端使用socket通信(TCP)

    socket(套接字),用于网络中不同主机间进程的通信。 socket是一个伪文件,包含读缓冲区、写缓冲区。 socket必须成对出现。 socket可以建立主机进程间的通信,但需要协议(IPV4、IPV6等)、port端口、IP地址。          (1)创建流式socket套接字。                 a)此s

    2024年02月11日
    浏览(62)
  • Socket网络编程(TCP/IP)实现服务器/客户端通信。

    一.前言 回顾之前进程间通信(无名管道,有名管道,消息队列,共享内存,信号,信号量),都是在同一主机由内核来完成的通信。 那不同主机间该怎么通信呢? 可以使用Socket编程来实现。 Socket编程可以通过网络来实现实现不同主机之间的通讯。 二.Socket编程的网络模型如

    2024年02月08日
    浏览(83)
  • 【网络】socket——预备知识 | 套接字 | UDP网络通信

    🐱作者:一只大喵咪1201 🐱专栏:《网络》 🔥格言: 你只管努力,剩下的交给时间! 在前面本喵对网络的整体轮廓做了一个大概的介绍,比如分层,协议等等内容,现在我们直接进入socket(套接字)编程,先来感受到网络编程。 我们知道,在网络通信中,存在两套地址,一

    2024年02月13日
    浏览(51)
  • unity Sockets通信 使用UDP协议,设置客户端电脑网络配置,使用新线程获取数据,解决卡顿问题,

    今天调试和服务器连接,发现始终获取不到服务器的数据, 电脑和服务器都在同一局域网,仍然获取不到, 下面是电脑环境配置, 第一步: 设置网络为专用网络,然后点击配置防火墙和安全设置,关闭防火墙 (点击所连接的wifi的属性) 第二步:设置出站 入站规则 点击高

    2024年02月07日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包