服务端与客户端的简单通信
服务端:
import socket
server = socket.socket() #获得socket实例
server.bind(("localhost",9998)) #绑定ip port
server.listen() #开始监听
print("等待客户端的连接...")
conn,addr = server.accept() #接受并建立与客户端的连接,程序在此处开始阻塞,只到有客户端连接进来...
print("新连接:",addr )
data = conn.recv(1024)
print("收到消息:",data)
server.close()
客户端:
import socket
client = socket.socket()
client.connect(("localhost",9998))
client.send(b"hey")
client.close()
先启动服务端 再启动客户端,输出为:
等待客户端的连接...
新连接: ('127.0.0.1', 62294)
收到消息: b'hey'
服务端-客户端的初步多次交互
服务端:
import socket
server = socket.socket() #获得socket实例
server.bind(("localhost",50000)) #绑定ip port
server.listen() #开始监听
print("等待客户端的连接...")
conn,addr = server.accept() #接受并建立与客户端的连接,程序在此处开始阻塞,只到有客户端连接进来...
print("新连接:",addr )
while True:
data = conn.recv(1024)
print("收到消息:",data)
conn.send(data.upper())
server.close()
客户端:
import socket
client = socket.socket()
client.connect(("localhost",50000))
while True:
msg = input(">>:").strip()
if len(msg) == 0:continue
client.send( msg.encode("utf-8") )
data = client.recv(1024)
print("来自服务器:",data)
client.close()
输出过程:
等待客户端的连接...
新连接: ('127.0.0.1', 62773)
收到消息: b'12'
收到消息: b'23'
收到消息: b'56'
Traceback (most recent call last):
File "D:\F\eclipse-workspace\oop2\src\server.py", line 17, in <module>
data = conn.recv(1024)
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
在传输过程中关闭客户端,那么服务端会抛出如上所示异常
解决办法,在服务端的while True内 替换代码为:
data = conn.recv(1024)
if not data:
print("客户端断开了...")
break #这里断开就会再次回到第一次外层的loop
print("收到消息:",data)
conn.send(data.upper())
就可以当输入为空时 正常退出
但是我的win10操作系统+eclipse+python3不知道为啥,程序偶尔能用 偶尔不能用
简单的ssh:
server
import socket,os
server = socket.socket()
server.bind(("localhost",50000))
server.listen()
while True:
print("wait for client to connect:")
conn,addr = server.accept()
print("new connect:" ,addr)
while True:
try:
cmd_data = conn.recv(1024)
except:
break
print("received msg from client:" ,cmd_data)
if not cmd_data:
print("client is broken....")
break
data = os.popen(cmd_data.decode()).read()
print(data)
data_size = len(data)
print('server send data size:',data_size)
conn.send(str(data_size).encode('utf-8'))
ack_data = conn.recv(1024)
if not ack_data:
print("client is broken....")
break
conn.sendall(data.encode('utf-8'))
server.close()
client
import socket,sys
client = socket.socket()
client.connect(("localhost",50000))
while True:
send_data = input(">>:")
if send_data == 0:
continue
client.send(send_data.encode(encoding='utf-8'))
total_datasize = int(client.recv(1024).decode())
#print('total_datasize:',total_datasize)
client.send('ok'.encode(encoding='utf-8'))
f = open('recv_data.txt','w')
recv_size = 0
recv_data = ''
count = 0
while recv_size != total_datasize:
data = client.recv(1024)
recv_data += data.decode()
recv_size += len(data.decode())
print('recv_size:',recv_size,'type:',type(recv_size))
print('total_datasize:',total_datasize,'type:',type(total_datasize))
count += 1
print("count:",count)
else:
print("received msg from server:" ,recv_data)
f.write(recv_data)
f.flush()
client.close()
要注意的是,在client的代码中,当数据接收结束并进行write操作时,最好直接flush,不然文件无法立刻写入,我的开发法环境时win10+eclipse+python3.0
输出:
Windows IP 配置无线局域网适配器 WLAN: 媒体状态 . . . . . . . . . . . . : 媒体已断开连接 连接特定的 DNS 后缀 . . . . . . . : 无线局域网适配器 本地连接* 1: 媒体状态 . . . . . . . . . . . . : 媒体已断开连接 连接特定的 DNS 后缀 . . . . . . . : 以太网适配器 以太网: 连接特定的 DNS 后缀 . . . . . . . : IPv6 地址 . . . . . . . . . . . . :
临时 IPv6 地址. . . . . . . . . . :
临时 IPv6 地址. . . . . . . . . . :
本地链接 IPv6 地址. . . . . . . . :
IPv4 地址 . . . . . . . . . . . . :
子网掩码 . . . . . . . . . . . . :
默认网关. . . . . . . . . . . . . :
以太网适配器 蓝牙网络连接: 媒体状态 . . . . . . . . . .
但好像没有sendall没有起作用~ 并没有发送全部
客户端服务器之间传文件 并用md5校验:
server:
'''
Created on 2018年5月23日
@author: hcl
'''
import socket,os,hashlib
server = socket.socket()
server.bind(("localhost",50000))
server.listen()
while True:
print("wait for client to connect:")
conn,addr = server.accept()
print("new connect:" ,addr)
while True:
try:
cmd,file_name = conn.recv(1024).decode().split()
except:
break
if os.path.isfile(file_name):
f = open(file_name,'rb')
m = hashlib.md5()
filesize = os.stat(file_name).st_size
print('filesize:',filesize)
conn.send(str(filesize).encode(encoding='utf-8'))
ack = conn.recv(1024)
for line in f:
m.update(line)#.encode(encoding='utf-8')
conn.send(line)#.encode(encoding='utf-8')
print('server send file md5:',m.hexdigest())
f.close()
conn.send(m.hexdigest().encode(encoding='utf-8'))#
print("send done")
server.close()
client:
'''
Created on 2018年5月23日
@author: hcl
'''
import socket,sys,hashlib
client = socket.socket()
client.connect(("localhost",50000))
while True:
send_cmd = input(">>:")
if send_cmd == 0:
continue
if send_cmd.startswith('get'):
client.send(send_cmd.encode(encoding='utf-8'))
server_response = client.recv(1024)
client.send(b'ready')
file_total_size = int(server_response.decode())
print("file_total_size:",file_total_size)
recv_size = 0
recv_data = b''
count = 0
filename = send_cmd.split()[1]
f = open(filename + 'new','wb')
m = hashlib.md5()
while recv_size != file_total_size:
if file_total_size - recv_size > 1024:
size = 1024
else:
size = file_total_size - recv_size
print('last recv_size:',recv_size)
data = client.recv(size)
recv_size += len(data)
m.update(data)
f.write(data)
f.flush()
print('recv_size:',recv_size,'file_total_size:',file_total_size)
else:
new_file_md5 = m.hexdigest()
server_datamd5 = client.recv(1024).decode()
print("file recv done",recv_size,file_total_size)
print("new_file_md5:",new_file_md5)
print('server_datamd5:',server_datamd5)
client.close()
服务器端输出:
wait for client to connect:
new connect: ('127.0.0.1', 57288)
filesize: 1037
server send file md5: 71f3e36ebf4e18b56bf582ffea82dec0
send done
wait for client to connect:
客户端输出:
>>:get recv_data.txt
file_total_size: 1037
recv_size: 232 file_total_size: 1037
last recv_size: 232
recv_size: 417 file_total_size: 1037
last recv_size: 417
recv_size: 563 file_total_size: 1037
last recv_size: 563
recv_size: 737 file_total_size: 1037
last recv_size: 737
recv_size: 1037 file_total_size: 1037
file recv done 1037 1037
new_file_md5: 71f3e36ebf4e18b56bf582ffea82dec0
server_datamd5: 71f3e36ebf4e18b56bf582ffea82dec0
>>:
六、有兴趣接电子设计相关小型项目的请加下群,每个项目一般在1000元以内,非诚勿扰