欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python高级编程——网络编程(三)

程序员文章站 2022-06-24 08:01:51
TCP和并发服务器 与UDP不同的是,他是一个面向连接的,可靠的数据传输协议 TCP通信比较复杂 先写一个TCP服务器,一般步骤如下: 1、首先是要创建一个socket套接字:socket() 2、服务器一般是需要一个固定的IP地址和固定端口号,服务器就要绑定这个IP地址和端口号:bind() 3、 ......

tcp和并发服务器

与udp不同的是,他是一个面向连接的,可靠的数据传输协议

tcp通信比较复杂

先写一个tcp服务器,一般步骤如下:

1、首先是要创建一个socket套接字:socket()

2、服务器一般是需要一个固定的ip地址和固定端口号,服务器就要绑定这个ip地址和端口号:bind()

3、客户端连接服务器是是有一定的数量(允许最大连接数)的,而这个数量是服务器设定的:listen()

4、上面3步是做被连接的准备,这一步是来接受客户端的数据,在接受数据之前,服务器还是需要接受客户端的socket套接字和ip地址:accept()

5、只有服务器和客户端绑定相同的ip地址,服务器和客户端才可以互相接收数据和发送数据,常理来想,服务器是一只被开启的,也是一直接受数据,所以在接受数据的过程中,我们需要无限循环:recv()

6、如果我们要发送数据给客户端,客户端也需要绑定上面的地址,然后需要调用相应的函数send()

import socket


# tcp
# 创建一个服务器socket套接字
server_socket = socket.socket(socket.af_inet, socket.sock_stream)
# 服务器的ip地址和端口号
address = ("127.0.0.1", 9999)
# 服务器绑定地址
server_socket.bind(address)
# 设置服务器的最大连接数
server_socket.listen(1)
# 创建一个等待连接的客户端socket套接字,accept()函数会返回两个值,可以自行打印
client_socket, address = server_socket.accept()
# 服务器需要不停的接受客户端的发来的数据
while true:
    """
    以防客户端连接失败,需要检测异常
    无论是接受数据还是发送数据,我们需要将数据统一编码和解码
    """
    try:
        data = client_socket.recv(2048).decode("utf-8")
        # 数据处理
        print("服务器接受的数据:", data)   # 服务器接受的数据:我是一个客户端
        client_socket.send("我是一个服务器".encode("utf-8"))
    except:
        break

再写一个tcp客户端,一般步骤如下:

1、首先是要创建一个socket套接字:socket()

2、客户端一般是不需要一个固定的ip地址和固定端口号,连接服务器的时候系统会自动分配端口号

3、客户端连接服务器必须先知道服务器的ip地址和端口号,然后在连接服务器:connect()

4、上面3步是做连接的准备,这一步是来发送客户端的数据:send()

5、客户端也可以一直接受服务器发来的数据,所以在接受数据的过程中,我们需要无限循环:recv()

import socket

# 客户端需要创建一个套接字
client_socket = socket.socket(socket.af_inet, socket.sock_stream)

# 客户端需要连接服务器,必须先知道服务器的ip地址和端口号
address = ("127.0.0.1", 9999)

# 连接服务器
client_socket.connect(address)

# 这个数据是将要发送的数据
data = "我是一个客户端"
client_socket.send(data.encode("utf-8"))
while true:
    """
    以防服务器中断退出,需要检测异常
    无论是接受数据还是发送数据,我们需要将数据统一编码和解码
    """
    try:
        data = client_socket.recv(2048).decode("utf-8")
        # 数据处理,这里打印出来并且将数据发回客户端
        print("客户端接受的数据:", data)
    except:
        break

 并发服务器,这里我只介绍多线程服务器,进程和线程是差不多的)

  在tcp服务器的原有基础上增加一个线程,再将监听数增加为5,就可以允许5个客户端线程同时访问,并且可同时发送和接受数据

import socket
from threading import thread


# tcp
# 创建一个服务器socket套接字
server_socket = socket.socket(socket.af_inet, socket.sock_stream)
# 服务器的ip地址和端口号
address = ("127.0.0.1", 9999)


def net_connect():
    try:
        # 服务器绑定地址
        server_socket.bind(address)
        # 设置服务器的最大连接数
        server_socket.listen(5)
    except:
        return
    # 创建线程
    th = thread(target=recv_data)
    th.start()


def recv_data():
    # 服务器需要不停的接受客户端的发来的数据
    while true:
        """
        以防客户端连接失败,需要检测异常
        无论是接受数据还是发送数据,我们需要将数据统一编码和解码
        """
        # 创建一个等待连接的客户端socket套接字,accept()函数会返回两个值,可以自行打印
        client_socket, address = server_socket.accept()try:
            data = client_socket.recv(2048).decode("utf-8")
            # 数据处理
            print("服务器接受的数据:", data)
            client_socket.send("我是一个服务器".encode("utf-8"))
        except:
            break


net_connect()

 

在tcp客户端上也增加一个线程,然后同时运行多次这个客户端程序:

import socket

# 客户端需要创建一个套接字
from threading import thread

client_socket = socket.socket(socket.af_inet, socket.sock_stream)

# 客户端需要连接服务器,必须先知道服务器的ip地址和端口号
address = ("127.0.0.1", 9999)


def net_connect():
    try:
        # 连接服务器
        client_socket.connect(address)
    except:
        return
    th = thread(target=recv_data)
    # th.setdaemon(true)
    th.start()


def recv_data():
    # 这个数据是将要发送的数据
    data = "我是一个客户端"
    client_socket.send(data.encode("utf-8"))

    while true:
        """
        以防服务器中断退出,需要检测异常
        无论是接受数据还是发送数据,我们需要将数据统一编码和解码
        """
        try:
            data = client_socket.recv(2048).decode("utf-8")
            # 数据处理,这里打印出来并且将数据发回客户端
            print("客户端接受的数据:", data)
        except:
            break


net_connect()