zoukankan      html  css  js  c++  java
  • Python网络编程-Socket简单通信(及python实现远程文件发送)

    学习python中使用python进行网络编程,编写简单的客户端和服务器端进行通信,大部分内容来源于网络教程,这里进行总结供以后查阅。

    先介绍下TCP的三次握手:

    1,简单的发送消息:

    服务器端:

    import socket
    
    sk = socket.socket()
    ip_port = ("127.0.0.1", 8888)
    sk.bind(ip_port)
    sk.listen(5)
    print("正在进行等待接受数据...")
    conn, address = sk.accept()
    msg = "hello world!"
    conn.send(msg.encode())
    conn.close()

    客户端:

    import socket
    
    client = socket.socket()
    
    ip_port = ("127.0.0.1", 8888)
    client.connect(ip_port)
    data = client.recv(1024)
    print(data.decode())

    这里并不能连续发送消息,一次连接发送消息后程序终止。

    2.1,连续的发送消息(TCP方式

    服务器端:

    import socket
    import random
    sk = socket.socket()
    ip_port = ("127.0.0.1", 8888)
    sk.bind(ip_port)
    sk.listen(5)
    while True:
        print("正在进行等待接受数据...")
        conn, address = sk.accept()
        msg = "hello world!"
        conn.send(msg.encode())
        while True:
            data=conn.recv(1024)
            print(data.decode())
            if data==b'exit':
                break
            conn.send(data)
            conn.send(str(random.randint(1,1000)).encode())
        conn.close()

    客户端:

    import socket
    
    client = socket.socket()
    
    ip_port = ("127.0.0.1", 8888)
    client.connect(ip_port)
    
    while True:
        data = client.recv(1024)
        print(data.decode())
        msg_input=input("please input mesage to send...")
        client.send(msg_input.encode())
        if msg_input== b'exit':
            break
        data = client.recv(1024)
        print(data.decode())

    使用while函数,来连续的发送消息。

    2.2,连续的发送消息(UDP方式

    服务器端:

    import  socket
    
    #定义udp方式
    sk=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    ip_port=("127.0.0.1",8888)
    sk.bind(ip_port)
    
    while True:
        data=sk.recv(1024)
        print(data.decode())

    客户端:

    #udp
    import  socket
    
    sk=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    ip_port=("127.0.0.1",8888)
    while True:
        msg_input=input("please input message to send...")
        if msg_input==b'exit':
            break
        sk.sendto(msg_input.encode(),ip_port)
    sk.close()

    3,多客户端发送消息(TCP方式)

    服务器端:

    #tcp
    import  socketserver
    import random
    
    class MyServer(socketserver.BaseRequestHandler):
        def setup(self):
            pass
        def handle(self):
            conn=self.request
            msg="hello world!"
            conn.send(msg.encode())
            while True:
                data= conn.recv(1024)
                print(data.decode())
                if data== b'exit':
                    break
                conn.send(data)
                conn.send(str(random.randint(1,1000)).encode())
            conn.close()
    
        def finish(self):
            pass
    
    if __name__=="__main__":
        server=socketserver.ThreadingTCPServer(("127.0.0.1",8888),MyServer)
        server.serve_forever()

    客户端:

    #tcp
    import socket
    
    client = socket.socket()
    
    ip_port = ("127.0.0.1", 8888)
    client.connect(ip_port)
    
    while True:
        data = client.recv(1024)
        print(data.decode())
        msg_input=input("please input mesage to send...")
        client.send(msg_input.encode())
        if msg_input== b'exit':
            break
        data = client.recv(1024)
        print(data.decode())

     启动服务器端后,服务器端等待客户端程序连接,我们可以启动多个客户端来连接服务器端。

    ******************************************************************************************************************************************************************************************************************************

     一个小应用:

    ******************************************************************************************************************************************************************************************************************************

    文件发送和接收程序:

    服务器端(接收):

    #file upload server
    
    import socket
    
    sk=socket.socket()
    
    ip_port=("127.0.0.1",8888)
    
    sk.bind(ip_port)
    sk.listen(5)#最大连接数
    while True:
        conn,address=sk.accept()#等待连接
        while True:#连接成功后一直使用当前连接,直到退出
            with open("file_rec","ab") as f :
                data=conn.recv(1024)
                if data==b'quit':
                    break
                f.write(data)
                conn.send("success".encode())
        print("file rec accomplish...")
    conn.close()

    客户端(发送):

    #file upload
    import  socket
    
    sk=socket.socket()
    ip_port=("127.0.0.1",8888)
    sk.connect(ip_port)
    
    with open('__init__.py','rb') as f:
        for i in  f:
            sk.send(i)
            data=sk.recv(1024)
            if data !=b'success':
                break
    
    sk.send('quit'.encode())

    注:内容来源于互联网

  • 相关阅读:
    117. Populating Next Right Pointers in Each Node II
    50. Pow(x, n)
    494. Target Sum
    Word Ladder
    HDU 4417
    POJ 2104
    POJ 3277
    【转】图论500题
    POJ 2991
    POJ 1436
  • 原文地址:https://www.cnblogs.com/hoaprox/p/9498405.html
Copyright © 2011-2022 走看看