![](/img/trans.png)
[英]Android - java connected via socket programming. dataoutputstream write does not fail on the java side after the device is disconnected from network
[英]java socket disconnected from server side
我在服務器端遇到有關套接字的問題。 我的代碼是客戶端。 每當我發送第二條消息(無論是心跳或其他任何消息)時,它將在服務器上失敗,並且服務器端記錄“消息格式錯誤”,但同一條消息將首次成功。 這個你能幫我嗎。 我的客戶代碼:
public class Main {
String Host = "";
int port = 1111;
Socket ss;
BufferedReader in;
BufferedWriter out;
String recv;
public void connection() {
try {
ss = new Socket(Host, port);
ss.setSoTimeout(30000);
in = new BufferedReader(new InputStreamReader(ss.getInputStream()));
out = new BufferedWriter(new OutputStreamWriter(ss.getOutputStream()));
} catch (UnknownHostException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void sender(String regTag) {
if (ss == null || !ss.isConnected()) {
connection();
}
try {
if (out != null && regTag != null) {
out.write(regTag + "\n");
System.out.println("message::" + regTag);
out.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public String Reciver() {
try {
recv = in.readLine();
if (ss != null && recv != null) {
return recv;
} else {
disconnect();
String Str = "nothing...Sorry";
return Str;
}
} catch (Exception e) {
e.printStackTrace();
return "Exception";
}
}
public void disconnect() {
try {
System.out.println("socket discoonected.");
ss.close();
in.close();
out.close();
connection();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Main me = new Main();
me.connection();
String hbhb = "`SC`0004HBHBB7BDB7BD";
String login = "`SC`00581.000000CRBTSRVM 00000001DLGLGN 00000002 TXBEG LOGIN:USER=cvbs,PSWD=password DEB2CCA8";
String cut = "`SC`00631.000000CRBT00PPSPHS00000002DLGCON 00000003 TXBEG CUT PPS FEE:MDN=9610023,CUTFEE=1000,REASON=1 BDB7DA88";
me.sender(hbhb.trim());
String str = me.Reciver();
System.out.println("Response :::" + str);
me.sender(login.trim());
String str1 = me.Reciver();
System.out.println("Response hb:::" + str1);
}
它總是在每隔第二條消息上收到null
來自服務器端的日志
[121_SERVER] 2012-05-03 14:26:37:213 [ERROR] [ServerAccptor.java:254] ->
errorCode = [UIP-80015] errorDesc = [Uip server has a exception when receiving data from the client,will remove the client,Server [adapter id=121],.]
at com.ztesoft.zsmart.bss.uip.adapter.socket.server.ServerAccptor.listenMsg(ServerAccptor.java:252)
at com.ztesoft.zsmart.bss.uip.adapter.socket.server.ServerAccptor.run(ServerAccptor.java:117)
Caused by: errorCode = [UIP-9102] errorDesc = [] Describing= [read client message error,will remove client.]
at com.ztesoft.zsmart.bss.uip.adapters.socket.server.mml.MMLServerAdapter.readByteField(MMLServerAdapter.java:784)
at com.ztesoft.zsmart.bss.uip.adapters.socket.server.mml.MMLServerAdapter.reciveWholeMsg(MMLServerAdapter.java:671)
您的代碼體現了許多不良做法和謬論。
您正在記錄異常,否則將其忽略,並進行一些奇怪的事情,例如讓程序繼續運行,返回“ Exception”等。這是糟糕的編程。 有例外可以幫助您,不要讓創可貼將它們掩蓋起來。 該代碼在創可貼下不會自愈。 例如,您只需要聲明connection()
即可引發IOException
並讓調用者對其進行處理。
作為(1)的結果,您有許多ss != null
測試。 您甚至不應該處於需要執行I / O並且ss
可以為null
。 同樣,正確的異常處理和傳播將避免這種情況。
作為(1)的進一步結果,您有許多!ss.isConnected()
測試,顯然是錯誤地認為此API會告訴您是否斷開了連接。 不會的 它只會告訴您是否已連接Socket
。 在您的代碼中,當您調用ss = new Socket(...)
,您已經連接了它,否則您尚未執行該代碼。 調用isConnected()
不會增加任何值。
您要在輸出流之前關閉套接字輸入流。 這是不正確的。 您應該只關閉輸出流,並在finally塊中關閉套接字本身。 這樣,輸出流將被刷新。 關閉輸入流會關閉套接字,而不會刷新輸出流。 不要那樣做
實際上,正確的答案是MML
響應中沒有\\n
。 因此,這永遠行不通:
recv = in.readLine();
您必須讀取響應的消息頭部分中給出的消息長度,並讀取到該長度。
更新:
您的MML
命令中存在語法錯誤。 似乎您正在使用協議的1.00版,因此這是一個有效的示例(查找差異):
`SC`00741.00CRBT PPS 00000001DLGCON 00000004TXBEG PPS CUT FEE:mdn=93784050910,fee=300,id=20140812165011003 F3E0ADDF
您必須僅用數字0
填充多余的空格,否則必須用空格填充。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.