python之socket

本文详细介绍了Socket编程的概念及其在Python中的应用。Socket作为一种特殊文件,可通过打开、读写、关闭的方式进行网络通信。文中通过服务端与客户端的具体代码示例,展示了如何使用Socket进行交互。

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

转载于:https://www.cnblogs.com/TaleG/p/6685443.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值