python网络基础编程笔记(一)
2015-07-11 23:51
821 查看
感觉上python 和c,c++对网络的处理流程上是一样的。记录如下供以后参考
import socket, traceback, os, sys, select class stateclass: stdmask = select.POLLERR | select.POLLHUP | select.POLLNVAL def __init__(self, mastersock): self.p = select.poll() self.mastersock = mastersock self.watchread(mastersock) self.readbuffers = {} self.writebuffers = {} self.sockets = {mastersock.fileno():mastersock} def fd2socket(self, fd): return self.sockets[fd] def watchread(self, fd): self.p.register(fd, select.POLLIN | self.stdmask) def watchwrite(self, fd): self.p.register(fd, select.POLLOUT | self.stdmask) def watchboth(self, fd): self.p.register(fd, select.POLLIN | select.POLLOUT | self.stdmask) def dontwatch(self, fd): self.p.unregister(fd) def sendtoall(self, text, originfd): for line in text.split("\n"): line = line.strip() transmittext = str(self.fd2socket(originfd).getpeername()) + \ ": " + line + "\n" for fd in self.writebuffers.keys(): self.writebuffers[fd] += transmittext self.watchboth(fd) def newconn(self, sock): fd = sock.fileno() self.watchboth(fd) self.writebuffers[fd] = "Welcome to the chat server, %s\n" % \ str(sock.getpeername()) self.readbuffers[fd] = "" self.sockets[fd] = sock def readevent(self, fd): try: self.readbuffers[fd] += self.fd2socket(fd).recv(4096) except: self.closeout(fd) parts = self.readbuffers[fd].split("SEND") if len(parts) < 2: return elif parts[-1] == '': self.readbuffers[fd] = "" sendlist = parts[:-1] else: self.readbuffers[fd] = parts[-1] sendlist = parts[:-1] for item in sendlist: self.sendtoall(item.strip(), fd) def writeevent(self, fd): if not len(self.writebuffers[fd]): self.watchread(fd) return try: byteswritten = self.fd2socket(fd).send(self.writebuffers[fd]) except: self.closeout(fd) self.writebuffers[fd] = self.writebuffers[fd][byteswritten:] if not len(self.writebuffers[fd]): self.watchread(fd) def errorevent(self, fd): self.closeout(fd) def closeout(self, fd): self.dontwatch(fd) try: self.fd2socket(fd).close() except: pass del self.writebuffers[fd] del self.sockets[fd] def loop(self): while 1: result = self.p.poll() for fd, event in result: if fd == self.mastersock.fileno() and event == select.POLLIN: try: newsock, addr = self.fd2socket(fd).accept() newsock.setblocking(0) print "Got connection from ", newsock.getpeername() self.newconn(newsock) except: pass elif event == select.POLLIN: self.readevent(fd) elif event == select.POLLOUT: self.writeevent(fd) else: self.errorevent(fd) host = '' port = 51423 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((host, port)) s.listen(1) s.setblocking(0) state = stateclass(s) state.loop()
相关文章推荐
- https原理及tomcat配置https方法
- 浅悉软考网络工程师考试出题风格变化
- tinyhttpd学习笔记(一)编译错误及运行结果
- 网络错误代码
- 聊聊HTTPS和SSL/TLS协议
- 基于复杂城市道路场景的消失点检测 Vanishing point detction(IET Computer Vision)个人主页:http://www.newneu.neu.edu.cn/?p=1
- HTTP::Request
- NS3网络仿真(5): 数据包分析
- 考试前的零散学习【1】网络地址a.b.c.d/x;数据报分片
- NetworkRequest网络请求数据类
- 神经网络的基础学习
- httpClient通过post上传数据
- 南阳oj 题目199 无线网络覆盖
- 新研发一个产品:HDMI信号转化网络信号传输,用海思HI3516C方案实现。
- Android WelcomeActivity 启动画更换网络图片
- STM32W108无线射频模块外部中断接口应用实例
- java网络编程
- 网络-WinSocket-socket编程
- SNMP详解
- 使用UTL_SMTP发送中文邮件及使用UTL_TCP从附件服务器获取中文附件