http://blog.csdn.net/chenggong2dm/article/details/9041181

服务器端代码如下:

  1. #! /usr/bin/env python
  2. #coding=utf-8
  3. from tornado.tcpserver import TCPServer
  4. from tornado.ioloop  import IOLoop
  5. class Connection(object):
  6. clients = set()
  7. def __init__(self, stream, address):
  8. Connection.clients.add(self)
  9. self._stream = stream
  10. self._address = address
  11. self._stream.set_close_callback(self.on_close)
  12. self.read_message()
  13. print "A new user has entered the chat room.", address
  14. def read_message(self):
  15. self._stream.read_until('\n', self.broadcast_messages)
  16. def broadcast_messages(self, data):
  17. print "User said:", data[:-1], self._address
  18. for conn in Connection.clients:
  19. conn.send_message(data)
  20. self.read_message()
  21. def send_message(self, data):
  22. self._stream.write(data)
  23. def on_close(self):
  24. print "A user has left the chat room.", self._address
  25. Connection.clients.remove(self)
  26. class ChatServer(TCPServer):
  27. def handle_stream(self, stream, address):
  28. print "New connection :", address, stream
  29. Connection(stream, address)
  30. print "connection num is:", len(Connection.clients)
  31. if __name__ == '__main__':
  32. print "Server start ......"
  33. server = ChatServer()
  34. server.listen(8000)
  35. IOLoop.instance().start()

经测试后发现,tornado的接收方法里,已经做了粘包处理。比如第18行的代码,就是用的tornado.iostream.BaseIOStream类的read_until(delimiter, callback) 方法。这个方法,将会从缓冲区里,直到读到截止标记(比如'\n'),就产生一次回调。如果没有截止标记,缓冲区就攒数据,直到等到截止标记出现,才会产生回调。看了一下源码,缓冲区默认是max_buffer_size=104857600 。

下面是客户端代码:

  1. #! /usr/bin/env python
  2. #coding=utf-8
  3. import socket
  4. import time
  5. HOST = '127.0.0.1'    # The remote host
  6. PORT = 8000           # The same port as used by the server
  7. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  8. s.connect((HOST, PORT))
  9. s.sendall('Hello, \nw')
  10. time.sleep(5)
  11. s.sendall('ord! \n')
  12. data = s.recv(1024)
  13. print 'Received', repr(data)
  14. time.sleep(60)
  15. s.close()

运行后,可以看到,服务器端,会打出:

Hello,

word!

tornado做简单socket服务器(TCP)的更多相关文章

  1. 码海拾遗:简单Socket(TCP)类实现

    最近刚开始啃Unix网络编程(卷1:套接字联网API),为加深TCP连接的建立和终止的理解与记忆,记下本文,方便以后翻看. 同时留下的还有简单的Socket(TCP)类: mySocket.h #pr ...

  2. C# socket编程实践——支持广播的简单socket服务器

    在上篇博客简单理解socket写完之后我就希望写出一个websocket的服务器了,但是一路困难重重,还是从基础开始吧,先搞定C# socket编程基本知识,写一个支持广播的简单server/clie ...

  3. Linux 简单socket实现TCP通信

    服务器端代码 #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <stri ...

  4. 简单socket服务器编程

    package socket; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; ...

  5. 再次回首 TCP Socket服务器编程

    转载:http://www.cnblogs.com/zc22/archive/2010/06/27/1766007.html ------------------ 前言 --------------- ...

  6. 经过一年时间的沉淀 再次回首 TCP Socket服务器编程--转

    ------------------ 前言 ------------------ 开发了这么多年,发现最困难的程序开发就是通讯系统. 其他大部分系统,例如CRM/CMS/权限框架/MIS之类的,无论怎 ...

  7. Linux 下 简单客户端服务器通讯模型(TCP)

    原文:Linux 下 简单客户端服务器通讯模型(TCP) 服务器端:server.c #include<stdio.h> #include<stdlib.h> #include ...

  8. 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 ...

  9. C#中使用Socket实现简单Web服务器

    上一篇博客中介绍了怎样使用socket访问web服务器.关键有两个: 熟悉Socket编程: 熟悉HTTP协议. 上一篇主要是通过socket来模拟浏览器向(任何)Web服务器发送(HTTP)请求,重 ...

随机推荐

  1. Java之绘制方法

    绘制图形所用的函数类别分别为视图类.图形单元类和页面类. 对视图类,设置窗口的位置和大小: 对图形单元类,设置图形边界: 对页面类,只有当页面作为元件,该函数才起作用,设置元件边界. 一般构建窗口我们 ...

  2. Web前端开发:SQL Jsp小项目(一)

    Jsp的学习算是告一段落,针对这段时间的学习,写了一个Jsp小项目来巩固学到的知识. 框架示意图 User list process UserAdd process 需要的界面效果: 需要工具:Ecl ...

  3. An Easy Task

    An Easy Task Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total ...

  4. CCNA第二讲笔记

    网络定义:一组由介质(线缆)互联的网络设备(路由器.交换机)和终端系统(PC): 工作组:局域网范畴,范围最小的局域网,且不涉及网络设备.台式机需要有多块网卡,利用双绞线与其他台式机进行互联,扩展性差 ...

  5. 【原】Oracle拼接字段

    select FLIGHT_DATE, replace(wm_concat(FLIGHT_NO), ',', '*') FLIGHT_NO from T2001 group by FLIGHT_DAT ...

  6. css中单位px,em,rem的区别

    1,px像素(Pixel).相对长度单位.像素px是相对于显示器屏幕分辨率而言的. 2,em是相对长度单位.相对于当前对象内文本的字体尺寸.如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认 ...

  7. php获取数组中重复数据的两种方法

    分享下php获取数组中重复数据的两种方法. 1,利用php提供的函数,array_unique和array_diff_assoc来实现 <?php function FetchRepeatMem ...

  8. VLAN和Trunk

    Vlan实验题: 如图所示 解答过程 (一)相同vlan之间的设备全连通 1. 在SW1和SW2上分别创建vlan2和vlan3, 命令如下 SW1# vlan database SW1(vlan)# ...

  9. OS/400相关介绍

    OS/400是IBM公司为其AS/400以及AS/400e系列商业计算机开发的操作系统,由于OS/400的设计充分考虑了AS/400的硬件设计,而且通常作为AS/400的一个基本组件被提供,因此几乎没 ...

  10. java 两个日期之间的标准工作日(原创)

    package control; import java.text.ParseException; import java.text.SimpleDateFormat; import java.uti ...