**.Python自学之路:网络编程

socket

socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。

1.首先来看一下简易版的客户端与服务器的搭建

客户端

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import socket

ip_port = (‘127.0.0.1‘,9999)                   #测试地址与端口

sk = socket.socket()                                #生成句柄
sk.connect(ip_port)                                 #连接服务器

sk.sendall(bytes(‘...connecting...‘, ‘utf8‘)) #python3中以字发送数据
server_reply = sk.recv(1024)                  #接收来自服务器的数据                  

print(str(server_reply, ‘utf8‘))                  #输出时用字符串形式

sk.close()

服务器

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import socket

ip_port = (‘127.0.0.1‘, 9999)
sk = socket.socket()    #生成句柄
sk.bind(ip_port)        #绑定ip地址和端口
sk.listen(5)            #监听,5为最大连接个数

while True:
    print(‘...server waiting...‘)
    conn, addr = sk.accept()   #阻塞待连,生成实例conn,并返回实例和地址

    client_data = conn.recv(1024)  #接收实例的数据,1024个字符
    print(str(client_data, ‘utf8‘))
    conn.sendall(bytes(‘...connect successfully...‘,‘utf8‘))#服务器发回的数据

    conn.close()

2.改进:以上例子只能实现一次性通信,我们改进的动机是想要完成一个类似于QQ聊天的交互式通信

客户端

import socket
ip_port = (‘127.0.0.1‘,9999)
sk = socket.socket()
sk.connect(ip_port)  

sk.sendall(bytes(‘请求通讯‘, ‘utf8‘))
server_reply = sk.recv(1024)

print(str(server_reply, ‘utf8‘))
while True:                #交互式通信
    userInput = input(">>:").strip()
    sk.send(bytes(userInput, ‘utf8‘))
    server_reply = sk.recv(1024)
    print(str(server_reply, ‘utf8‘))

sk.close()

服务器

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import socket

ip_port = (‘127.0.0.1‘, 9999)

sk = socket.socket()
sk.bind(ip_port)
sk.listen(5)

while True:
    print(‘server waiting...‘)
    conn, addr = sk.accept()

    client_data = conn.recv(1024)
    print(str(client_data, ‘utf8‘))
    conn.sendall(bytes(‘连接成功‘, ‘utf8‘))
    while True:
        client_data = conn.recv(1024)
        print(str(client_data, ‘utf8‘))
        server_response = input("\033[32;1m>>:\033[0m").strip()
        conn.send(bytes(server_response))
    conn.close()

3.改进:实现服务器在多连接情况下异常处理

客户端

import socket
ip_port = (‘127.0.0.1‘, 9999)

sk = socket.socket()
sk.connect(ip_port)

sk.sendall(bytes(‘请求通讯‘, ‘utf8‘))
server_reply = sk.recv(1024)

print(str(server_reply, ‘utf8‘))
while True:
    userInput = input(">>:").strip()
    sk.send(bytes(userInput, ‘utf8‘))
    server_reply = sk.recv(1024)
    print(str(server_reply, ‘utf8‘))

sk.close()

服务器

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import socket

ip_port = (‘127.0.0.1‘, 9999)

sk = socket.socket()
sk.bind(ip_port)
sk.listen(5) 

while True:
    print(‘server waiting...‘)
    conn,addr = sk.accept()   

    client_data = conn.recv(1024)
    print(str(client_data, ‘utf8‘))
    conn.sendall(bytes(‘不要回答,不要回答,不要回答‘,‘utf8‘))
    while True:
        try:
            client_data = conn.recv(1024)
            print(str(client_data,‘utf8‘))
        except Exception:
            print("Connection break!!!")
            break
        conn.send(client_data)
    conn.close()

# while True:     Linux version
#     client_data = conn.recv(1024)
#     print("recv:",str(client_data,‘utf8‘))
#     if not client_data:break
#     conn.send(client_data)

4.在Linux上实现SSH的通讯:解决大数据的传输

客户端:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
ip_port = (‘127.0.0.1‘,9999)

sk = socket.socket()
sk.connect(ip_port)

while True:
    user_input = input("cmd>>:").strip()
        if len(user_input) == 0:continue
        if user_input == ‘q‘:break
        sk.send(bytes(user_input,‘utf8‘))
        #ack_msg = b"CMD_RESULT_SIZE|%s" % len(cmd-result)
        server_ack_msg = sk.recv(100)
        cmd_res_msg = str(server_ack_msg).split("|")
        if cmd_res_msg[0] == "CMD_RESULT_SIZE":
                cmd_res_size = int(cmd_res_msg[1])
                sk.send(b"CLIENT_READY_TO_RECV")
        res = ‘‘
        rec_size = 0
        while rec_size <= cmd_res_size:
                data = sk.recv(500)
                rec_size += len(data)  #实际大小
                res += str(data.decode())
        else:
                print(str(res))
                 print("......recv done....")
sk.close()

服务端:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
import time
import subprocess
ip_port = (‘127.0.0.1‘, 9999)
sk = socket.socket()
sk.bind(ip_port)
sk.listen(5)
while True:
    print(‘server waiting...‘)
    conn,addr = sk.accept()
    while True:
           client_data = conn.recv(1024)
           if not client_data:break
           print("recv:", str(client_data, ‘utf8‘))
           cmd = str(client_data,"utf8").strip()
           cmd_call = subbprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE)

           cmd_result = cmd_call.stdout.read()
           if len(cmd_result) == 0:
                cmd_result = b"cmd execution has no output.."
           ack_msg = b"CMD_RESULT_SIZE|%s" % len(cmd_result)
           conn.send(ack_msg)
           conn.recv(10) #生成阻塞,分割两次发送,避免,两次分开的数据一起发出去了。
           if client_ack.decode() == ‘CLENT_READY_TO_RECV‘:
                   conn.send(cmd_result) #但这种方法,cpu浪费了大量的时间
conn.close()
时间: 2024-10-25 17:05:45

**.Python自学之路:网络编程的相关文章

《Python学习之路 -- 网络编程》

在前面已经提到过,互联网的本质就是一堆协议,协议就是标准,比如全世界人通信的标准是英语,所有的计算机都学会了互联网协议,那么所有的计算机就可以按照统一的标准去收发信息完成通信了. 作为普通开发人员的我们,写的软件/程序都是处于应用层上的,然而,想要让软件接入互联网,就必须得通过传输层,也就是必须遵循TCP协议或者UDP协议.这是两个非常复杂的协议,如果遵循原生的协议,那么必然会大大降低效率,所以就有了socket抽象层的概念.socket是应用层与TCP/IP协议族通信的软件抽象层,它是一组接口

python学习之路网络编程篇(第一篇)

新课程知识的引入:python作用域 #python中无块级别作用域 if 1 == 1 : name = 'alex' print(name) for i in range(10): name = i print(name) #python中以函数为作用域 def func(): name = 'alex' print(name) #程序执行结果 # Traceback (most recent call last): # File "D:/PythonS13/Day10/С????1_pyt

python学习之路网络编程篇(第五篇)

paramiko简介 paramiko 是基于Python实现的SSH2远程安装连接,支持认证及秘钥方式.可以实现远程命令执行.文件传输.中间SSH代理等功能. paramiko安装 #!/bin/bash #install indepence package cd /data/soft wget https://www.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-2.6.tar.gz yum -y install gcc python-devel

python学习之路网络编程篇(第五篇)-续篇

Python堡垒机实现之基础知识 一般的堡垒机必须要具备以下5个基本功能: 1.权限控制 2.执行命令 3.上传下载文件 4.远程登录 5.记录操作 权限控制 说明:根据不同的登录用户分配不同的可管理的主机组.(再细分的权限就是根据不同的用户控制可在主机上执行的命令,一般不会限制的这么严格) 思路:使用数据库创建用户表,表字段有ID.用户名.密码.所属组,再创建主机表,表字段有ID,主机IP,所属组.其中用户表中的所属组和主机表中的所属组相对应,这样就能把两张表关联起来.当用户登录的时候就可以根

Python学习之路--网络编程

由于不同机器上的程序要通信,才产生了网络 C/S Client/Server 客户端/服务端 服务端 一直运行 等待服务别人 客户端 寻求服务的时候 才请求服务 B/S Browser/Server 浏览器/服务器 b/s架构是c/s架构的一种 实现通信上有全球唯一的MAC地址 网卡和网线 网卡 通过ip地址就能找到对应的MAC地址  ARP协议 交换机 ---- 多台机器之间的通信问题 广播风暴 网关  局域网中的机器想要访问局域网外的机器,需要通过网关访问 IP地址 和 子网掩码 按位与 

python下的复杂网络编程包networkx的安装及使用

由于py3.x与工具包的兼容问题,这里采用py2.7 1.python下的复杂网络编程包networkx的使用: http://blog.sina.com.cn/s/blog_720448d301018px7.html 处理1里面提到的那四个安装包还要: 2.需要安装 setuptools: http://wenku.baidu.com/link?url=XL2qKVZbDPh-XocJW7OVZmacM4Tio5YhCyu0Uw-E7CjhiXRrhSWI4xheERjEVC3olCZ8muN

python 14章,网络编程

一,socket 模块 套接字包括两类:服务器,客户机, 创建一个套接字后让它等待连接 服务器: import socket s = socket.socket() port = 1234 host = socket.gethostname() print host s.bind((host,port)) s.listen(5) while True: get,addr = s.accept() print 'Got connection from',addr get.send('Thank y

python进阶九_网络编程(一)

Python网络编程一 一.一些基本概念 在Python网络编程这一节中会涉及到很多网络相关的术语,对于一些最基本的概念,如TCP/IP,Socket等等不再赘述,不明白的可以自己去查一查,对于一些常见但是可能不是很熟悉的术语这里做了一个简要的介绍,后续遇到不会因此止步. SNTP:简单网络时间协议(Simple Network Time  Protocol)简单来说就是用来同步因特网中的计算机时钟,需要注意的是这里的SNTP是用户数据报(UDP)协议. MIME:Multipurpose In

python之路 -- 网络编程

1.软件开发的架构 - C/S架构(需要安装应用程序使用的软件) c client 客户端 s server 服务端 - B/S架构(可以通过浏览器使用的) b broser 浏览器 s server 服务端 不需要额外的安装客户端了,只需要一个网址就可以访问 轻量级,使用成本低 2.tcp协议/udp协议 tcp协议 全双工的通信协议 建立了专门穿送数据的通道(连接),是一个长连接 面向流的传输 传输速率比udp协议慢 数据安全不容易丢失 大文件算法自己拆包编号发送 建立连接的 三次握手 断开

Python笔记8:网络编程

python内置封装了很多常见的网络协议的库,因此python成为了一个强大的网络编程工具,这里是对python的网络方面编程的一个简单描述. urllib 和 urllib2模块 urllib 和urllib2是python标准库中最强的网络工作库.这里简单介绍下urllib模块.本次主要用urllib模块中的常用的几个模块: urlopen parse urlencode quote unquote _safe_quoters unquote_plus GET请求: 使用urllib 进行h