python中的socket网络编程(二)

    技术2022-07-10  121

    python中的socket网络编程(二)

    1、前言

    在python中的socket网络编程(一)一文中,我们介绍了客户端的主要功能。下面我们看下服务端。

    2、具体实现

    创建socket:

    首先要创建 socket,用 Python 中 socket 模块的函数 socket 就可以完成:

    #-*- coding: utf-8 -*- import socket s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) print 'socket Created' 

    函数 socket.socket 创建一个 socket,返回该 socket 的描述符,将在后面相关函数中使用。该函数带有两个参数如下:

    Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信)Type:套接字类型,可以是 SOCKET_STREAM(流式套接字,主要用于 TCP 协议)或者SOCKET_DGRAM(数据报套接字,主要用于 UDP 协议)

    绑定socket:

    函数 bind 可以用来将 socket 绑定到特定的地址和端口上,它需要一个 sockaddr_in 结构作为参数。

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

    sys HOST = ‘’ PORT = 8888

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print 'Socket created' try: s.bind((HOST, PORT)) except socket.error , msg: print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1] sys.exit() print 'Socket bind complete'

    监听连接:

    函数 listen 可以将 socket 置于监听模式。

    s.listen(10) print 'Socket now listening'

    该函数带有一个参数称为 backlog,用来控制连接的个数。如果设为 10,那么有 10 个连接正在等待处理,此时第 11 个请求过来时将会被拒绝。

    接收连接,当有客户端向服务器发送连接请求时,服务器会接收连接。

    conn, addr = s.accept() print 'Connected with ' + addr[0] + ':' + str(addr[1])

    为了处理每个连接,我们需要将处理的程序与主程序的接收连接分开。一种方法可以使用线程来实现,主服务程序接收连接,创建一个线程来处理该连接的通信,然后服务器回到接收其他连接的逻辑上来。完整的服务端代码如下:

    import socket import sys from thread import * HOST = '' PORT = 8888 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print 'Socket created' try: s.bind((HOST, PORT)) except socket.error , msg: print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1] sys.exit() print 'Socket bind complete' s.listen(10) print 'Socket now listening' def clientthread(conn): conn.send('Welcome to the server. Type something and hit enter\n') while True: data = conn.recv(1024) reply = 'OK...' + data if not data: break conn.sendall(reply) conn.close() while 1: conn, addr = s.accept() print 'Connected with ' + addr[0] + ':' + str(addr[1]) start_new_thread(clientthread ,(conn,)) s.close()

    在命令行下运行python server.py,服务端运行结果如下: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UsvK7srF-1593526582866)(http://odsh9s4s2.bkt.clouddn.com/server-socket.png)]

    3、客户端测试

    我们使用tcp/udp socket测试工具,模仿客户端。向服务端发送字符串,服务端接收字符串,然后返回。效果如下:   [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-whygzbyK-1593526582869)(http://odsh9s4s2.bkt.clouddn.com/client-socket.png)]

    4、总结

    python网络编程服务端,我们需要经过如下五步:

    创建socket绑定到指定的地址及端口监听连接建立连接接收/发送数据关闭socket

    Processed: 0.020, SQL: 9