Socketserver

客户端:

import socket
address = ('127.0.0.1',4000) import socket sk = socket.socket() sk.connect(address) inp_str = input('输入') sk.sendall(bytes(inp_str,encoding='utf-8')) result = str(sk.recv(1023),encoding='utf-8') print(result) sk.close()
#输入 ABC
>>> ABC好

服务端

HOST = ''
PORT = 4000  

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(10)
print('Socket now listening')
conn, addr = s.accept()
data = str(conn.recv(1024),encoding='utf-8')
print('data = ',data)
conn.sendall(bytes(data+'',encoding='utf-8'))
conn.close()
s.close()
>>>Socket now listening
>>> ABC

因为客户端的 一个connect 对应一个服务端的 accept ,上边的代码在完成一次响应之后服务器立即断开了连接,而我们平常访问的网站是一直等待接收连接的。所以我们要将服务器的代码更改一下让它可以一直接收连接,我们可以把accept放到一个循环中,然后再把代码改写成可以自动回复的Demo。

客户端:

import  socket
address = ('127.0.0.1',7777)
sk = socket.socket()
sk.connect(address)

while True:

    inp_str = input('输入')
    sk.sendall(bytes(inp_str,encoding='utf-8'))

    result = str(sk.recv(1023),encoding='utf-8')
    print(result)

服务端(保持服务):

import socket
HOST = ''
PORT = 6666

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(10)
print('Socket now listening')

while True:
    # wait to accept a connection - blocking call
    conn, addr = s.accept()

    while True:
        data = str(conn.recv(1024),encoding='utf-8')
        print('data = ',data)
        if data == 'q':
            break
        conn.sendall(bytes(data+'yes',encoding='utf-8'))

    conn.close()
    s.close()

运行修改后的代码就可以实现服务器保持服务的功能了 。

因为是属于循环自动聊天和回复的功能,只有客户端发送' q '的时候,其他客户端才可以进行链接,这样虽然保持了服务器可以持续接收请求,但却是一个用户断开,另一个用户才可以连接。

其实要实现这个功能,就要用到python的多线程。

但是,python中的 socketserver 已经帮我们实现了这个需求。

socketserver:

服务端代码更改为:

import socketserver
class My_socket(socketserver.BaseRequestHandler):
    
    def handle(self):
        conn = self.request
        while True:
            data = str(conn.recv(1024), encoding='utf-8')
            print('data = ', data)
            if data == 'q':
                break
            conn.sendall(bytes(data + 'yes', encoding='utf-8'))

if __name__ == '__main__':
    server = socketserver.ThreadingTCPServer(('127.0.0.1',8888),My_socket)
    server.serve_forever()

这样运服务端代码,就可以多个客户端同事访问了。

 

posted @ 2017-06-19 13:17  LeeeetMe  阅读(140)  评论(0编辑  收藏  举报