python高级语法-python网络编程(套接字编程)之UDP和TCP编程

存在两类协议UDP和TCP协议,前者是不安全的不面向链接的传输,速度快,后者是安全的面向链接的传输,速度慢。

下面主要演示两种编程实现简单的聊天:

   首先,必须明确服务器和客户端的区别:

                    在服务器端连接ip地址和端口唯一指定这个程序,接受访问,给与反馈,优秀的服务器永远不会停止运行。

                     在客户端访问服务器,发送消息,给与反馈。

所有都要求先有服务器开启才能客户端连接。

UDP示例代码:

服务器端代码

import socket
def serverFunc():
    # 建立socket
    # socket.AF_INET使用ipv4协议族
    # socket.SOCK_DGRAM使用udp通讯
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 绑定ip和port
    # 127.0.0.1代表机器本身(这里也可以指定其他ip地址)
    # 端口7852(随机选择一个而已)
    # 地址是一个tuple类型。(ip,port)
    addr = ("127.0.0.1", 7677)
    sock.bind(addr)
    # 接受对方消息
    # 等待方式为死等,没有其他可能性
    # recvfrom接受的返回值是一个tuple, 前一项表示数据,后一项表示地址
    # 参数的含义是缓冲区大小
    while True:
        data, addr = sock.recvfrom(500)
        # 发送过来的数据是byte 类型,解码才得字符串
        print("收到消息:"+data.decode())
        rsp = input("发送消息:")
        # 发送数据编码成为byte
        data = rsp.encode()
        sock.sendto(data, addr)
if __name__ == '__main__':
        print("start  Server")
        serverFunc()
        print("end  Server")

客户端代码:

import socket
def clientFunc():
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    while True:
        text = input("发送消息:")
        # 发送的str必须编码
        data = text.encode()
        # 向该位置发送数据
        sock.sendto(data, ("127.0.0.1", 7677))
        # 接受反馈
        data, addr = sock.recvfrom(200)
        # 解码数据
        data = data.decode()
        print("收到消息:"+data)
if __name__ == '__main__':
    clientFunc()

演示结果:

TCP示例代码:(具体内容不备注,类似上面)

服务器端代码:

import socket
def tcp_srv():
    # 建立socket进行通讯
    # socket.AF_INET使用ipv4协议族
    # socket.SOCK_STREAM使用tcp通讯
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 绑定端口和地址
    addr = ("127.0.0.1", 8990)
    sock.bind(addr)
    # 监听接入访问的socket
    sock.listen()
    while True:
        # 接受访问的socket
        skt, addr = sock.accept()
        # 获得为bytes格式
        msg = skt.recv(200)
        msg = msg.decode()
        rst = "收到消息:{}".format(msg)
        print(rst)
        # 发送反馈
        msg = input("发送消息:")
        skt.send(msg.encode())
        # 关闭链接通路
        skt.close()
if __name__ == '__main__':
    print("start Server")
    tcp_srv()
    print("end Server")

客户端代码:

import socket
def tcp_clt():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    addr = ("127.0.0.1", 8990)
    sock.connect(addr)
    # 发送内容到服务器
    while True:
        msg = input("发送消息:")
        sock.send(msg.encode())
        # 接受反馈
        rst = sock.recv(200)
        print("收到消息"+rst.decode())
    # 关闭链接通路
    sock.close()
if __name__ == '__main__':
    tcp_clt()

演示结果:

猜你喜欢

转载自blog.csdn.net/zhouchen1998/article/details/81238138