Demo/在线聊天/Socket/Java

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/XGL1569348/article/details/70832439

三更:4.30 傍晚
Fix bugs
前面的流开闭问题解决了,主要是没有控制好流的开闭的时机,需要监听的地方应该全部采用多线程,这样Socket流才能被持续监听。不能随手就close包装完的流,这样会导致失去连接,然后得被迫再连接。

这里写图片描述

还有一个缺点, Connection reset. 因为服务器端的监听是处于 while(true){…} 中,没有监听客户端的退出,客户端退出之后,对这个不存在的Socket流进行读写,就报IOException了。
想到比较好的方法就是,客户端在退出的时候,给服务器一个我要退出的消息,让服务器关闭对应的Chat线程。
没改的原因是,懒…(别的地方没问题的话,没法读写不就是客户端关闭了吗/doge

这里写图片描述


二更: 4.30 凌晨
完成了框架。
这里写图片描述
这里写图片描述
这里写图片描述
虽然是完成了看上去可以通讯。
但是问题还是很多。
1.客户端打开后和服务器建立连接,建立的socket流一开就关闭?频繁开闭开闭,输入输入就开闭开闭,导致经常性打不开输入流,报错,效率极低。
2.还是流的问题,经常性不能完成全体发布消息,估计还是流没打开,服务器根本拿不到输出流。


一更:
上次说的问题,服务器的端口是listening状态下,必须完成释放,而eclipse 的 Run 逻辑就是直接跑,并不会去关闭原来的程序。而客户端只是连接一下这个端口和服务器对下号,之后会获得一个系统分配的端口,不会有冲突的问题。


学习了一阵的Java Socket相关的东西(才不是一直在写数理作业/doge
勉强写了个百来行可以实现及其简陋的在线聊天的Demo。

逻辑很简单,Listener负责多线程地监听是否有连接,然后传给Chat和Manager。
Chat负责获取输入、输出。
Manager负责管理Chat的对象(保存在一个Vector里面,注意线程安全),获取输入的消息,统一公布输出。
使用Telnet代替客户端进行通讯。(变向多平台lol)

待更新……(图形化界面的客户端、可传输文件)

遇到的坑:

  • Telnet很古怪。
    使用BufferedWriter进行输出的话,会前面自带一个空格,改为PrintStream后解决;输入语句的时候,包括删除符都一起弄出来了(在Console里面检查到各种问号什么的)。感觉应该是Telnet本身的问题,看看之后换成有真正客户端的情况会不会有这个问题。

  • 使用BufferedReader readline()的时候,看了下源码,发现本身是可以实现忽略换行符的功能
          String readLine(boolean ignoreLF) throws IOException {…}
    然而只能调用无参,默认False的重载。不知道是出于什么目的这样写…………黑线……

  • 有个小小BUG,分配用户名的时候直接从Vector里面拿Index,万一前面被remove的话会改变所有项的Index。

  • 在Eclipse下运行这个程序,需要重启的时候,如果直接Run,就会提示端口被占用,因为前面的程序并没有退出,怀疑是我的程序里面没有运行到关闭ServerSocket的地方,端口没有被释放?(待解决)

运行预览

代码托管地址: https://github.com/GrayXu/OnlineChatting

猜你喜欢

转载自blog.csdn.net/XGL1569348/article/details/70832439