论坛首页 Java企业应用论坛

javaSocket与C通信

浏览 10854 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (6) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-12-16  
for_cyan 写道
如果网络断开或者程序出现异常该如何重连呢?

这个问题不知道改如何解决
0 请登录后投票
   发表时间:2009-12-16  
ysen 写道
for_cyan 写道
如果网络断开或者程序出现异常该如何重连呢?

这个问题不知道改如何解决

   写一个重连方法,放到异常里,如果断开了,就会抛异常,调用重连方法,判断标志位,如果一直未连接上,每间隔几秒发一次连接请求,如果连接上后,修改标志位,并跳到业务代码,走业务。

    这是基本的方法
1 请登录后投票
   发表时间: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;
}
1 请登录后投票
   发表时间: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,你能确定回的消息就是本次处理的结果。
补充下:如果你使用长连接,想要每条信息都得到自己对应的结果,你必须用阻塞。处理效果,可想而知。

问下楼主,请问短连接非阻塞,为的是什么,非阻塞和多线程的区别在于,多线程,每个线程独立,发的信息回得到其对应结果。
貌似楼主应该用短连接阻塞。你的业务才能清晰,聊天程序非阻塞还有点道理,毕竟我这次回的消息,不一定就是你上个问题。
0 请登录后投票
   发表时间:2009-12-16  
tjgamejx2 写道
楼主,如果是长连接的话,每次调用一次doGet()或者doPost()向C德socket发送一个报文,然后C处理后回一个消息,当并发高的时候,不需要很高,发送A,C回A,发送B,C回B。如果并发了,JAVA发条A,紧接着发了条B,C接着回了条消息,楼主,C回的这个消息,您能确定这条消息是A的结果还是B的结果吗。
短连接的话,每条消息都对应一个socket,你能确定回的消息就是本次处理的结果。

发送的报文有流水号啊,根据流水号判断,在转发个客户端,这样的话可能要用到
缓存和服务器推技术,不知道我说的对不对
0 请登录后投票
   发表时间: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回应的消息。但是效率明显很烂。

你的需求应该是要用到短连接阻塞
0 请登录后投票
   发表时间: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回应的消息。但是效率明显很烂。

你的需求应该是要用到短连接阻塞

一开始就是 短连接堵塞, 效果也不错
后来改成上面的样子 短连接非堵塞,有的时候发过去接不到返回的信息,很明显不行
0 请登录后投票
   发表时间:2009-12-16  
linliangyi2007 写道
楼主类名不规范的说

支持

JAVA与C通讯得考虑大端小端问题吧
0 请登录后投票
   发表时间: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 有一边 转换下就好了
0 请登录后投票
   发表时间:2009-12-18  
楼主不是很喜欢发设计模式的帖子么
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics