锁定老帖子 主题:javaSocket与C通信
精华帖 (0) :: 良好帖 (0) :: 新手帖 (6) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-12-16
for_cyan 写道 如果网络断开或者程序出现异常该如何重连呢?
这个问题不知道改如何解决 |
|
返回顶楼 | |
发表时间:2009-12-16
ysen 写道 for_cyan 写道 如果网络断开或者程序出现异常该如何重连呢?
这个问题不知道改如何解决 写一个重连方法,放到异常里,如果断开了,就会抛异常,调用重连方法,判断标志位,如果一直未连接上,每间隔几秒发一次连接请求,如果连接上后,修改标志位,并跳到业务代码,走业务。 这是基本的方法 |
|
返回顶楼 | |
发表时间:2009-12-16
最后修改:2009-12-16
我最近刚好做了个javaSocket与C通信的组件
//连接成功flag boolean connSuccess = false; while (!connSuccess) { try { socket = new Socket(ip,port); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { //连接失败,3秒后重新连接 System.out.println("(IP="+ip+","+"PORT="+port+")连接失败,3秒后重连"); try { Thread.sleep(3000); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } continue; } connSuccess = true; } |
|
返回顶楼 | |
发表时间:2009-12-16
最后修改:2009-12-16
楼主,如果是长连接的话,每次调用一次doGet()或者doPost()向C德socket发送一个报文,然后C处理后回一个消息,当并发高的时候,不需要很高,发送A,C回A,发送B,C回B。如果并发了,JAVA发条A,紧接着发了条B,C接着回了条消息,楼主,C回的这个消息,您能确定这条消息是A的结果还是B的结果吗。
短连接的话,每条消息都对应一个socket,你能确定回的消息就是本次处理的结果。 补充下:如果你使用长连接,想要每条信息都得到自己对应的结果,你必须用阻塞。处理效果,可想而知。 问下楼主,请问短连接非阻塞,为的是什么,非阻塞和多线程的区别在于,多线程,每个线程独立,发的信息回得到其对应结果。 貌似楼主应该用短连接阻塞。你的业务才能清晰,聊天程序非阻塞还有点道理,毕竟我这次回的消息,不一定就是你上个问题。 |
|
返回顶楼 | |
发表时间:2009-12-16
tjgamejx2 写道 楼主,如果是长连接的话,每次调用一次doGet()或者doPost()向C德socket发送一个报文,然后C处理后回一个消息,当并发高的时候,不需要很高,发送A,C回A,发送B,C回B。如果并发了,JAVA发条A,紧接着发了条B,C接着回了条消息,楼主,C回的这个消息,您能确定这条消息是A的结果还是B的结果吗。
短连接的话,每条消息都对应一个socket,你能确定回的消息就是本次处理的结果。 发送的报文有流水号啊,根据流水号判断,在转发个客户端,这样的话可能要用到 缓存和服务器推技术,不知道我说的对不对 |
|
返回顶楼 | |
发表时间:2009-12-16
最后修改:2009-12-16
ysen 写道 tjgamejx2 写道 楼主,如果是长连接的话,每次调用一次doGet()或者doPost()向C德socket发送一个报文,然后C处理后回一个消息,当并发高的时候,不需要很高,发送A,C回A,发送B,C回B。如果并发了,JAVA发条A,紧接着发了条B,C接着回了条消息,楼主,C回的这个消息,您能确定这条消息是A的结果还是B的结果吗。
短连接的话,每条消息都对应一个socket,你能确定回的消息就是本次处理的结果。 发送的报文有流水号啊,根据流水号判断,在转发个客户端,这样的话可能要用到 缓存和服务器推技术,不知道我说的对不对 不管什么标志都是没有用的,你在一个doPost方法里发送了一条消息,你就必须在这个方法里得到回应的消息。比如你发的是00001流水号订单,接到的结果是00002,你怎么办,另外一个方法里发的00002,却得到了00001,它咋办。 我说一个方法吧,楼主socket得到的消息全部存在全局变量里,这样每个方法才能共享资源。你发的00001,你就一直查全局变量里是否有00001回应的消息。但是效率明显很烂。 你的需求应该是要用到短连接阻塞 |
|
返回顶楼 | |
发表时间:2009-12-16
tjgamejx2 写道 ysen 写道 tjgamejx2 写道 楼主,如果是长连接的话,每次调用一次doGet()或者doPost()向C德socket发送一个报文,然后C处理后回一个消息,当并发高的时候,不需要很高,发送A,C回A,发送B,C回B。如果并发了,JAVA发条A,紧接着发了条B,C接着回了条消息,楼主,C回的这个消息,您能确定这条消息是A的结果还是B的结果吗。
短连接的话,每条消息都对应一个socket,你能确定回的消息就是本次处理的结果。 发送的报文有流水号啊,根据流水号判断,在转发个客户端,这样的话可能要用到 缓存和服务器推技术,不知道我说的对不对 不管什么标志都是没有用的,你在一个doPost方法里发送了一条消息,你就必须在这个方法里得到回应的消息。比如你发的是00001流水号订单,接到的结果是00002,你怎么办,另外一个方法里发的00002,却得到了00001,它咋办。 我说一个方法吧,楼主socket得到的消息全部存在全局变量里,这样每个方法才能共享资源。你发的00001,你就一直查全局变量里是否有00001回应的消息。但是效率明显很烂。 你的需求应该是要用到短连接阻塞 一开始就是 短连接堵塞, 效果也不错 后来改成上面的样子 短连接非堵塞,有的时候发过去接不到返回的信息,很明显不行 |
|
返回顶楼 | |
发表时间:2009-12-16
linliangyi2007 写道 楼主类名不规范的说
支持 JAVA与C通讯得考虑大端小端问题吧 |
|
返回顶楼 | |
发表时间:2009-12-16
pwz1985 写道 我最近刚好做了个javaSocket与C通信的组件
//连接成功flag boolean connSuccess = false; while (!connSuccess) { try { socket = new Socket(ip,port); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { //连接失败,3秒后重新连接 System.out.println("(IP="+ip+","+"PORT="+port+")连接失败,3秒后重连"); try { Thread.sleep(3000); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } continue; } connSuccess = true; } 这个问题 java 或 c 有一边 转换下就好了 |
|
返回顶楼 | |
发表时间:2009-12-18
楼主不是很喜欢发设计模式的帖子么
|
|
返回顶楼 | |