我有以下情况,
- TCP服务器将接受来自客户端的连接
- 客户端将发送第一个请求,服务器将响应该请求,并且服务器必须在同一套接字上等待以接收来自同一客户端的下一个请求
- 请参阅我所做的代码,使用此代码,服务器无法接收服务器发送的第二个请求,并且客户端也无法在第二次接收中接收来自服务器的第一个响应。
- 请就此提出建议,代码中有什么问题。
- 我尝试模拟这个案例,如果有人以前遇到过,请尽快提出建议。
Client_MultipleMessages.java:
public class Client_MultipleMessages {
public static void main(String[] args) {
Socket clientSocket = null;
SocketAddress sockaddr = null;
boolean IsSocketCreated = false;
String p_Response = "";
OutputStream outToServer = null;
InputStream in = null;
String strRequestString = "";
try{
clientSocket = new Socket();
sockaddr = new InetSocketAddress("192.168.121.121", 1234);
try{
clientSocket.connect(sockaddr, 1000);
if (clientSocket.isConnected()){
IsSocketCreated = true;
}
}catch(Exception e){
System.out.println("Exception while creating socket,Reason is:"+ e.getMessage());
}
int index = 1;
String req = "REGISTRATION_REQUEST";
while(index <= 2){
if(clientSocket.isConnected()){
outToServer = clientSocket.getOutputStream();
System.out.println("Request "+index+":"+req);
outToServer.write(req.getBytes());
outToServer.flush();
//clientSocket.setSoTimeout(1000);
in = clientSocket.getInputStream();
int i = -1;
while((i = in.read()) > 0){
p_Response += (char) i;
}
System.out.println("Response "+index+":"+p_Response);
}
index++;
req = "LERGD_ALLOCATE_MSISDN";
}
}catch(Exception ex){
ex.printStackTrace();
}
}
}
Server_MultipleMessages.java
public class Server_MultipleMessages {
public static void main(String[] args) {
try{
ServerSocket Server = new ServerSocket (1234);
while(true){
Socket socket = Server.accept();
String fromclient = "";
BufferedReader inFromClient = null;
PrintWriter outToClient = null;
String strresponse = "";
try{
int reqCount = 1;
socket.setSoTimeout(2000);
while(reqCount <= 2){
System.out.println("Request-"+reqCount);
inFromClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
outToClient = new PrintWriter(socket.getOutputStream(),true);
char data[] = new char[1200];
inFromClient.read(data);
for (int i = 0; i < data.length; i++) {
fromclient = fromclient + Character.toString(data[i]);
}
System.out.println("XML Request is from client: "+fromclient+"\n\n");
String returnDesc = "success";
if(fromclient.contains("REGISTRATION_REQUEST")){
System.out.println("Request if for Registeration !!");
strresponse = "<REGISTRATION_RESPONSE><HEADER><ERROR_CODE>" + 0 + "</ERROR_CODE> <ERROR_DESC>" + returnDesc + "</ERROR_DESC></HEADER><BODY>,DIAMETER-S6A,TCAP,</BODY></REGISTRATION_RESPONSE>";
}else if(fromclient.contains("LERGD_ALLOCATE_MSISDN")){
System.out.println("Request is for allocate Msisdnm !!");
strresponse = "<RESPONSE><HEADER><TRANSACTION_ID>123456</TRANSACTION_ID><REQUEST_TYPE>LERGD_ALLOCATE_MSISDN</REQUEST_TYPE><ERROR_CODE>" + 0 + "</ERROR_CODE><ERROR_DESC>" + returnDesc + "</ERROR_DESC></HEADER><BODY><ACTION_TAKEN>B</ACTION_TAKEN><ALLOCATED_MSISDN>7525600000</ALLOCATED_MSISDN></BODY></RESPONSE>";
}else{
System.out.println("Invalid Request from client !!");
}
System.out.println("XML Response to be send to client: "+strresponse+"\n\n");
outToClient.print(strresponse);
outToClient.flush();
strresponse = "";
fromclient = "";
reqCount++;
}
}catch(Exception ex){
ex.printStackTrace();
}finally{
if(!socket.isClosed()){
socket.close();
}
}
}
}catch(Exception ex){
System.out.println("Error in ProcessXmlRequest : "+ex.getMessage());
}
}}
服务器端输出:
Request-1
XML Request is from client: REGISTRATION_REQUEST
Request if for Registeration !!
XML Response to be send to client: <REGISTRATION_RESPONSE><HEADER><ERROR_CODE>0</ERROR_CODE><ERROR_DESC>success</ERROR_DESC></HEADER><BODY>,DIAMETER-S6A,TCAP,</BODY></REGISTRATION_RESPONSE>
Request-2
java.net.SocketTimeoutException: Read timed out
客户端输出:
Request 1:REGISTRATION_REQUEST
Response 1:<REGISTRATION_RESPONSE><HEADER><ERROR_CODE>0</ERROR_CODE><ERROR_DESC>success</ERROR_DESC></HEADER><BODY>,DIAMETER-S6A,TCAP,</BODY></REGISTRATION_RESPONSE>
Request 2:LERGD_ALLOCATE_MSISDN
Response 2:<REGISTRATION_RESPONSE><HEADER><ERROR_CODE>0</ERROR_CODE><ERROR_DESC>success</ERROR_DESC></HEADER><BODY>,DIAMETER-S6A,TCAP,</BODY></REGISTRATION_RESPONSE>