python3 socket通信

 

服务端与客户端的简单通信
服务端:
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元以内,非诚勿扰

 

 

 

 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值