socket网络编程

###网络编程
##发送端
# import socket ###导入socket
# socket.TCP/IP  ###定义客户端,定义socket类型
# connect(a.ip,a.port) ##连接远程机器
# socket.send(hello)##开始发送
# socket.recv()  ##然后接收
# socket.close()##客户端关闭


##接收端 ,也就是服务器端
# import socket  ####
# socket.TCP/IP  ###  定义类型
# listen(0.0.0.0,69696)  ###  监听端口
# waiting()  ###  等待连接
# recv()  ###  接收数据
# send()###  发送数据

 


import socket

client = socket.socket() ###声明socket类型,同时生成socket连接对象
client.connect(("localhost",6969))
while True:
Inde = input(">>").strip()
if len(Inde)==0:
continue
client.send(Inde.encode("utf-8"))
data = client.recv(1024)
print("recv:",data.decode())##decode()转换字符编码

client.close()
 

import socket
sercer = socket.socket()
sercer.bind(("localhost",6969))##绑定要监听的端口
sercer.listen()#监听
while True:
conn,addr=sercer.accept()##等待客户端请求 ###在这里会返回两个值,
###conn就是客户端连接过来而在服务器端为其生成的一个连接实例
while True:

data = conn.recv(1024) ###接收,通过返回的数据接收
print(data)
conn.send(data.upper())###发送

sercer.close()
###服务器端

 

####客户端,一下吧服务器端的接收到
import socket

client = socket.socket()
# client.connect(("192.168.16.200",9999))
client.connect(("localhost",9999))
while True:
    cmd = input(">>:").strip()
    if len(cmd) == 0:
        continue
    client.send(cmd.encode("utf-8"))
    cmd_res_size = client.recv(1024)###接收命令结果的长度
    print("执行命令结果大小:",cmd_res_size)
    received_size = 0
    received_data = b""
    while received_size<int(cmd_res_size.decode()):

        data = client.recv(1024)
        received_size += len(data)###每次收到的有可能小于1024,所以必须用len判断
        # print(data.decode())
        # print(received_size)
        received_data += data
    else:
        print("cmd res receive done:",received_size)
        print(received_data.decode())




client.close()
import socket,os

server = socket.socket()
server.bind(("localhost",9999))
server.listen()
while True:
    conn,addr = server.accept()
    print("new conn:",addr)
    while True:
        print("等待指令")
        data = conn.recv(1024)
        if not data:
            print("客户端已断开")
            break
        print("执行指令:",data)
        cmd_res = os.popen(data.decode()).read()#接收字符串,执行结果也是字符串
        print("before send",len(cmd_res))
        if len(cmd_res) == 0:
            cmd_res= "cmd has no output..."
#################################################
conn.send(str(len(cmd_res.encode())).encode("utf-8")) ###先发大小给客户端 ########这两行数据可能会导致粘包的结果,粘包就是说两条数据太快会当作一条数据处理,这时候会报错(纯属瞎扯
个人想记住而已)
     ###可以在这里加上一个时间沉睡,不过用户体验很不好
     ####time.sleep(0.05)
#########所以我们可以这样做:
     client_ack= conn.recv(1024)
#########在这里产生交互,就断开粘包了
conn.send(cmd_res.encode("utf-8"))
################################################
print("send done") server.close() ###服务器端

 

###ftp传送文件 发送的服务端
1.读取文件
2.检测文件是否存在
3.打开文件
4.检测文件大小
4.发送文件大小给客户端
5.等待客户端确认(也就是怕粘包)
6.开始边读边发数据
8.发送md5
######
###服务端
import socket,os,time,hashlib

server = socket.socket()
server.bind(("localhost",9999))
server.listen()

while True:
    conn,addr = server.accept()
    print("new conn:",addr)
    while True:
        print("等待指令")
        data = conn.recv(1024)
        if not data:
            print("客户端已断开")
            break
        cmd,filename = data.decode().split()
        print(filename)
        if os.path.isfile(filename):###检测是否是文件
            f = open(filename,"rb")###读取文件
            # m = hashlib.md5()
            file_size = os.stat(filename).st_size###获取文件大小
            conn.send(str(file_size).encode())
            conn.recv(1024)
            for line in f:
                # m.update(line)
                conn.send(line)
            # print("file md5:",m.hexdigest())
            f.close()
        print("send done")
sevcer.close()



#########
##客户端
import socket
client = socket.socket()

client.connect(("localhost",9999))
while True:
    cmd = input(">>:").strip()
    if len(cmd) == 0:
        continue
    if cmd.startswith("get"):
        client.send(cmd.encode())
        server_response = client.recv(1024)
        print("servr response:",server_response)
        client.send(b"ready to recv file")
        file_total_size = int(server_response.decode())
        received_size = 0
        filename = cmd.split()[1]
        f = open(filename + "new","wb")
        while received_size<file_total_size:
            data = client.recv(1024)
            received_size += len(data)
            f.write(data)
            # print(data)
        else:
            print("file recv done",received_size,file_total_size)
        f.close()
client.close()
###ftp传送文件 发送的服务端  带md5  加上不会粘包

####客户端
import socket
import hashlib
client = socket.socket()

client.connect(("localhost",9999))
while True:
    cmd = input(">>:").strip()
    if len(cmd) == 0:
        continue
    if cmd.startswith("get"):
        client.send(cmd.encode())
        server_response = client.recv(1024)
        print("servr response:",server_response)
        client.send(b"ready to recv file")
        file_total_size = int(server_response.decode())
        received_size = 0
        filename = cmd.split()[1]
        f = open(filename + "new","wb")
        m = hashlib.md5()
        while received_size<file_total_size:
            if file_total_size - received_size>1024:###要收的不止一次
                size = 1024
            else: ###最后一次了,生多少收多少
                size = file_total_size - received_size
            data = client.recv(1024)
            received_size += len(data)
            m.update(data)
            f.write(data)
            # print(data)
        else:
            new_file_md5 = m.hexdigest()
            print("file recv done",received_size,file_total_size)
        f.close()
        server_file_md5 = client.recv(1024)
        print("client file md5:",new_file_md5)
client.close()


###服务端

import socket,os,time,hashlib

server = socket.socket()
server.bind(("localhost",9999))
server.listen()

while True:
    conn,addr = server.accept()
    print("new conn:",addr)
    while True:
        print("等待指令")
        data = conn.recv(1024)
        if not data:
            print("客户端已断开")
            break
        cmd,filename = data.decode().split()
        print(filename)
        if os.path.isfile(filename):###检测是否是文件
            f = open(filename,"rb")###读取文件
            m = hashlib.md5()
            file_size = os.stat(filename).st_size###获取文件大小
            conn.send(str(file_size).encode())
            conn.recv(1024)
            for line in f:
                m.update(line)
                conn.send(line)
            print("file md5:",m.hexdigest())
            f.close()
            conn.send(m.hexdigest().decode())  ###给客户端发送MD5
        print("send done")
sevcer.close()

 

posted @ 2018-05-04 09:26  Caionk  阅读(165)  评论(0编辑  收藏  举报