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())

 

注:内容来源于互联网

posted @ 2018-08-18 19:53  权杖攻城狮  阅读(1201)  评论(0编辑  收藏  举报