socket只能实现同时一个服务和一个客户端实现交互,socketserver可以实现多个客户端同时和服务端交互

1.利用Socket编写简单的同一个端口容许多次会话的小案例:

服务端:

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author:CarsonLi import socket
'''模拟服务端'''
server=socket.socket()
server.bind(('localhost',6969)) #绑定需要监听的端口
server.listen(5) #开始监听
print('开始等待客户端发起请求')
while True:
conn,addr=server.accept() #等待客户端连接,并且返回两个参数
#conn是客户端连接过来而在服务器为期生成的一个连接实例, addr为连接的地址
print('服务器为客户端连接生成的实例:',conn)
print('客户端连接地址:',addr)
while True:
data=conn.recv(1024) #接收客户端发来的信息
print(data.decode())
conn.send(data.upper()) #返回个客户端信息
server.close()

  客户端:

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author:CarsonLi
import socket
'''模拟客户端'''
client=socket.socket() #声明socket类型,同时创建socket连接对象
client.connect(('localhost',6969))
while True:
msg=input('请输入需要发送的内容>>:').strip()
if len(msg)==0: #输入信息为空时不发送,否则在linux下运行时会出现死循环
continue
else:
client.send(msg.encode("utf-8")) #发送信息 在python3以后都只能发送byte类型,
data=client.recv(1024)#接收到的信息,需要定义大小
print(data.decode()) client.close()

  服务端运行结果:

D:\Python3.7.0\python.exe D:/PycharmProjects/OldManS14/day07/socket_server.py
开始等待客户端发起请求
服务器为客户端连接生成的实例: <socket.socket fd=436, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 6969), raddr=('127.0.0.1', 64403)>
客户端连接地址: ('127.0.0.1', 64403)
第一次
第二次
第三次
第四次
第五次

  客户端运行结果:

D:\Python3.7.0\python.exe D:/PycharmProjects/OldManS14/day07/socket_client.py
请输入需要发送的内容>>:第一次
第一次
请输入需要发送的内容>>:第二次
第二次
请输入需要发送的内容>>:第三次
第三次
请输入需要发送的内容>>:第四次
第四次
请输入需要发送的内容>>:第五次
第五次
请输入需要发送的内容>>:

 2.SocketServer 支持多个客户端

'''
SocketServer 支持多个客户端
'''
import socketserver class MyTCPHandler(socketserver.BaseRequestHandler):
'''
处理我们的socket,这个类必须继承socketserver.BaseRequestHandler
并且实现里面的handler函数
''' def setup(self):
print("这里处理请求前的的事情,也可以不写")
pass def handle(self):
'''处理客户端请求'''
while self:
try:
self.data = self.request.recv(1024).strip()
print("{} wrote:".format(self.client_address[0]))#客户端地址
print(self.data)
self.request.send(self.data.upper())
except ConnectionResetError as e:
print("客户端断开", e)
break def finish(self):
print("处理请求完成之后的事情,也可以不写")
pass if __name__=="__main__":
HOST,PORT = "localhost",6969
# server = socketserver.TCPServer((HOST,PORT),MyTCPHandler #不支持多并发
server = socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler) #支持多线程,多并发
# server = socketserver.ForkingTCPServer((HOST, PORT), MyTCPHandler) # 支持多进程,多并发,windows不能实现,linux上可以
#server.allow_reuse_address() #解决 在 socketServer程序里面出现 地址已经被占用
server.serve_forever()

 3.模拟ftp上传下载(只实现了里面的上传功能,其他功能也大同小异,就没有一一去写)

import socketserver,os,json

'''模拟ftp上传下载的服务端'''

class MyTCPHandler(socketserver.BaseRequestHandler):

    def setup(self):
pass def handle(self):
while True:
try:
self.data = self.request.recv(1024).strip()
print("{}".format(self.client_address[0]))
msg_dic = json.loads(self.data.decode())
print(msg_dic)
if hasattr(self,"server_"+msg_dic.get("action")):
func = getattr(self,"server_"+msg_dic.get("action"))
func(msg_dic)
except ConnectionResetError as e:
print(e)
break def server_put(self,*args):
'''服务端文件上传操作'''
msg_dic = args[0]
file_name = msg_dic.get("file_name") #文件名称
file_size = msg_dic.get("file_size")#文件大小
if os.path.isfile(file_name):
files = file_name.split(".") #截取文件名添加new ,例如 file.txt ==> file_new.txt
f = open(files[0]+"_new."+files[1],"wb")
else:
f = open(file_name, "wb")
self.request.send(b"200 ok")
recv_file_size = 0
while recv_file_size < file_size:
recv_data = self.request.recv(1024)
f.write(recv_data)
recv_file_size += len(recv_data) #大小计算
else:
print("file [%s] has uploaded..." % file_name)
f.close() def server_get(self,*args):
''' 下载文件功能 '''
pass def server_del(self,*args):
''' 下载删除功能 '''
pass if __name__ == "__main__":
ip,port = "localhost",9999
server = socketserver.ThreadingTCPServer((ip,port),MyTCPHandler)
server.serve_forever()

  客户端:

import socket,os,json

'''模拟ftp上传下载的客户端'''

class MyTCPClient(object):

    def __init__(self):
self.client=socket.socket() def help(self):
pass def connection(self,ip,port):
'''连接服务器'''
self.client.connect((ip, port)) def interactive(self):
while True:
input_str = input(">>:").strip()
if len(input_str) == 0: continue
action = input_str.split()[0]
if hasattr(self,"cmd_"+action): #用反射判断是否存在
func = getattr(self,"cmd_"+action)
func(input_str)
else:
print(action,"is not exist!") def client_put(self,*args):
'''客户端文件上传操作'''
input_str = args[0]
input_split = input_str.split()
if os.path.isfile(input_split[1]): # 判断是否是文件
file_size = os.stat(input_split[1]).st_size
msg_dic = {
"action":input_split[0],
"file_name":input_split[1],
"file_size":file_size
}
self.client.send(json.dumps(msg_dic).encode("utf-8")) #序列化之后编码
server_respone = self.client.recv(1024) #等待客户端确认
f = open(input_split[1],"rb") #打开文件
for line in f:
self.client.send(line)
else:
print(input_split[1],"upload success!")
f.close() #关闭文件
else:
print(input_split[1], "is not exist!") def client_get(self,*args):
'''文件下载操作'''
pass def client_del(self,*args):
'''删除功能'''
pass if __name__ == "__main__":
tcp_client = MyTCPClient()
tcp_client.connection("localhost",9999)
tcp_client.interactive()

  

Python3 Socket和SocketServer 网络编程的更多相关文章

  1. 如何使用socket进行java网络编程(二)

    通过在如何使用socket进行java网络编程(一)中程序的编写,可以总结出一些常用的java socket编程的范例来. ServerSocket server = new ServerSocket ...

  2. python3之socket&socketserver网络编程

    1.套接字与套接模块 套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象.它们允许程序接受并进行连接,如发送和接受数据.为了 ...

  3. socket&socketserver网络编程

    1.套接字与套接模块 套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象.它们允许程序接受并进行连接,如发送和接受数据.为了 ...

  4. Python 套接字socketserver网络编程

    为什么使用socketserver 虽然Python内置的socket和threading模块能实现简单的多线程服务器,在非正式环境,随便用用还是可以的,但是如果要在生产环境中使用,那是万万不够的. ...

  5. 如何使用socket进行java网络编程(五)

    本篇记录: 1.再谈readLine()方法 2.什么是真正的长连接 最近又参与了一个socket的项目,又遇到了老生常谈的readLine()问题:对方通过其vb程序向我方socketServer程 ...

  6. 如何使用socket进行java网络编程(三)

    本篇文章继续记录java网络通讯编程的学习.在本系列笔记的第一篇中曾经记录过一个项目中的程序,当时还处于项目早期,还未进入与第三方公司的联调阶段,笔者只是用java写了一个client程序模拟了一下第 ...

  7. 使用python的socket模块进行网络编程

    使用socket编程可以分成基于tcp和基于udp,tcp和udp两者最主要的区别是有无面向连接. 基于tcp的socket流程:

  8. 如何使用socket进行java网络编程(四)

    在上一篇的结尾,提到过用来处理每一个服务端accept到的socket,我们由原来最开始的单线程改成了多线程去处理,但是对每一个接收到的socket都new一个thread去处理,这样效率太低,我们需 ...

  9. socket函数集-----网络编程必备值得拥有

    accept(接受socket连线) 相关函数 socket,bind,listen,connect 表头文件 #include<sys/types.h> #include<sys/ ...

随机推荐

  1. xpath获取块元素下<br>下的信息

    再爬虫取字段的时候遇到一种类似下面的结构: <p> <br> "通用名称:xxxxxx" </p> 用xpath取的方式://p//text() ...

  2. Codeforces Round#516 Div.1 翻车记

    A:开场懵逼.然后发现有人1min过,于是就sort了一下,于是就过了.正经证明的话,考虑回文串两端点一定是相同的,所以最多有Σcnti*(cnti+1)/2个,cnti为第i种字母出现次数.而sor ...

  3. Luogu4899 IOI2018狼人(kruskal重构树+主席树)

    可以发现询问的即是“由起点开始‘只经过编号大于等于l的点’所形成的连通块”与“由终点开始‘只经过编号小于等于r的点’所形成的连通块”是否有交集.于是建出重构树,就可以知道每个询问的连通情况了.现在要知 ...

  4. [洛谷P4174][NOI2006]最大获利

    题目大意:同Petya and Graph,数据范围改成$n\leqslant5\times10^3,m\leqslant5\times10^4$ 题解:同上 卡点:无 C++ Code: #incl ...

  5. 【以前的空间】vijos 1720 阿狸的打字机

    https://www.vijos.org/p/1720 作为一个一个蒟蒻,跪了三个星期,终于在蔡大神的帮助下a了.这题网上的题解很多,不过大都把题解写的太简单了(对因为大神的题解只有三个字:傻叉题) ...

  6. 【BZOJ4066】简单题(KD-Tree)

    [BZOJ4066]简单题(KD-Tree) 题面 BZOJ 题解 如果这题不卡空间,并且不强制在线的话 显然可以用\(CDQ\)分治做 但是它又卡空间又强制在线,于是我们欢快的来用\(KD-Tree ...

  7. AOJ.720 丢失的学妹

    缺失的学妹 考察点 STL MAP Time Mem Len Lang 3.81s 39.1MB 0.68K G++ 题意分析 给出妹子学号的个数n,给出n个学号,和n-1个学号,求在n学号中那个没有 ...

  8. bzoj2724: [Violet 6]蒲公英(离散化+分块)

    我好弱啊..这题调了2天QwQ 题目大意:给定一个长度为n(n<=40000)的序列,m(m<=50000)次询问l~r之间出现次数最多的数.(区间众数) 这题如果用主席树就可以不用处理一 ...

  9. MySQL5.7 添加、删除用户与授权

    mysql -uroot -proot 例子: 创建用户mysql> CREATE USER 'xiaoyaoji'@'%' IDENTIFIED BY 'xiaoyaoji';Query OK ...

  10. matlab特殊符号表

    Character Sequence Symbol Character Sequence Symbol Character Sequence Symbol \alpha α \upsilon υ \s ...