簡體   English   中英

Java TCP在同一套接字的客戶端和服務器端之間發送和接收多個消息

[英]Java TCP send and receive multiple messages between client & server side on same socket

我有以下情況,

  1. TCP服務器將接受客戶端的連接
  2. 客戶端將發送第一個請求,服務器將響應該請求,並且服務器必須在同一套接字上等待以接收來自同一客戶端的下一個請求
  3. 請參閱我所做的代碼,使用此代碼服務器將無法接收服務器發送的第二個請求,而客戶端在2nd接收中還會收到來自服務器的第一個響應。
  4. 請對此提出建議,代碼有什么問題。
  5. 我嘗試模擬這種情況,如果以前有人遇到過,請盡快對此提出建議。

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>

您的客戶端正在讀取響應,直到流結束為止,這僅在對等方關閉套接字時發生,這使得不可能進行多次交換。 您需要設計另一種分隔消息的方法。 在這種情況下,僅發送和接收線就足夠了。

在服務器上,將PrintWriter設置為autoFlush(第二個參數)

outToClient = new PrintWriter(socket.getOutputStream(),true);

並在寫入后調用flush()。

outToClient.print(strresponse); //autoFlush here
outToClient.flush();

然后當客戶正在閱讀

while((i = in.read()) > 0)

它可能正在讀取第二次刷新。 在這種情況下,它沒有任何內容可讀取,退出循環並打印先前的響應。 打印后嘗試清除客戶端上的響應,然后檢查是否是問題所在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM