2017-12-20 33 views
0

문자열을 서버로 보낼 수 있으며 서버도 동일한 문자열을 받았습니다. 서버가 확인 응답을 보낼 수 있지만 서버가 연결을 종료 할 때까지 클라이언트가 확인 응답을받지 못합니다. 하지만 연결을 닫고 싶지는 않습니다. 연결을 닫지 않고 확인을 어떻게 표시해야합니까?서버 소켓을 닫지 않고 클라이언트 측에서 승인을 받으려면 어떻게해야합니까?

//This is Client  
public void Actuator1_Stop(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    try { 
     Socket socket = new Socket("localhost", 1028); 
     DataOutputStream dout = new DataOutputStream(socket.getOutputStream()); 
     dout.writeUTF("Stop_Actuator"); 
     dout.flush(); 
     System.out.println("Command Sent = Stop_Actuator"); 

     //Get the return message from server 
     InputStream is = socket.getInputStream(); 
     InputStreamReader isr = new InputStreamReader(is); 
     BufferedReader br = new BufferedReader(isr); 
     String message = br.readLine(); 
     System.out.println("ACK received from the server : " +message); 
     socket.close(); 
    } catch(Exception exception) { 
     exception.printStackTrace(); 
    } 
} 

//This is Server 
class Socket4 implements Runnable { 
    public void run() { 
     try { 
      ServerSocket ss = new ServerSocket(1028); 
      while(true) { 
       Socket s = ss.accept(); 
       DataInputStream dis = new DataInputStream(s.getInputStream()); 
       String cmd = dis.readUTF(); 
       System.out.println("Command= "+cmd); 

       //Sending the response back to the client 
       String ack = null; 
       OutputStream os = s.getOutputStream(); 
       OutputStreamWriter osw = new OutputStreamWriter(os); 
       BufferedWriter bw = new BufferedWriter(osw); 

       if(cmd.equals("Stop_Actuator")) { 
         ack= "Ok"; 
         bw.write(ack); 
        } else { 
         ack = "Error"; 
         bw.write(ack); 
        } 

        System.out.println("ACK sent to the client is "+ack); 
        bw.flush(); 
      } 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

public class MyServer { 
    public static void main(String[] args) { 
     Socket1 s1 = new Socket1(); 
     Socket2 s2 = new Socket2(); 
     Socket3 s3 = new Socket3(); 
     Socket4 s4 = new Socket4(); 

     Thread t1 = new Thread(s1); 
     Thread t2 = new Thread(s2); 
     Thread t3 = new Thread(s3); 
     Thread t4 = new Thread(s4); 

     t1.start(); 
     t2.start(); 
     t3.start(); 
     t4.start(); 
     } 
    } 
} 
+1

'ack = "Ok";' - 그 라인은 readline()이 반환 할 텍스트 라인을 보입니까? –

+0

감사합니다. 그것은 효과가 있었다. 이제 나는 클라이언트 측에서 문제를 일으키고 있습니다. –

+0

왜 한 방향으로 선을 보내고 다른 방향으로'writeUTF()'를 사용하고 있습니까? 일관성있게하십시오. – EJP

답변

0

어떻게 연결을 닫지 않고 승인을 표시해야합니까? 클라이언트에서

당신은 읽기 라인을하고있다 :

String message = br.readLine(); 

그러나 서버에서 사용자가 전체 라인을 전송하지 않습니다. 메시지 끝 부분에 줄 종료 문자를 추가해야합니다.

ack = "Ok\n"; 
bw.write(ack); 

read-line이 완료되고 클라이언트가 ack를 얻습니다. 분명히 오류 확인에는 개행 ("Error\n")이 필요합니다.

Socket4.run()에서 생성 된 허용 소켓과 서버 소켓을 제대로 닫아야합니다. 나는 당신이 코드의 일부분을 게시하고 있다고 가정하지만 try/finally 블록에서 그 소켓을 닫아야한다.

+0

감사합니다. 그것은 효과가 있었다. 이제 나는 클라이언트 측에서 문제를 일으키고 있습니다. –