作者ixxogux (坚持阿伏哥连盟 )
看板java
标题[J2ME] Socket,重复送资料会得到错误
时间Thu Nov 13 13:00:12 2008
目前利用J2ME撰写Socket的client端部分(另外一端Socket server 也是由Java撰写而成
,但不为我负责的范围。且假设server端的程式一定没有问题)
作法跟一般的socket 连线相同:
1. sc = (SocketConnection) Connector.open(URL); //URL不能公开sorry
sc.setSocketOption(SocketConnection.DELAY, 0);
sc.setSocketOption(SocketConnection.KEEPALIVE, 0);
//参考自
http://developers.sun.com/mobility/midp/articles/midp2network/
2. is = sc.openInputStream();
os = sc.openOutputStream();
3. 在Midlet内实做Thread。在Thread内跑一个回圈,负责送资料):
for(int i = 0 ;i < 10 ;i++){
sc.SendMessages("DataSentStart 0915885181 1\n");
form.append("传送出去了\n");
form.append(sc.ReceiveMessages());
sc.SendMessages("Test\n");
sc.SendMessages("DataSentStop");
sc.SendMessages(" ");
sc.SendMessages("1");
sc.SendMessages("\r\n");
//"DataSentStop 1 \r\n"在该伺服器是指此笔资料结尾之意
}
4. SendMessages() 与 ReceiveMessages()如下:
public String ReceiveMessages() {
int ch = 100;
StringBuffer catcher = new StringBuffer();
while (ch!=-1 && (ch != '\n')){
try {
ch=is.read();
catcher.append((char) ch);
} catch (IOException e) {
e.printStackTrace();
}
}
return catcher.toString();
}
public void SendMessages(String message){
try{
os.write(message.getBytes());
os.flush();
} catch (IOException e){
e.printStackTrace();
}
}
(其余Command, Form, StartApp() ...etc 等就不贴出来了喔)
问题来了:
当回圈跑第一次时,该伺服器会正确回传一个值:"200 OK"
但是跑第二次时,在我的Form显示画面上,会出现"0"
然後程式就死了。
在假设server端socket没有问题的情况下。想要请问,我这个程式
有没有啥观念上的问题,而我却无法察觉的呢> <"
错误讯息是
java.io.IOException: error 10053 during TCP read
at com.sun.midp.io.j2me.socket.Protocol.nonBufferedRead(+7)
at com.sun.midp.io.BufferedConnectionAdapter.readBytes(+39)
at com.sun.midp.io.BaseInputStream.read(+39)
at com.sun.midp.io.BaseInputStream.read(+10)
at tw.edu.ntu.www.me.pscl.io.socket.Socket.ReceiveMessages(+21)
at tw.edu.ntu.www.me.pscl.io.socket.temperSocket.run(+66)
自己的解决方案:
为了让我的资料每一笔都能送出去。我异想天开的做了一个决定:每一笔资料
要送之前才开启Socket连线,传完之後就关闭连线。
用这种"开启连线-->传送-->结束连线"的方式。居然十笔资料都传送成功了 !!
不过我认为这不是正常的解决方案......
因此在这边想要请问各位前辈们,是否可以给我些建议呢?
谢谢各位
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.14.82