大吉大利,晚饭吃鸡!——accept关闭问题

  假期收尾了,学芽子们都军训了。一群张一山和周冬雨在校内晃晃悠悠,说起来春风十里也就军训比较有意思。对于我这种一年追一部剧的人,显然是有点对不住。在我假期任务即将圆满之际,我开始放慢脚步寻找生活的美妙时刻,因为我还是渴望休息的,开学又要有开学的事情做,午休一会都要耍上几把《绝地求生大逃杀》!因为我还没有吃到鸡!·搞计算机的不玩游戏你说你搞不搞笑。咦,其实我也有几个月没玩了哈哈。

  这个胜者吃鸡源于电影《决胜21点》中男主角在赌场常说的一句。“大吉大利,今晚吃鸡!”,而他还有一句话“我的人生观,昨天是历史,明天是个迷”我也很喜欢。

 

  今天我发现我的学籍异动系统表设计的不太好,为了图方便把通知书表和申请书表给捏到一起了。出了一些麻烦,在软件架构方面我还是着急了,没有好好的全方面的了解这个系统就下手实现,犯了轻敌的错误。

可能最近我比较渴望休息,在技术方面比较浮躁,追求速度了些。反思。

  总结一下前阶段做的传感器接收程序吧。java的,socket和线程结合,http加密发送请求,流的读写和16进制字节码以及log4j等。

  我的程序角色是服务端server,传感器是客户端(每个传感器有各自端口,发送同一个端口的server)。程序启动传感器会根据ip端口连进来,我会定期像它发送16进制指令,把多参数数据读回来取平均值,检查数据是否异常,最后加密发给php网站。

  我们都知道socket的accept是阻塞的方法。如果我去控制server的开关,会有一个大麻烦,就是端口占用问题。java.net.BindException: Address already in use: JVM_Bind,一定要关闭好socketServer和socket。

 1 public static void socketServerInit(Main main){
 2         Configuration configuration = null;
 3         try {
 4             LOG.info(">>>> 服务器已启动  <<<<");
 5             ss = new ServerSocket();
 6             ss.setReuseAddress(true);
 7             ss.bind(new InetSocketAddress(Main.IpField.getText(),Integer.valueOf(Main.portField.getText())));  
 8             LOG.info(">>>> 配置成功,等待连接");
 9             while (true) // 服务器端一直监听这个端口,等待客户端的连接
10             {
11                 configuration=readConfig(configuration,main);
12                 sk = ss.accept(); // 当有客户端连接时,产生阻塞
13                 LOG.info(">>>>  获取一个连接");
14                 saveConfigToLocal(configuration);
15                 printBhOnView(main,sk,configuration);
16                 LOG.info(">>>>>> 数据接收程序启动 <<<<<<");
17                 SocketServerRun socketServerRun = new SocketServerRun();
18                 socketServerRun.setConfiguration(configuration);
19                 socketServerRun.setServer(ss);
20                 socketServerRun.setSocket(sk);
21                 Thread thread = new Thread(socketServerRun);
22                 thread.start();
23 //                new SocketThread(sk, configuration).start();// 新建一个socketThread处理这个客户端的socket连接
24             }
25         } catch (IOException ex) {
26             ex.printStackTrace();
27         } finally {
28 //            try {
29 //                if (sk != null) {
30 //                    sk.close();
31 //                }
32 //                if (ss != null) {
33 //                    ss.close();
34 //                }
35 //            } catch (Exception ex) {
36 //                ex.printStackTrace();
37 //                LOG.error(ex.getMessage());
38 //            }
39         }
40     }

  但还有麻烦,我当我连接了一个传感器后开启线程去读数据了,sk = ss.accept()这个代码会再次被执行到,去等下一个传感器。这时候关闭socket的话会报错java.net.SocketException: socket closed。总之很头疼。

 在我的系统可以把它catch掉,然后不管他。但是这么做是不推荐的,等我想到解决办法再更新吧,今天先写到这接下来用到的技术我会挨篇写出。以供参考。

附一张图下章继续讲。

 

 

  我没有每天玩喔,下了班之后还是要看王小波的书的。程序虽然很迷人,但我还有我的生活,它是我的一部分。

今天的情诗,就来一首徐志摩的《偶然》吧。来和我大声念(带感情),预备,起。

  我是天空的一片云,

  偶尔投影在你的心波——

  你不必惊讶,

  更无需欢喜——

  在转瞬间消灭了踪影。

 

  你我相逢在黑夜的海上,

  你有你的,我有我的,方向;

  你记得也好,

  最好你忘掉,

  在这交会时互放的光亮!

 

posted @ 2017-08-29 16:07  ZzUuOo666  阅读(824)  评论(0编辑  收藏  举报