python学习——网络编程

网络编程:
a.软件
客户端:CS架构 client-->server
浏览器:BS架构 brower-->server
b.如何实现相互通信
需求1:编写两个软件,软件之间相互通信。
需求2:两个人直接连接(网线)
需求3:教室相互通信(交换机)
总结:
1.相互通信本质发送010101010101
2.交换机作用
3.通过ipconfig查看自己的内网IP
4.公网IP,掏钱。
连接实例:

服务端:
import socket #帮助完成网络通信的模块
# 创建服务端socket对象
server = socket.socket()

# 绑定IP和端口
server.bind(('192.168.13.155',8000))

# 后边可以等5个人
server.listen(5)

# 等待客户端来连接,如果没人来就傻傻的等待。
# conn是客户端和服务端连接的对象(伞),服务端以后要通过该对象进行收发数据。
# addr是客户端的地址信息。
conn,addr = server.accept() # ##############################阻塞

# 通过对象去获取(xxx通过伞给我发送的消息
# 1024表示:服务端通过(伞)获取数据时,一次性最多拿1024字节。
data = conn.recv(1024)
print(data)

# 服务端通过连接对象(伞)给客户端回复了一个消息。
conn.send(b'stop')

# 与客户端断开连接(放开伞)
conn.close()

# 关闭服务端的服务
server.close()
客户端:
import socket

client = socket.socket()

# xxx相服务端发起连接请求
# 阻塞,去连接,直接连接成功后才会继续向下走
client.connect(('192.168.13.155',8000))

# 连接上服务端后,相服务端发送消息
client.send(b'hello')

# 王晓东等待服务端给他发送消息
data = client.recv(1024)
print(data)

# 关闭自己
client.close()

文件传输实例:

客户端

import socket
import os
import json

#连接服务端
sock = socket.socket()
sock.connect(('127.0.0.1',8800))

while 1:
    #输入指令
    cmd = input('输入命令>>') # put 111.jpg
    action,filename = cmd.strip().split(' ')

    #获取文件大小
    filesize = os.path.getsize(filename)

    #编译文件信息字典
    file_info = {'action':action,
                 'filename':filename,
                 'filesize':filesize,
                 }

    #将文件信息序列化并传输给服务端
    file_info_json = json.dumps(file_info).encode('utf8')
    sock.send(file_info_json)

    # 确认服务端接受到了文件信息
    code = sock.recv(1024).decode('utf8')
    if code == '200':

        # 发送文件数据
        with open(filename,'rb') as f:
            for line in f:
                sock.send(line)
    else:
        print('服务器异常')

 

服务端

import socket
import json

#建立服务端连接
sock = socket.socket()
sock.bind(('127.0.0.1',8800))
sock.listen(5)

while 1:
    #客户端连接成功打印信息
    print('server is working...')
    conn,addr = sock.accept()
    while 1:
        #接受客户端发送的文件信息
        data = conn.recv(1024).decode('utf8')
        file_info = json.loads(data)
        print('file_info',file_info)

    # 获得文件信息,并获取字典内对应值
    action = file_info.get('action')
    filename = file_info.get('filename')
    filesize = file_info.get('filesize')

    conn.send(b'200')

    # 接收文件数据
    with open('put/'+filename,'wb') as f:
        recv_data_length = 0
        while recv_data_length < filesize:
            data = conn.recv(1024)
            recv_data_length += len(data)
            f.write(data)
            print('文件总大小:%s,已成功接收%s'%(filesize,recv_data_length))
    print('接收成功')

 

 sockerserver模块

#客户端
import socket

sk = socket.socket()

sk.connect(('127.0.0.1',8899))

while 1:
    name = input(">>>>:")
    sk.send(name.encode('utf-8')) # 字节

    response = sk.recv(1024) # 字节
    print(response.decode('utf-8'))
服务端
import socketserver

class Myserver(socketserver.BaseRequestHandler):
    def handle(self):
        # 字节类型
        while 1:
            # 针对window系统
            try:
                print("等待信息")
                data = self.request.recv(1024)  # 阻塞
                # 针对linux
                if len(data) == 0:
                    break
                if data == b'exit':
                    break
                response = data + b'SB'
                self.request.send(response)
            except Exception as e:
                break

        self.request.close()

# 1 创建socket对象 2 self.socket.bind()  3 self.socket.listen(5)
server=socketserver.ForkingUDPServer(("127.0.0.1",8899),Myserver)

server.serve_forever()

 








posted @ 2019-08-27 15:40  陪伴is最长情的告白  阅读(163)  评论(0)    收藏  举报