网络编程-- socket

 

 

 

利用socket实现一个简单的ssh

import socket
import os

# 获得socket实例
server = socket.socket()

# 绑定监听地址端口
server.bind(("localhost", 39999))
# 打开监听
server.listen(1)


while True:

    print('wating...')
    # 接受并建立与客户端的连接,程序在此处开始阻塞,只到有连接进来
    conn,addr = server.accept()
    print("new_connect.", addr)
    while True:
        data = conn.recv(1024)
        if not data:
            break
        res = os.popen(data.decode()).read()
        # conn.send(data.upper())
        if len(res) == 0:
            conn.send('command not found'.encode('utf-8'))
            continue
        # 把结果大小的长度发给客户端
        conn.send(str(len(res.encode())).encode('utf-8'))  # 把长度发给客户端
        _res = conn.recv(1024)
        conn.send(res.encode("utf-8"))
        print(data)
server.close()
socket-server
import socket


client = socket.socket()

client.connect(('localhost', 39999))

while True:
    msg = input('>>> ').strip()
    if len(msg) == 0:
        continue
    client.send(msg.encode("utf-8"))
    # 接收server端发来的长度
    data_size = client.recv(1024)
    if 'found' in data_size.decode():
        print(data_size.decode())
        continue
    client.send('starting...'.encode('utf-8'))
    received_size = 0
    received_data = b''
    while received_size < int(data_size.decode()):
        data = client.recv(1024)
        # 每次收到以的有可能小于1024,所有使用len判断
        received_size += len(data)
        received_data += data
    else:
        print(received_data.decode())

client.close()
socket-client

 以上的程序,你会发现,只能支持单个客户端与服务端进行通信,而第二个要想与服务端通信,只能把第一个断开才行,这种就是形成了阻塞

 

 以下实现一个支持多并发的服务端程序

import socketserver


class MyTCPHandler(socketserver.BaseRequestHandler):
    """SocketServer"""

    def handle(self):
        while True:
            try:
                self.data = self.request.recv(1024).strip()
                print("{} wrote:".format(self.client_address[0]))
                print(self.data)
                self.request.send(self.data.upper())
            except ConnectionResetError as e:
                print("Error", e)
                break

if __name__ == '__main__':
    HOST, PORT = 'localhost', 39999
    server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)
    server.serve_forever()
多并发的SocketServer

 

小技巧(断言)

# 如果type(1) 是int类型的,就 打印'bbb'
assert type(1) is int
print('bbb')

  

异常处理

 

 

posted on 2017-04-27 17:06  奋斗德路  阅读(105)  评论(0)    收藏  举报