python socket 代码实现整理

一.socket通讯

1.SCOK_STREAM : TCP
SOCK_Dgram : UDP

family = AF_INET :服务器中间的通讯
family = AF_INET6 :服务器中间的通讯
family = AF_UNIX :unix不同进程间的通讯


2.server端和client端
server通过conn进行连接,conn都是client发去的请求通道,
client作为发送请求的一端,使用sk进行接受发和发送

发送的数据不能为空,空发送不过去

server端的方法: bind(address):将address绑定到地址,在AF_INET下,以元组(ip,port)的形式表示地址
listen(backlog):开始监听输入连接,backlog指可以挂起的最大连接数量
accept():接受并返回(conn,address)元组,用来接受和发送数据
可以认为接受的是客户端的sk

recv():接受数据 #接受和传送的类型都是byte
send():发送数据
sendall():

client下的方法:
connect()
recv():接受数据
send():发送数据
sendall():

###########################################################
server.py
______________________________

import socket

sk = socket.socket()
address = ('127.0.0.1',8001)

sk.bind(address) #绑定ip,port
sk.listen(3) #开启监听
conn,addr= sk.accept() #开启收发消息

inp = input("请输入要传递的信息:")
conn.send(bytes(inp,'utf8')) #发送消息

conn.close()

############################################################
client.py

________________________________
import socket

sk = socket.socket()
address = ('127.0.0.1',8001)
sk.connect(address) #客户端连接ip,port

data = sk.recv(1024) #接受消息
print(str(data,'utf8'))

sk.close()
#############################################################

二 .socket实现ssh功能


###########################################
server.py
___________________________________________

import socket
import subprocess

sk = socket.socket()
address = ('127.0.0.1',8002)
sk.bind(address)
sk.listen(3)

while True:
conn,addr = sk.accept()
while True:
try:
data = conn.recv(1024)
except Exception:
break

if not data:
break


obj = subprocess.Popen(str(data,'utf8'),shell=True,stdout=subprocess.PIPE)
cmd_result = obj.stdout.read()
result_len = bytes(str(len(cmd_result)),'utf8')

print(">>>>",result_len)
conn.sendall(result_len)
conn.recv(1024) #粘包现象,增加一个接收端,隔断一下。无实质作用。
conn.sendall(cmd_result)

sk.close()
##################################################
client.py
__________________________________________________
import socket

sk = socket.socket()

address = ('127.0.0.1',8002)

sk.connect(address)

while True:

inp = input("Client:")
if inp == 'exit':
break
sk.send(bytes(inp,'utf8'))

result_len = int(str(sk.recv(1024),'utf8'))
sk.send(bytes('ok','utf8')) #粘包放松隔断数据
data = bytes()
while len(data) != result_len:
recv = sk.recv(1024)
data+=recv

print(str(data,'gbk'))

sk.close()
##################################################

三.粘包现象
两个send在一起的时候,就有可能粘包,解决办法就是在两个放送端之间加一个 recv

代码(见上一个案例)

原文地址:https://www.cnblogs.com/aniuzaixian/p/8043819.html