Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1125706
  • 博文数量: 170
  • 博客积分: 1603
  • 博客等级: 上尉
  • 技术积分: 1897
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-09 15:54
文章分类

全部博文(170)

文章存档

2016年(27)

2015年(21)

2014年(27)

2013年(21)

2012年(7)

2011年(67)

我的朋友

分类: Python/Ruby

2011-04-21 10:55:07

尝试下python的socket编程,最简单的当然是从聊天室下手

首先要学会写线程,写socket通讯最基本服务端,客户端
先找了个多线程的服务器端代码

找来发现不对,里面许多变量的定义都没了,也不知道这个博主从哪里找来的源码,于是自己看

class Checker继承了threading.Thread,并修改了run方法来实现聊天室的相关函数,看了threading的代码
,原run方法实际是运行 target(args),而target与args其实就是threading.Thread的初始化参数,target就是定义传入函数,args就是target指向函数的参数,搞半天这个继承与重写run方法毫无意义还让代码不好理解

修改一下写一个方法xx(z,y),然后threading.Thread(target=xx,args=(z,))就不用写那个checker的class了

然后看修改的run函数到底如何实现聊天室收包,一个循环,不停的socket.accept(),recv(),最后包里没有东西,发现recvstr == ''后就结束循环,但是看他的代码总觉得有点问题,不单是因为少那几个变量定义,而是对整个连接的终止方式不台理解,然后就通过豆瓣看到下面连接

下面就说了3种结束判定方式——连接中也有实现代码
1个是通过总长
2是定义结束符
3是通过timeout来终止(也就是直接定义结束时间)

想了下觉得,定义个结束符,收到结束符号就关闭连接似乎不错,设想下聊天工具在点击关闭对话的时候应该是发一个特殊的符号来结束
于是就想去找一般别人都用什么符号来标识包结束,然后又翻到了下面的bbs记录

发现,普遍正确的做法是通过总长来结束,对于总长不定的,先发个包来定义总长.....
即“通用的办法是:先发送数据长度,之后发送数据。”
也就是说得自己定义协议(包结构?)
找到下面文章
怪不得之前搜索到的代码import了struct,查下struct的用法
“struct.pack用于将Python的值根据格式符,转换为字符串(因为Python中没有字节(Byte)类型,可以把这里的字符串理解为字节流,或字节数组)”
现在可以自己发字节流了!!

想想还是没头绪,又搜来搜去发现了下面文章
我现在的重点不在于解析Struct sockaddr_in 这种复杂结构,而是看见他代码里有while嵌套了一个while,而且accept()在第一层!,也就是说accept只用一次就可以,不需要每次接受数据都accept
阅读(1327) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~