tornado做简单socket服务器(TCP)
http://blog.csdn.net/chenggong2dm/article/details/9041181
服务器端代码如下:
- #! /usr/bin/env python
- #coding=utf-8
- from tornado.tcpserver import TCPServer
- from tornado.ioloop import IOLoop
- class Connection(object):
- clients = set()
- def __init__(self, stream, address):
- Connection.clients.add(self)
- self._stream = stream
- self._address = address
- self._stream.set_close_callback(self.on_close)
- self.read_message()
- print "A new user has entered the chat room.", address
- def read_message(self):
- self._stream.read_until('\n', self.broadcast_messages)
- def broadcast_messages(self, data):
- print "User said:", data[:-1], self._address
- for conn in Connection.clients:
- conn.send_message(data)
- self.read_message()
- def send_message(self, data):
- self._stream.write(data)
- def on_close(self):
- print "A user has left the chat room.", self._address
- Connection.clients.remove(self)
- class ChatServer(TCPServer):
- def handle_stream(self, stream, address):
- print "New connection :", address, stream
- Connection(stream, address)
- print "connection num is:", len(Connection.clients)
- if __name__ == '__main__':
- print "Server start ......"
- server = ChatServer()
- server.listen(8000)
- IOLoop.instance().start()
经测试后发现,tornado的接收方法里,已经做了粘包处理。比如第18行的代码,就是用的tornado.iostream.BaseIOStream类的read_until(delimiter, callback) 方法。这个方法,将会从缓冲区里,直到读到截止标记(比如'\n'),就产生一次回调。如果没有截止标记,缓冲区就攒数据,直到等到截止标记出现,才会产生回调。看了一下源码,缓冲区默认是max_buffer_size=104857600 。
下面是客户端代码:
- #! /usr/bin/env python
- #coding=utf-8
- import socket
- import time
- HOST = '127.0.0.1' # The remote host
- PORT = 8000 # The same port as used by the server
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.connect((HOST, PORT))
- s.sendall('Hello, \nw')
- time.sleep(5)
- s.sendall('ord! \n')
- data = s.recv(1024)
- print 'Received', repr(data)
- time.sleep(60)
- s.close()
运行后,可以看到,服务器端,会打出:
Hello,
word!
tornado做简单socket服务器(TCP)的更多相关文章
- 码海拾遗:简单Socket(TCP)类实现
最近刚开始啃Unix网络编程(卷1:套接字联网API),为加深TCP连接的建立和终止的理解与记忆,记下本文,方便以后翻看. 同时留下的还有简单的Socket(TCP)类: mySocket.h #pr ...
- C# socket编程实践——支持广播的简单socket服务器
在上篇博客简单理解socket写完之后我就希望写出一个websocket的服务器了,但是一路困难重重,还是从基础开始吧,先搞定C# socket编程基本知识,写一个支持广播的简单server/clie ...
- Linux 简单socket实现TCP通信
服务器端代码 #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <stri ...
- 简单socket服务器编程
package socket; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; ...
- 再次回首 TCP Socket服务器编程
转载:http://www.cnblogs.com/zc22/archive/2010/06/27/1766007.html ------------------ 前言 --------------- ...
- 经过一年时间的沉淀 再次回首 TCP Socket服务器编程--转
------------------ 前言 ------------------ 开发了这么多年,发现最困难的程序开发就是通讯系统. 其他大部分系统,例如CRM/CMS/权限框架/MIS之类的,无论怎 ...
- Linux 下 简单客户端服务器通讯模型(TCP)
原文:Linux 下 简单客户端服务器通讯模型(TCP) 服务器端:server.c #include<stdio.h> #include<stdlib.h> #include ...
- Ajax跨域问题及解决方案 asp.net core 系列之允许跨越访问(Enable Cross-Origin Requests:CORS) c#中的Cache缓存技术 C#中的Cookie C#串口扫描枪的简单实现 c#Socket服务器与客户端的开发(2)
Ajax跨域问题及解决方案 目录 复现Ajax跨域问题 Ajax跨域介绍 Ajax跨域解决方案 一. 在服务端添加响应头Access-Control-Allow-Origin 二. 使用JSONP ...
- C#中使用Socket实现简单Web服务器
上一篇博客中介绍了怎样使用socket访问web服务器.关键有两个: 熟悉Socket编程: 熟悉HTTP协议. 上一篇主要是通过socket来模拟浏览器向(任何)Web服务器发送(HTTP)请求,重 ...
随机推荐
- Visual Assist X 10.6.1837完美破解版(带VS2010破解)
Visual Assist X 10.6.1837完美破解版(带VS2010破解) 实用软件, 资源分享Add comments 八102011 转载自:http://www.blog.namind. ...
- Appcn 移动开发 前台与服务器数据交互
第一次写.嘿嘿. 言归正传,这几天开始学习移动开发,使用的是Appcan平台.Appcan平台采用HTML5+CSS3做开发 实现跨平台,正好可以满足我们的业务需求. Appacn和数据库进行交互的方 ...
- PHP学习笔记 - 进阶篇(3)
PHP学习笔记 - 进阶篇(3) 类与面向对象 1.类和对象 类是面向对象程序设计的基本概念,通俗的理解类就是对现实中某一个种类的东西的抽象, 比如汽车可以抽象为一个类,汽车拥有名字.轮胎.速度.重量 ...
- String.IsNullOrWhiteSpace和String.IsNullOrEmpty的区别
以前刚入行的时候判断字符串的时候用 string a="a"; a==""; a==null; 后来发现了String.IsNullOrEmpty感觉方便了好多 ...
- js实现跨域(jsonp, iframe+window.name, iframe+window.domain, iframe+window.postMessage)
一.浏览器同源策略 首先我们需要了解一下浏览器的同源策略,关于同源策略可以仔细看看知乎上的一个解释.传送门 总之:同协议,domain(或ip),同端口视为同一个域,一个域内的脚本仅仅具有本域内的权限 ...
- Javascript中数组
Javascript中数组 1.什么是数组 所谓的数组就是一组数据的集合,在内存中表现为一段连续的内存地址(保存在堆内存) 2.创建数组的含义 创建数组的目的:就是为了保存更多的数据 3.数组的定义 ...
- UVALive 6811 Irrigation Line(二分图最小点覆盖--匈牙利算法)
题意:求最少的线可以覆盖一个由0.1两种数字组成的图中所有的1. eg: 只需要两条线即可. 分析: 1.先为上述例子的行列标号 2.若图中数字为1,则代表该数字所在的行与列有关联. 例如第r1行第c ...
- 一些常用sqlite语句
1,如果表不存在就新建一个 CComBSTR bstrCreatBat(L”CREATE TABLE IF NOT EXISTS tb_Name (\ rowIdIndex INTEGER PRIM ...
- 分类算法之贝叶斯(Bayes)分类器
摘要:旁听了清华大学王建勇老师的 数据挖掘:理论与算法 的课,讲的还是挺细的,好记性不如烂笔头,在此记录自己的学习内容,方便以后复习. 一:贝叶斯分类器简介 1)贝叶斯分类器是一种基于统计的分类器 ...
- Centos 6.5 配置nginx服务
官方网站:http://nginx.org最新版本:1.7.11官方文档:http://nginx.org/en/docs/ 一.安装NGINX查看当前centos版本: #cat /etc/redh ...