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 @   权杖攻城狮  阅读(1225)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示