阳光明媚的午后,想想最近要开始从写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服务器的更多相关文章

  1. 可扩展多线程异步Socket服务器框架EMTASS 2.0 (转自:http://blog.csdn.net/hulihui)

    可扩展多线程异步Socket服务器框架EMTASS 2.0 (转自:http://blog.csdn.net/hulihui) 0 前言 >>[前言].[第1节].[第2节].[第3节]. ...

  2. 可扩展多线程异步Socket服务器框架EMTASS 2.0 续

    转载自Csdn:http://blog.csdn.net/hulihui/article/details/3158613 (原创文章,转载请注明来源:http://blog.csdn.net/huli ...

  3. 可扩展多线程异步Socket服务器框架EMTASS 2.0

    0 前言 >>[前言].[第1节].[第2节].[第3节].[第4节].[第5节].[第6节] 在程序设计与实际应用中,Socket数据包接收服务器够得上一个经典问题了:需要计算机与网络编 ...

  4. 通过编写聊天程序来熟悉python中多线程及socket的用法

    1.引言 Python中提供了丰富的开源库,方便开发者快速就搭建好自己所需要的应用程序.本文通过编写基于tcp/ip协议的通信程序来熟悉python中socket以及多线程的使用. 2.python中 ...

  5. Socket服务器整体架构概述

    转载:http://www.cnblogs.com/tianzhiliang/archive/2010/10/28/1863684.html Socket服务器主要用于提供高效.稳定的数据处理.消息转 ...

  6. 《Unity 3D游戏客户端基础框架》多线程异步 Socket 框架构建

    引言: 之前写过一个 demo 案例大致讲解了 Socket 通信的过程,并和自建的服务器完成连接和简单的数据通信,详细的内容可以查看 Unity3D -- Socket通信(C#).但是在实际项目应 ...

  7. 转:Socket服务器整体架构概述

    Socket服务器主要用于提供高效.稳定的数据处理.消息转发等服务,它直接决定了前台应用程序的性能.我们先从整体上认识一下Socket服务器,Socket服务器从架构上一般分为:网络层.业务逻辑层.会 ...

  8. python 多线程ping大量服务器在线情况

    需要ping一个网段所有机器的在线情况,shell脚步运行时间太长,用python写个多线程ping吧,代码如下: #!/usr/bin/python #coding=utf-8 ''' Create ...

  9. python之路-----多线程与多进程

    一.进程和线程的概念 1.进程(最小的资源单位): 进程:就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成. 程序:我们编写的程序用来描述进程要完成哪些功能以 ...

随机推荐

  1. Android中libs目录下armeabi和armeabi-v7a的区别

    armeabi默认选项,支持基于 ARM* v5TE 的设备支持软浮点运算(不支持硬件辅助的浮点计算)支持所有 ARM* 设备 armeabi-v7a支持基于 ARM* v7 的设备支持硬件 FPU ...

  2. SQL Server 2014 BI新特性(一)五个关键点带你了解Excel下的Data Explorer

    Data Explorer是即将发布的SQL Server 2014里的一个新特性,借助这个特性讲使企业中的自助式的商业智能变得更加的灵活,从而也降低了商业智能的门槛. 此文是在微软商业智能官方博客里 ...

  3. PHP连接打印机

    <?php header("Content-type: text/html; charset=utf-8"); class Netprint{ public $host = ...

  4. ASP.NET Identity 3.0教程

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:我相信有些人和我一样,已经开始把ASP.NET 5用于产品开发了.不过现在最大的问题是 ...

  5. 发送http请求get方法

    //获取网页html NSURL* url = [NSURL URLWithString:@"http://www.baidu.com"]; NSMutableURLRequest ...

  6. jquery audio player

    <!DOCTYPE html><html lang="en"> <head>  <meta charset="utf-8&quo ...

  7. 【转】Struts2解决表单重复提交问题

    用户重复提交表单在某些场合将会造成非常严重的后果.例如,在使用信用卡进行在线支付的时候,如果服务器的响应速度太慢,用户有可能会多次点击提交按钮,而这可能导致那张信用卡上的金额被消费了多次.因此,重复提 ...

  8. 【前台 ajax】web项目前台传递数组给后台 两种方式

    项目使用maven    springMVC 有需求 将前台的数组   在ajax中 送给后台 方式1: 前台代码:[注意:ajax中的属性---traditional:true,  ] 如果Post ...

  9. Loadrunner中参数化实战(1)-Sequential+Each iteration

    参数化数据30条: 脚本如下,演示登录,投资,退出操作是,打印手机号: 首先验证Vugen中迭代: Sequential+Each iteration 设置迭代4次Action 结果如下:

  10. DHCP欺骗(DHCP Sproofing)

    DHCP欺骗(DHCP Sproofing)   DHCP Sproofing同样是一种中间人攻击方式.DHCP是提供IP地址分配的服务.当局域网中的计算机设置为自动获取IP,就会在启动后发送广播包请 ...