Python在linux终端模式下的类似聊天消息对话框

首先看一下最终效果,在终端模式下实现类似于聊天的对话框

实现方式如下,通过两个list: iwords和swords分别缓存来自终端输入和socket收到的数据,然后再将数据通过屏幕输出并通过socket接口发送出去,通过四个独立的线程分别完成各自的工作:
myinput:获取输入区域内的输入数据,并将数据append到iwords和swords
myoutput:检测swords长度并通过swords.pop(0)的方式将list中的数据按队列的方式显示到输出区域
sserver:socket的server端程序,用于接收数据,并将其append到swords中
sclient:socket的client端程序,用户将iwords中的数据通过socket接口发送出去

sserver和sclient都通过参数flag来控制是启用TCP或者UDP协议,(0:tcp, 1:udp)

代码如下:

对话双方用的代码都是一样的,唯一需要修改的就是对端地址和对端端口两个参数(r_addr和r_port),在本地同时起两个console测试就是最上面的效果图,TCP建链状态如下:

用wireshark跟踪也可以看到消息内容:

 

已知的问题:
1.程序没有结束功能,如果是通过python运行的,可以按下面方式杀死进程

sudo ps aux | grep socket | grep -v 'grep'| awk '{print $2}' | xargs kill -9

2.因为程序没有正常退出的功能,所以有的时候socket会初始化失败,大致都是因为端口被占用或者已经被监听了

3.输入框的提示符显示不友好,有时候无法正从刷新出来

4.偶然遇见一次tcp connect重复多次会出现建立监听的情况,但是后来没有再复现

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注