socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)
socket和file的区别:
- file模块是针对某个指定文件进行【打开】【读写】【关闭】
- socket模块是针对 服务器端 和 客户端Socket 进行【打开】【读写】【关闭】
服务端代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
import subprocess
import time
ip_port = ('127.0.0.1',9999)
sk = socket.socket() #默认TCP接口,这里生成一个句柄
sk.bind(ip_port) #绑定IP和端口
sk.listen(5) #监听,5带表最大允许连5个
while True:
print('server waiting...')
conn,addr = sk.accept() #等待链接.如果获取到链接,就会自动生成一个实例.返回两个值,conn是生成的实例,addr代表地址
while True:
client_data = conn.recv(1024)
if not client_data:break
print("recv",client_data)
cmd_call = subprocess.Popen(client_data,shell=True,stdout=subprocess.PIPE)
cmd_result = cmd_call.stdout.read()
if len(cmd_result) == 0:
cmd_result = "cmd execution has no output."
ack_msg = b"CMD_RESULT_SIZE|%s" % len(cmd_result)
conn.sendall(ack_msg)
client_ack = conn.recv(50)
if client_ack.decode() == 'CLIENT_READY_TO_RECV':
conn.sendall(cmd_result)
conn.close()
客户端代码:
#!/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 = raw_input("cmd>>:").strip()
if len(user_input)==0:continue
if user_input == 'q':break
sk.sendall(user_input)
server_ack_msg = sk.recv(100)
cmd_res_size = str(server_ack_msg).split('|')
if cmd_res_size[0] == "CMD_RESULT_SIZE":
cmd_res_size = int(cmd_res_size[1])
sk.sendall("CLIENT_READY_TO_RECV")
res = ''
received_size = 0
while received_size < cmd_res_size:
date = sk.recv(500)
received_size +=len(date)
res += date
else:
print(res)
print('-----recv done-----')
sk.close()
更多内容:http://www.cnblogs.com/wupeiqi/articles/5040823.html