2017-11-08 1 views
1

작은 클라이언트 - 서버 응용 프로그램을 작성했습니다. 그것은 하나의 문자열을 클라이언트에서 서버로 전송해야하며 서버는 콘솔에 그것을 표시해야합니다. 그러나 서버는 항상 데이터를 기다립니다. 데이터가 서버에 오지 않는 것처럼 보입니다. 내가 뭘 잘못 했니?receive() 메서드가 클라이언트로부터 데이터를받지 못하는 이유는 무엇입니까?

public class UDPClient { 

    public static void main(String[] args) throws IOException { 
     BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 
     DatagramSocket clientSocket = new DatagramSocket(); 
     InetAddress IPAdress = InetAddress.getByName("localhost"); 
     byte[] sendData = new byte[1024]; 
     String sentence = inFromUser.readLine(); 
     sendData = sentence.getBytes(); 
     DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAdress, 4445); 
     clientSocket.close(); 
    } 
} 

public class UDPServer { 

    public static void main(String[] args) throws IOException { 
     DatagramSocket serverSocket = new DatagramSocket(4445); 
     byte[] receiveData = new byte[1024]; 
     while(true) { 
      DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
      serverSocket.receive(receivePacket); 
      String sentence = new String(receivePacket.getData()); 
      System.out.println("RECEIVED: " + sentence); 
     } 
    } 
} 
+0

왜 서버와 클라이언트 모두 주 방법입니까? – Stultuske

+0

어디 있을까요? 죄송합니다. 저는 네트워크 프로그래밍에 초보자입니다. –

+0

@Stultuske main 메소드로 두 개의 클래스를 제공하면이 질문이 _excellent_ MCVE (최소, 완전하고 검증 가능한 예제, +1)가됩니다. 먼저 코드를 읽고 오류를 보지 못했습니다. 그래서 골동품이 있습니다. 내 IDE에 두 개의 빈 클래스를 만들고 기본 메소드를 붙여 넣었다. 30 초 이내에 문제가 재현되었습니다. 훌륭합니다. 그리고 WireShark와의 매우 짧은 조사 끝에 나는 그것을 해결했습니다. – blafasel

답변

0

실제로 소켓을 통해 패키지를 보내는 것을 잊었습니다.

단순히

clientSocket.send(sendPacket); 

단지 UDPClient.main()에서

clientSocket.close(); 

전에 모든 것이 작동합니다 추가 할 수 있습니다.

+0

주 서버가 아닌 클라이언트 및 서버는 어디에 있습니까? 스레드에서? –

+0

저는 개인적으로 테스트 내부에 작은 개념을 낙서하는 것을 선호합니다. 테스트가 네트워크 프로그래밍과 관련이 있고 한 프로젝트에 클라이언트와 서버가있는 경우 클라이언트와 서버를 스레드로 구현하는 방법은 거의 없습니다. 그러나 당신이 몇 가지 개념으로 놀고 있다면 당신의 접근 방식도 좋습니다. – blafasel

관련 문제