我正面临着一个关于服务器端套接字的问题。我的代码是客户端。每当我发送第二条消息(无论是心跳或任何其他消息)时,它在服务器上都会失败,服务器端会记录一个“消息格式错误”,但同样的消息会在第一次成功。请帮我解决这个问题。我的客户端代码:
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)
发布于 2012-05-07 10:08:48
您的代码包含了许多糟糕的实践和谬误。
connection()
抛出IOException
,并让调用者处理它。ss != null
测试的结果。您甚至不应该处于需要执行I/O并且ss
可以为null
的状态。同样,正确的异常处理和传播可以避免这种情况。!ss.isConnected()
测试,显然是因为错误地认为此API会告诉您连接是否已断开。它不会。它只会告诉你你是否已经连接了Socket
。在您的代码中,当您调用ss = new Socket(...)
时,您已经连接了它,或者您还没有执行该代码。调用isConnected()
不会增加任何值。发布于 2014-08-17 07:50:46
实际上,正确的答案是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
填充额外的空格,在其他地方你必须用空格填充它们。
https://stackoverflow.com/questions/10479779
复制相似问题