Python拾忆--多线程的socket服务器
阳光明媚的午后,想想最近要开始从写Java到写Python了,就随手打开电脑来体验一下Python与Java之间的不同吧~
记得我还在上大二的时候,那个时候才开始学Java,最感兴趣的就是Java书最后章节讲的socket套接字那部分,第一次看到同时打开多个黑底白字的shell界面的样子,那么的激动T.T~那个时候还不知道什么是多线程,一个客户端就让其他的客户端不工作了…..那会感觉多线程是我学的最麻烦的地方….那时用了一个下午搞了个多线程的socket程序乐呵呵的玩了好久~~
要说我最讨厌Python什么,那一定是它没有java一个方法中的{},取而代之的居然是缩进….真心好不爽额….吐槽就到这里了T.T,这次看了一下Python的socket教程发现和Java大同小异,依旧是创建连接,客户和服务器通过send和recv方法通信,最后进行关闭,而为了防止一个客户端与服务端连接导致其他客户端挂起的现象,我还特意加上了Python的多线程来保证不会出现这个现象,对于Python的多线程,我更倾向于创建threading.Thread的子类来包装一个线程对象,可能这与我经常写Java有关吧~~更熟悉这种方式,下面就把服务端和客户端的代码贴出来:
#coding=utf-8
import socket
import threading,getopt,sys,string opts, args = getopt.getopt(sys.argv[1:], "hp:l:",["help","port=","list="])
#设置默认的最大连接数和端口号,在没有使用命令传入参数的时候将使用默认的值
list=50
port=8001
def usage():
print """
-h --help print the help
-l --list Maximum number of connections
-p --port To monitor the port number
"""
for op, value in opts:
if op in ("-l","--list"):
list = string.atol(value)
elif op in ("-p","--port"):
port = string.atol(value)
elif op in ("-h"):
usage()
sys.exit() def jonnyS(client, address):
try:
#设置超时时间
client.settimeout(500)
#接收数据的大小
buf = client.recv(2048)
#将接收到的信息原样的返回到客户端中
client.send(buf)
#超时后显示退出
except socket.timeout:
print 'time out'
#关闭与客户端的连接
client.close() def main():
#创建socket对象。调用socket构造函数
#AF_INET为ip地址族,SOCK_STREAM为流套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#将socket绑定到指定地址,第一个参数为ip地址,第二个参数为端口号
sock.bind(('localhost', port))
#设置最多连接数量
sock.listen(list)
while True:
#服务器套接字通过socket的accept方法等待客户请求一个连接
client,address = sock.accept()
thread = threading.Thread(target=jonnyS, args=(client, address))
thread.start() if __name__ == '__main__':
main()
为了防止客户数量过多而造成后面的客户等待,我设置了超时时间,虽然不能从更本解决这个问题,但是可以防止一些客户端白白占用着连接数而不工作,也算是总讨巧的方案了~而且通过传入参数的方式也可以方便的控制监听的端口号和允许最多的连接数,虽然没有考证过系统最多开启多少个进程,不过对于一个练习而言已经足够了,希望有人知道的话欢迎留言告诉我哈~
下面是客户端的:
#coding=utf-8
import getopt,socket,sys,string opts, args = getopt.getopt(sys.argv[1:], "hi:p:",["help","ip=","port="])
#设置默认的ip地址和端口号,在没有使用命令传入参数的时候将使用默认的值
host="localhost"
port=8001
def usage():
print """
-h --help print the help
-i --ip Enter the IP address to connect
-p --port Enter the port number to connect
"""
for op, value in opts:
if op in ("-i","--ip"):
host = value
elif op in ("-p","--port"):
port = string.atol(value)
elif op in ("-h"):
usage()
sys.exit() def main():
#创建socket对象。调用socket构造函数
#AF_INET为ip地址族,SOCK_STREAM为流套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#设置要连接的服务器的ip号和端口号
sock.connect((host, port))
#客户端输入一个字符串给服务器
message = raw_input("inupt:")
#pdb.set_trace()
sock.send(message)
print 'ServerOupt:'+ sock.recv(2048)
#关闭与服务器的连接
sock.close() if __name__ == '__main__':
main()
客户端就相对简单的多了,很简单的一个读取用户输入,发送给服务器然后接收回来这样一个简单的功能,在设置过编码之后中文什么的也是可以的了~值得注意的就是recw()方法中设置的发送大小,太小的话会报错的~
总体来说和我第一次用Java来实现的时候比起来,现在已经轻松容易的多了,不过也正好可以借此机会温习一下过去的知识了~学而不思则罔,思而不学则殆!
Python拾忆--多线程的socket服务器的更多相关文章
- 可扩展多线程异步Socket服务器框架EMTASS 2.0 (转自:http://blog.csdn.net/hulihui)
可扩展多线程异步Socket服务器框架EMTASS 2.0 (转自:http://blog.csdn.net/hulihui) 0 前言 >>[前言].[第1节].[第2节].[第3节]. ...
- 可扩展多线程异步Socket服务器框架EMTASS 2.0 续
转载自Csdn:http://blog.csdn.net/hulihui/article/details/3158613 (原创文章,转载请注明来源:http://blog.csdn.net/huli ...
- 可扩展多线程异步Socket服务器框架EMTASS 2.0
0 前言 >>[前言].[第1节].[第2节].[第3节].[第4节].[第5节].[第6节] 在程序设计与实际应用中,Socket数据包接收服务器够得上一个经典问题了:需要计算机与网络编 ...
- 通过编写聊天程序来熟悉python中多线程及socket的用法
1.引言 Python中提供了丰富的开源库,方便开发者快速就搭建好自己所需要的应用程序.本文通过编写基于tcp/ip协议的通信程序来熟悉python中socket以及多线程的使用. 2.python中 ...
- Socket服务器整体架构概述
转载:http://www.cnblogs.com/tianzhiliang/archive/2010/10/28/1863684.html Socket服务器主要用于提供高效.稳定的数据处理.消息转 ...
- 《Unity 3D游戏客户端基础框架》多线程异步 Socket 框架构建
引言: 之前写过一个 demo 案例大致讲解了 Socket 通信的过程,并和自建的服务器完成连接和简单的数据通信,详细的内容可以查看 Unity3D -- Socket通信(C#).但是在实际项目应 ...
- 转:Socket服务器整体架构概述
Socket服务器主要用于提供高效.稳定的数据处理.消息转发等服务,它直接决定了前台应用程序的性能.我们先从整体上认识一下Socket服务器,Socket服务器从架构上一般分为:网络层.业务逻辑层.会 ...
- python 多线程ping大量服务器在线情况
需要ping一个网段所有机器的在线情况,shell脚步运行时间太长,用python写个多线程ping吧,代码如下: #!/usr/bin/python #coding=utf-8 ''' Create ...
- python之路-----多线程与多进程
一.进程和线程的概念 1.进程(最小的资源单位): 进程:就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成. 程序:我们编写的程序用来描述进程要完成哪些功能以 ...
随机推荐
- Delphi ini文件读写
参考:http://www.cnblogs.com/zhangzhifeng/archive/2011/12/01/2270267.html 一.ini文件的结构 ;这是关于 ini 文件的注释 [节 ...
- 在python中使用concurrent.futures实现进程池和线程池
#!/usr/bin/env python # -*- coding: utf-8 -*- import concurrent.futures import time number_list = [1 ...
- poj 2236:Wireless Network(并查集,提高题)
Wireless Network Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 16065 Accepted: 677 ...
- poj 2104:K-th Number(划分树,经典题)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 35653 Accepted: 11382 Ca ...
- MongoDB学习(1)—在Windows系统中安装MongoDB
概述 本文主要介绍在Windows系统安装MongoDB的方法. MongoDB官方网址:http://www.mongodb.org/,最新版本为2.6.7. 注意: 从2.2版本开始,MongoD ...
- 【rqnoj378】 约会计划
题目描述 cc是个超级帅哥,口才又好,rp极高(这句话似乎降rp),又非常的幽默,所以很多mm都跟他关系不错.然而,最关键的是,cc能够很好的调解各各妹妹间的关系.mm之间的关系及其复杂,cc必须严格 ...
- javascript的笔记精简版
在写javascript的代码时一定要用单引号或者双引号括起来,不带引号的话就以字符串来处理 在javascript里面不能以纯数字或者click命名函数或者变量 要想修改标签的属性,在html里面怎 ...
- connot resolve symbol R
出现这个原因大都是layout里的xml文件出错,就不会自动生成R文件
- 如何给你的ASP.NET页面添加HelpPage
如何给你的ASP.NET页面添加HelpPage 最近写了一些webAPI,所以需要搞一套API的帮助文档,google了一下,发现这是可以自动生成的,以下就是如何自动生成HelpPage的说明. 参 ...
- Javaweb三大组件之过滤器filter
Filter的三个方法 void init(FilterConfig):在Tomcat启动时被调用: void destroy():在Tomcat关闭时被调用: void doFilter(Servl ...