一、简介:套接字python编程-TCP
典型的网络应用是由一对程序(客户程序和服务器程序)组成。当运行两个程序时,创建了一个客户进程和服务器进程,同时通过从套接字读出和写入数据彼此之间进行通信。
流程:
二、实践要求
编写一个可在局域网通讯的客户端和服务端程序要求:(1)客户端向服务端发送指令“show me OS info”,服务端返回该主机的操作系统基本信息给客户端,并通过屏幕输出;(2)客户端向服务端发送指令“show me Disk info”,服务端返回该主机的磁盘数量以及各自磁盘空间的大小。
三、代码实现
服务器端
serverSocket.py
#注释编码格式,防止乱码问题
#coding=utf-8
from socket import *
import os
print("Server")
HOST = '192.168.43.122' #服务器主机名(IP)
serverPort = 10024 #需要连接的服务器端口,需要一个可用的端口
BUFSIZE = 2048 #定义缓冲区大小
ADDR = (HOST,serverPort)
serverSocket=socket(AF_INET,SOCK_STREAM) #创建欢迎套接字
serverSocket.bind(ADDR) #将该服务器端口号与套接字关联
serverSocket.listen(5) #等待并聆听客户敲门,设置5为请求连接的最大数
print('The server is ready to receive')
#用户敲门时,调用accept()创建connectionSocket的新套接字
connectionSocket,addr = serverSocket.accept()
#与客户端连接成功
print('connect from ', addr)
#接收消息,decode()将byte转换为str
sentence = connectionSocket.recv(BUFSIZE).decode()
print('Receive message >> ',sentence)
#执行客户端的请求,返回信息
if sentence == 'show me OS info':
message = ".".join(os.popen('systeminfo').readlines()).encode('utf-8')
elif sentence == 'show me Disk info':
message = ".".join(os.popen('wmic diskdrive').readlines()).encode('utf-8')
else :
message = 'invaild'.encode()
connectionSocket.send(message)
#客户端直接发送指令
'''
message = ".".join(os.popen(sentence).readlines()).encode('utf-8') #返回操作系统信息,将系统读取的list转换为str,再转换为byte!!!
connectionSocket.send(message)
'''
#大写处理
'''
capitalizedSentence = sentence.upper()
connectionSocket.send(capitalizedSentence)
'''
#关闭套接字
connectionSocket.close()
serverSocket.close()
客户端
clientSocket.py
#coding=utf-8
from socket import *
print('Client')
HOST= '192.168.43.155' #需连接的服务器IP
serverPort = 10024 #需连接的服务器端口号
BUFSIZE = 2048
ADDR = (HOST,serverPort) #需连接的服务器地址
clientSocket = socket(AF_INET,SOCK_STREAM) #创建客户套接字,流式数据
clientSocket.connect(ADDR) #客户套接字与服务器连接
#连续收集字符直到回车终止
sentence = input('Input sentence: ').encode() #将str编码为byte格式
clientSocket.send(sentence) #向服务器发送消息
'''
键入“show me OS info”,则返回操作系统信息
键入“show me Disk info"则返回磁盘信息
'''
modifiedSentence = clientSocket.recv(BUFSIZE).decode('utf-8') #接收消息,并对byte消息进行解码
print('From server: ',modifiedSentence)
#关闭套接字
clientSocket.close()
四、说明
运行步骤
- 服务器配置好自己的IP。127.0.0.1是主机地址,通常可以连接局域网IP。命令行中输入【ipconfig】查看。
- 客户端配置要连接的服务器IP,TCP协议要求端口号一致。
- 先运行服务器,再运行客户端。
补充
- 信息在传输中是byte格式,需要encode()和decode()函数进行编码和解码,格式是utf-8。
- 创建套接字──socket()
该调用要接收三个参数:af、type、protocol。
参数af指定通信发生的区域:AF_UNIX、AF_INET、AF_NS等,而DOS、WINDOWS中仅支持AF_INET,它是网际网区域。因此,地址族与协议族相同。
参数type 描述要建立的套接字的类型。面向连接的还是非连接分为 SOCK_STREAM(TCP:流式数据) 或 SOCK_DGRAM
(UDP:报文段) - 指定本地地址──bind()
绑定地址(host,port)到套接字, 在 AF_INET下,以元组(host,port)的形式表示地址。注意,bind的参数只有1个,是元组形式。