Java를 사용하는 클라이언트 서버의 프로토콜 버퍼에 대한 도움이 필요합니다.

Jawad

Google 프로토콜 버퍼를 처음 사용합니다. 클라이언트가 서버에 요청 개체를 보내고 서버가 응답을 반환하는 클라이언트 서버 응용 프로그램을 작성 중입니다. 현재 서버에 개체를 보낼 때 서버가 응답하지 않거나 예외를 throw하지 않습니다. 아마도 그것은 온라인에서 멈췄을 것입니다.

요청 요청 = Request.parseFrom (bytes);

여기서 요청과 응답은 프로토콜 버퍼에 의해 생성 된 메시지 클래스입니다.

내 코드 샘플은 다음과 같습니다.

public class TCPServer {

   final static Logger logger = Logger.getLogger(TCPServer.class.getName());
   static int PORT = 6789;

public static void main(String argv[]) throws Exception
   {

      ServerSocket socket = new ServerSocket(PORT);
      Socket connectionSocket = null;
      while(true)
        {
           try{ 
                connectionSocket = socket.accept();
           }catch (IOException e) {
                System.out.println("Could not listen on port:" + PORT);
                System.exit(-1);
        }

           Thread thread = new Thread(new ServerConnection(connectionSocket));
           thread.start();

       }
  } 

}


public class ServerConnection implements Runnable{

   static final Logger logger =  Logger.getLogger(ServerConnection.class.getName());
   String clientInput;
   String serverOutput = null;

  Socket connectionSocket = null;

   ServerConnection(Socket connectionSocket){
    this.connectionSocket = connectionSocket;   
  }

  public void run() {


    try {
       InputStream input = connectionSocket.getInputStream();


        ObjectInputStream inFromClient =  new ObjectInputStream(input);

       ObjectOutputStream outToClient = new     ObjectOutputStream(connectionSocket.getOutputStream());


       serveRequest(inFromClient , outToClient);



        outToClient.flush(); 

     } catch (IOException ex) {
            logger.log(Level.SEVERE, null, ex);
            System.out.println("Exception occured in ServerConnection run() method");
        }
    }


public void serveRequest(InputStream inFromClient, OutputStream outToClient){


    try {
        System.out.println("Recieving data from client");
        ResponseReciever response = new ResponseReciever();

        ObjectInputStream input = (ObjectInputStream) inFromClient;

        byte size = input.readByte();
        byte []bytes = new byte[size];
        input.readFully(bytes);


        Request request = Request.parseFrom(bytes);


         System.out.println("Request recieved");
            response.createResponse(request.getId(),request.getMessage(),true).writeTo(outToClient);
        System.out.println("Response send");
    } catch (Exception ex) {
        logger.log(Level.SEVERE, null, ex);
        System.out.println("Exception occured in ServerConnection serverRequest() method");
    }

}

제 의뢰인은 이렇게 생겼어요

public class TCPClient {

  final static Logger logger = Logger.getLogger(TCPClient.class.getName());

 private static int PORT = 6789;
 private static String HOST_NAME = "localhost";
 private static boolean isOpen = true;




 private Socket openConnection(final String hostName,final int port){

    Socket clientSocket = null;
    try {
        clientSocket = new Socket(HOST_NAME, PORT);


    } catch (IOException e) {
        logger.log(Level.SEVERE, "Exception occured while connecting to server", e);
    }
    return clientSocket;
 }

 private void closeConnection(Socket clientSocket){
    try {
        logger.log(Level.INFO, "Closing the connection");
        clientSocket.close();
        isOpen = false;
    } catch (IOException e) {
        logger.log(Level.SEVERE, "Exception occured while closing the connection", e);
    }
}

  public void sendToServer(OutputStream output){
     try {
         System.out.println("Sending data to server");
         RequestSender requestSender = new RequestSender();
         Request request = requestSender.getRequest(1,"param1","param2",23L,"Its message",true);

        ObjectOutputStream outputStream = (ObjectOutputStream)output;

        request.writeTo(outputStream);


    } catch (IOException ex) {
        logger.log(Level.SEVERE, null, ex);
    }

}

  public void recieveFromServer(InputStream input){
     try {
       System.out.println("Recieving data from server");
        Response response = Response.parseFrom(input);

        System.out.println(response.getId());
        System.out.println(response.getResponse());
        System.out.println(response.getError());

    } catch (IOException ex) {
        logger.log(Level.SEVERE, null, ex);
  }

}


 public static void main(String argv[]) throws Exception

 {


   ObjectOutputStream outToServer = null;

   InputStream inFromServer = null;

   TCPClient  client = new TCPClient();
   try {
    while(isOpen)
       {


        Socket clientSocket = client.openConnection(HOST_NAME, PORT);

        outToServer = new ObjectOutputStream(clientSocket.getOutputStream());

        inFromServer = new ObjectInputStream(clientSocket.getInputStream());


         client.sendToServer(outToServer);
         client.recieveFromServer(inFromServer);

        }
     }catch (Exception e) {
         logger.log(Level.SEVERE, "Exception occured ", e);
         System.out.println("Exception occured in TCPClient main() method");
         System.exit(1);
       }


     }
  }

코드에서 무엇이 잘못되었는지 찾을 수 없습니다. 빠진 것이 있으면 알려주세요.

Jawad

writeTo (outputStream) 및 parseFrom (inputStream) 대신 writeDelimtedTo (outputStream) 및 parseDelimitedFrom (inputStream)을 사용하여 작동합니다. 따라서 서버 및 클라이언트 측에 다음 코드를 입력하면 프로그램이 작동합니다.

서버 측:

        InputStream input = connectionSocket.getInputStream();
        OutputStream output = connectionSocket.getOutputStream();

        Request request = null;

        while ((request = Request.parseDelimitedFrom(input)) != null) {
            System.out.println(request.toString());

        }

고객 입장에서:

        Socket clientSocket = client.openConnection(HOST_NAME, PORT);

        Request request = getRequest();

        OutputStream output = clientSocket.getOutputStream();
         InputStream input = clientSocket.getInputStream();

         request.writeDelimitedTo(output);

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Java를 사용하는 클라이언트 서버의 프로토콜 버퍼에 대한 도움이 필요합니다.

분류에서Dev

ajax를 사용하는 Codeigniter의 웹 앱에서 좋아요 버튼에 대한 도움이 필요합니다.

분류에서Dev

2 개의 NIC가있는 서버를 통한 라우팅에 대해 (다시) 도움이 필요합니다.

분류에서Dev

행성의 무게를 계산하려면 Java 프로그램에 대한 도움이 필요합니다.

분류에서Dev

웹 사이트를위한 새로운 텔레 그램 "버튼"이 있습니다-blogspot에서 사용하려면 도움이 필요합니다

분류에서Dev

서버 측 대 클라이언트 측 프로토콜 스 니프

분류에서Dev

(c ++) 내 클래스 Polynomial에 대해 operator +를 오버로딩하는 데 도움이 필요합니다.

분류에서Dev

오류 : ER_SUPPORTED_AUTH_MODE : 클라이언트가 서버에서 요청한 인증 프로토콜을 지원하지 않습니다. MySQL 클라이언트 업그레이드를 고려하십시오.

분류에서Dev

도커 이동 경로 MySQL을 8 : 클라이언트 서버에 의해 요청 된 인증 프로토콜을 지원하지 않습니다. 업그레이드 MariaDB 클라이언트를 고려

분류에서Dev

한 서버에서 다른 서버로 파일을 이동하는 bash 스크립트를 작성하는 데 도움이 필요합니다.

분류에서Dev

한 서버에서 다른 서버로 파일을 이동하는 bash 스크립트를 작성하는 데 도움이 필요합니다.

분류에서Dev

프로토콜 버퍼를 사용하여 필드 설명 자로 상위 메시지에서 필드 이름을 검색합니다.

분류에서Dev

실행중인 Java 버전에 대한 경로 만 표시하려면 grep에 대한 정규식을 작성하는 데 도움이 필요합니다.

분류에서Dev

다음 중 동일한 클라이언트와 서버간에 여러 TCP 연결을 사용할 수있는 프로토콜은 무엇입니까?

분류에서Dev

Excel의 한 열에서 다른 열로 정보를 이동하는 데 도움이 필요합니다.

분류에서Dev

Windows 클라이언트 및 우분투 서버를위한 최고의 원격 데스크톱 프로토콜

분류에서Dev

C 프로그램에서 버그 (char ** 복사와 관련된)를 찾는 데 도움이 필요합니다.

분류에서Dev

Ruby의 선언 방법에 대한 문서를 찾는 데 도움이 필요합니다.

분류에서Dev

Android 앱은 JAVA 로컬 호스트 서버에 연결하는 데 도움이 필요합니다.

분류에서Dev

그리드 정렬을 사용하여 한 페이지에 두 개의 그래프를 레이아웃하는 데 도움이 필요합니다.

분류에서Dev

Google 프로토콜 버퍼를 사용하는 Python 애플리케이션을 사용할 수 없습니다.

분류에서Dev

간단한 콘솔 미로 게임 : 버그를 파악하는 데 도움이 필요합니다.

분류에서Dev

Gmail API : 움라우트가 포함 된 메일 주소를 사용하면 SMTPEception이 발생합니다. 클라이언트 또는 서버는 ASCII 로컬 부분이있는 주소에 대해서만 구성됩니다.

분류에서Dev

연결된 사용자를 수정하려면 클라이언트 간의 노드 클라이언트에 경로 데이터가 필요합니다.

분류에서Dev

Meteor minimongo는 서버 이전에 클라이언트에 로그인 한 사용자를 보여줍니다.

분류에서Dev

numpy 배열 이미지를 ftp 서버에 업로드하는 데 도움이 필요합니다.

분류에서Dev

메서드에서 자녀를 아버지로 전달하는 데 도움이 필요합니다. [자바]

분류에서Dev

passwd 및 shadow를 사용하는 스크립트에 대한 도움이 필요합니다.

분류에서Dev

C ++에서 중첩 된 for 루프를 사용하는 데 도움이 필요합니다.

Related 관련 기사

  1. 1

    Java를 사용하는 클라이언트 서버의 프로토콜 버퍼에 대한 도움이 필요합니다.

  2. 2

    ajax를 사용하는 Codeigniter의 웹 앱에서 좋아요 버튼에 대한 도움이 필요합니다.

  3. 3

    2 개의 NIC가있는 서버를 통한 라우팅에 대해 (다시) 도움이 필요합니다.

  4. 4

    행성의 무게를 계산하려면 Java 프로그램에 대한 도움이 필요합니다.

  5. 5

    웹 사이트를위한 새로운 텔레 그램 "버튼"이 있습니다-blogspot에서 사용하려면 도움이 필요합니다

  6. 6

    서버 측 대 클라이언트 측 프로토콜 스 니프

  7. 7

    (c ++) 내 클래스 Polynomial에 대해 operator +를 오버로딩하는 데 도움이 필요합니다.

  8. 8

    오류 : ER_SUPPORTED_AUTH_MODE : 클라이언트가 서버에서 요청한 인증 프로토콜을 지원하지 않습니다. MySQL 클라이언트 업그레이드를 고려하십시오.

  9. 9

    도커 이동 경로 MySQL을 8 : 클라이언트 서버에 의해 요청 된 인증 프로토콜을 지원하지 않습니다. 업그레이드 MariaDB 클라이언트를 고려

  10. 10

    한 서버에서 다른 서버로 파일을 이동하는 bash 스크립트를 작성하는 데 도움이 필요합니다.

  11. 11

    한 서버에서 다른 서버로 파일을 이동하는 bash 스크립트를 작성하는 데 도움이 필요합니다.

  12. 12

    프로토콜 버퍼를 사용하여 필드 설명 자로 상위 메시지에서 필드 이름을 검색합니다.

  13. 13

    실행중인 Java 버전에 대한 경로 만 표시하려면 grep에 대한 정규식을 작성하는 데 도움이 필요합니다.

  14. 14

    다음 중 동일한 클라이언트와 서버간에 여러 TCP 연결을 사용할 수있는 프로토콜은 무엇입니까?

  15. 15

    Excel의 한 열에서 다른 열로 정보를 이동하는 데 도움이 필요합니다.

  16. 16

    Windows 클라이언트 및 우분투 서버를위한 최고의 원격 데스크톱 프로토콜

  17. 17

    C 프로그램에서 버그 (char ** 복사와 관련된)를 찾는 데 도움이 필요합니다.

  18. 18

    Ruby의 선언 방법에 대한 문서를 찾는 데 도움이 필요합니다.

  19. 19

    Android 앱은 JAVA 로컬 호스트 서버에 연결하는 데 도움이 필요합니다.

  20. 20

    그리드 정렬을 사용하여 한 페이지에 두 개의 그래프를 레이아웃하는 데 도움이 필요합니다.

  21. 21

    Google 프로토콜 버퍼를 사용하는 Python 애플리케이션을 사용할 수 없습니다.

  22. 22

    간단한 콘솔 미로 게임 : 버그를 파악하는 데 도움이 필요합니다.

  23. 23

    Gmail API : 움라우트가 포함 된 메일 주소를 사용하면 SMTPEception이 발생합니다. 클라이언트 또는 서버는 ASCII 로컬 부분이있는 주소에 대해서만 구성됩니다.

  24. 24

    연결된 사용자를 수정하려면 클라이언트 간의 노드 클라이언트에 경로 데이터가 필요합니다.

  25. 25

    Meteor minimongo는 서버 이전에 클라이언트에 로그인 한 사용자를 보여줍니다.

  26. 26

    numpy 배열 이미지를 ftp 서버에 업로드하는 데 도움이 필요합니다.

  27. 27

    메서드에서 자녀를 아버지로 전달하는 데 도움이 필요합니다. [자바]

  28. 28

    passwd 및 shadow를 사용하는 스크립트에 대한 도움이 필요합니다.

  29. 29

    C ++에서 중첩 된 for 루프를 사용하는 데 도움이 필요합니다.

뜨겁다태그

보관