python代码实例sicket_Python socket服务常用操作代码实例

套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。

1. 实现客户端发送字符,服务器返回大写的字符:

服务器:

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler): # 通过类的继承,实现

def handle(self): # 重写父类的handle方法,所有的操作都在此方法中

while True: # 循环,不停的接收从客户端来的数据

try:

self.data = self.request.recv(1024).strip() # 从客户端接收数据,每次收1024字节

print("{} send:".format(self.client_address), self.data)

self.request.send(self.data.upper()) # 从服务器发送给客户端数据

except ConnectionResetError as e:

print('Error: ',e)

break

if __name__ == '__main__':

host,port = 'localhost',9999

server = socketserver.ThreadingTCPServer((host,port),MyTCPHandler) # 通过多线程实现多个客户端连接,每个客户端连接都是一个线程

server.serve_forever() # 一直运行服务

客户端:

import socket

client = socket.socket() # socket对象

client.connect(('localhost',9999)) # 连接服务器地址和端口

while True: # 循环,不停的输入发送数据

con = input('>>>:').strip()

if len(con) ==0: continue # 不能发送空数据,否则会阻塞

client.send(con.encode('utf-8')) # 发送数据,必须是二进制的

data = client.recv(1024) # 接收服务器返回的数据

print(data.decode()) # 打印 解码后的数据

client.close() # 关闭

2. 通过socket执行服务器命令:

用法:直接在客户端输入处输入命令如:ipconfig

服务器:

import socket

import os

import threading

def tcplink(sock, addr):

print('Accept new connection from %s:%s...' % addr)

while True: # 和每个接入的客户端,进行多次数据通信

data = sock.recv(1024) # 接收客户端数据

if not data or data.decode('utf-8') == 'exit': # 如果客户端不发送数据或者发送了exit

print('client disconnected.')

break

content = os.popen(data.decode('utf-8')).read() # 对发送来的数据执行cmd命令,获取结果

if len(content) == 0: #如果执行的命令结果为空的,就手动造一个结果。因为如果为空数据,会挂起,无法正常发送。

content = 'cmd not exists.'

sock.send(str(len(content.encode('utf-8'))).encode('utf-8')) # 发送数据的长度

print('send length:', (len(content.encode('utf-8'))))

# print('content,', content.encode('utf-8'))

recv = sock.recv(1024) # 因为上下都有一个send连在一起,可能发生粘包现象,为了防止这种情况,可以让客户端重新应答一下

print('Answer:',recv.decode('utf-8'))

sock.send(content.encode('utf-8')) # 发送数据

print('send finished.')

sock.close()

print('Connection from %s:%s closed.' % addr)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 监听端口:

s.bind(('127.0.0.1', 9999))

s.listen(3)

print('Waiting for connection...')

while True:

# 接受一个新连接:

sock, addr = s.accept()

# 创建新线程来处理TCP连接:

t = threading.Thread(target=tcplink, args=(sock, addr))

t.start()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值