网络编程

UDP介绍

每个Ip地址包括两部分:网络地址和主机地址

知名端口号:0 - 1023。不能随便用,有特殊用途。

1024到65535,随便用。

 udp实现发送数据

import socket


def main():
    # 创建套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 发送的数据
    content = input("请输入你要发送的内容:")
    # 目标地址
    desk_addr = ("127.0.0.1", 8080)
    # 发数据
    udp_socket.sendto(content.encode("utf-8"), desk_addr)
    # 关闭套接字
    udp_socket.close()


if __name__ == "__main__":
    main()

 udp实现接收数据

import socket


def main():
    # 创建套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 本地端口
    local_addr = ("", 7788)  # ip地址不写表示本机任意一个ip
    # 绑定本地端口
    udp_socket.bind(local_addr)
    # 接收数据
    rev_data = udp_socket.recvfrom(1024)  # 1024表示本次接受的最大字节数
    # 打印数据.(接受到的是一个元组)
    rev_msg = rev_data[0]  # 接收到的数据
    send_addr = rev_data[1]  # 发送方的地址
    print("%s: %s" % (str(send_addr), rev_msg.decode("gbk")))  # windows的编码方式是gbk
    udp_socket.close()


if __name__ == "__main__":
    main()

单工:类似于收音机

半双工:类似于对讲机

全双工:类似于手机

socket属于全双工


TCP介绍

udp和tcp的区别:udp类似写信模型,每次通信都要带上ip地址和端口等。有可能丢数据,不安全。

tcp类似于打电话,建立连接过程比udp复杂,但是安全。

# tcp-client
import socket

def main():
    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_ip = ""
    server_port = 8080
    # 连接服务器
    tcp_socket.connect((server_ip, server_port))
    send_data = input("请输入你要发送的数据")
    # 发送数据
    tcp_socket.send(send_data.encode("utf-8"))
    # 接受数据
    rev_data = tcp_socket.recv(1024)
    print(rev_data.decode("gdb"))
    tcp_socket.close()


if __name__ == "__main__":
    main()

# tcp_server
import socket


def main():
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp_server.bind("", 7788)
    # 监听套接字,负责 等待有新的客户端进行连接
    tcp_server.listen(128)  # 让默认的套接字由主动变为被动
    # client_addr为连接的客户端地址
    # accept产生的新的套接字用来为客户端服务
    new_client_socket, client_addr = tcp_server.accept()
    # 接收数据
    recv_data = new_client_socket.recv(1024)
    print(recv_data)
    # 发送数据
    new_client_socket.send("hahaha".encode("utf-8"))
    new_client_socket.close()
    tcp_server.close()


if __name__ == "__main__":
    main()

跟udp的区别就是多了监听listen,而且用accept接受连接,产生新的套接字用来为客户端服务

同时为多个客户端服务

# tcp-server
import socket


def main():
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp_server.bind("", 7788)
    # 监听套接字,负责 等待有新的客户端进行连接
    tcp_server.listen(128)  # 让默认的套接字由主动变为被动
    # client_addr为连接的客户端地址
    # accept产生的新的套接字用来为客户端服务
    while True:
        new_client_socket, client_addr = tcp_server.accept()
        while True:
            # 接收数据
            recv_data = new_client_socket.recv(1024)
            print(recv_data)
            # 如果recv解堵塞,那么有2种方式:
            # 1、客户端发送过来数据
            # 2、客户端调用close()导致了这里recv解堵塞
            if recv_data:
                # 发送数据
                new_client_socket.send("hahaha".encode("utf-8"))
            else:
                break
        new_client_socket.close()

    tcp_server.close()


if __name__ == "__main__":
    main()

 

客户端解堵塞的情况:1、接收到数据;2、调用close()关闭连接。

可以通过数据是否为空判断是哪种类型

udp:                                tcp(client)                               tcp(server)
socket                              socket                                    socket
bind                                conect                                    bind
sendto/recvfrom                     send/recv                                 listen                                                                            
close                               close                                     accept  
                                                                              recv/send
                                                                              close                                                                       
原文地址:https://www.cnblogs.com/linyuhong/p/10015425.html