首页 > 编程 > Python > 正文

python通过socket实现多个连接并实现ssh功能详解

2020-02-16 10:36:49
字体:
来源:转载
供稿:网友

一、前言

  上一篇中我们已经知道了客户端通过socket来连接服务端,进行了一次数据传输,那如何实现客户端多次发生数据?而服务端接受多个客户端呢?

二、发送中文信息

  在python3中,socket只能发送bytes类型的数据,bytes类型只能表示0-225的ASCII码的值,并不能表示中文,所以当我们需要发送中文时,需要使用到编码和解码。

客户端:

import socket# 客户端# 声明协议类型,同时生成socket对象client = socket.socket()#client.connect(('localhost', 8888))# python3 接收字节流数据msg = input('>>:').strip()client.send(msg.encode('utf-8')) # 先编码成utf-8格式data = client.recv(1024) # 1024字节的数据print(data)print(data.decode())

服务端:

import socket# 声明协议类型server = socket.socket()# 绑定本地网卡(多网卡选择),端口server.bind(('localhost', 8888))# 监听端口server.listen() # 监听# conn 就是客户端连接后,在服务器端为其生成的一个连接实例# address 是客户端的 hostaddr,portconn, address = server.accept()print("进入等待时间....")# 等待# print(conn, address)print("收到连接....")# 接收数据data_server = conn.recv(1024)print('receive:', data_server.decode()) # 解码# 返回一个值conn.send(data_server)

三、Socket实现多个连接

  这个事例需要在Linux环境下测试,在windows中测试时,多个客户端同时连接(也就是同时运行多个socket_client.py程序),其中一个断开,服务端会报错。Linux环境python版本为3.5。

  事例代码:

客户端:

import socket# 客户端# 声明协议类型,同时生成socket对象client = socket.socket()#client.connect(('localhost', 8888))# python3 接收字节流数据while True:  msg = input('>>:').strip()  if len(msg) == 0:   # 输入不能为空    continue  client.send(msg.encode('utf-8'))  data = client.recv(1024) # 1024字节的数据  print(data)  print(data.decode())

  事例中输入为空(即len(msg==0))是不可以的,如果不输入任何东西,socket程序默认等待你的输入,所以程序会卡掉。

服务端:

# -*- coding: UTF-8 -*-import socket# 声明协议类型server = socket.socket()# 绑定本地网卡(多网卡选择),端口server.bind(('localhost', 8888))# 监听端口server.listen(5) # 监听while True:  conn, address = server.accept()  print("进入等待时间....")  while True:    print("收到连接....")    # 接收数据    data_server = conn.recv(1024)    if not data_server:  # 这里判断客户端断开的情况,不控制会无限循环      print('client is lost...')      break    print('receive:', data_server.decode())    # 返回一个值    conn.send(data_server)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表