学习通信写简单的服务端的一点问题和想法

最近几天的培训,都在做一个简单的服务端和客户端,并使两者能实现通信。随着课程的深入,功能也在一点点完善,随之发现的问题和需要注意的地方也越来越多。

首先是线程问题。今天在做服务端的界面时,点击添加过监听器的按钮后发现程序会“停住”,表现为按钮不会弹起。这个问题的原因是点击按钮来触发建立服务端的方法后,在等待客户端接入时会出现阻塞,如果没有一个客户端接入,那么程序就一直停在这里。处理的方法是,将服务端的类继承Thread,把任务交给线程去处理。这样,点击启动服务器的按钮时,会有一个服务端线程被建立,几遍出现阻塞,也不会影响程序整体的运行。

第二个问题是服务端启停的控制。启动部分,当点击“启动”按钮时,建立一个服务端线程对象,并将一个判断是否有服务端线程被建立的boolean变量赋值为true。这个boolean会在服务端线程的类中作为建立服务器的条件。停止部分,其实是要让线程停止。我们知道,线程是无法中断的,只能在run()方法执行完之后线程自动停止,或者让线程休眠。在点击“停止”按钮后,将上面的boolean变量赋值为false,成为让服务器关闭的条件。但是一个简单的server.close()是不够的。原因是服务器关闭后,线程依然存在,在运行程序,按下停止按钮后,仍然能实现服务端与客户端的通信。需要说明的是,虽然服务器关闭后依然能与客户端通信,但也仅限于还没关闭的客户端,新的客户端不能在于服务端连接并通信,因为服务端已经客观上不存在了。停止线程,还没有想到什么好办法,只能先用一个治标不治本的方法暂时解决。在按下停止按钮以关闭服务器后,我将用来存放客户端的队列清空,这样即便线程依然存在,但是客户端没了,通过线程所发出的信息就没有了接收方。但是就像我前面说的,这毕竟是个治标不治本的方法,线程还是没有停止。其实我认为,解决这个问题的方法并没有那么“飘渺”,只是还需要对程序进一步的理解,希望明天之内可以有一个答案吧。

第三点,是需要注意的。少使用以true为条件的循环语句,尽量有一些范围小一些的限制条件。
第四点,不要给使用者犯错的机会。这就要求编写者有缜密的思路。拿我现在写的客户端为例,目前为止还是个很“脆弱”的程序,端口号输错了会报错,还有现成停止问题没有根本解决,虽然我的解决方法给使用者造成程序正确运行的假象,但假象肯定有隐患。这些问题都需要一步步完善。

第五点需要注意的是,在写不管是客户端还是服务端又或者其他程序时,首先要有个大致的思路,切忌走一步看一步。有了一个大体的思路后,写程序就有方向了,可以少做无用功,要写什么方法,什么属性,需要什么变量,都会很快能反应上来。在有了大致的思路后,要吧整个思路分为一步步,落实到一个个类和方法,慢慢养成模块化编程习惯。有什么好处呢?不言而喻,清晰啊!哪个地方有异常改哪里就好了,需要补充就也可以顺着思路写。这是很好的习惯。

今天做界面,还只是做了一半,只有服务端的,明天会做客户端的。这就要求我思维更缜密,毕竟要考虑两者了。明天也会下一些功夫把线程的问题解决好。以前写程序都是有专门的点,线程是线,io是io,这次是兼顾两者,对我这个“菜鸟”来说也是个挑战,不过这都是能克服的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值