2013-05-16 3 views
0

내가 작업하고있는 Server-Client NTP 프로젝트에 대해이 코드가 있습니다 ... 실행하면 "java.lang.NullPointerException"이 발생합니다 ...서버 - 클라이언트 NTP 프로젝트 - NullPointerException/SocketException 문제

고정 ... 소켓을 초기화했지만 java.net.SocketException이 발생합니다. 소켓이이 오류에 연결되어 있지 않습니다. 모든 단서?

아무도 도와 줄 수 있습니까? ...

package ntp; 

import java.io.*; 
import java.net.*; 
import java.text.SimpleDateFormat; 
import java.util.*; 
/** 
* @author Anastasis Christodoulakis 
*/ 
public class Client extends Thread{ 
    private Random r; 
    private int PORT; 

    public Client(int PORT) { 
     this.PORT=PORT; 
     r = new Random(); 
    } 

    public String secToTime(int totalSec){ 
     //seconds to HH,mm,ss 
     int hour=totalSec/3600; 
     int remain=totalSec%3600; 
     int min=remain/60; 
     int sec=remain%60; 

     String hours = (hour < 10 ? "0" : "") + hour, 
     mins = (min < 10 ? "0" : "") + min, 
     secs = (sec < 10 ? "0" : "") + sec; 
     String send = hours + "." + mins + "." + secs + "."; 

     return send; 
     } 

    @Override 
    public void run(){   
     try { 
      //open socket 
      Socket sock=new Socket("localhost",PORT);   
      InputStream in=sock.getInputStream(); 
      OutputStream out=sock.getOutputStream();   
      Scanner s=new Scanner(in); 
      PrintWriter w=new PrintWriter(out); //buffer 

      for(int i=0;i<10;i++){ 
       Date today=new Date();  //get current time 
       SimpleDateFormat sd=new SimpleDateFormat("yyy.MM.dd.HH.mm.ss"); //change time form 
       String sdf=sd.format(today); //time to String 

       //convert time into seconds   
       String ms[]=sdf.split("\\."); 
       int hh=Integer.parseInt(ms[3]);     
       int mm=Integer.parseInt(ms[4]);    
       int ss=Integer.parseInt(ms[5]);    
       int secTime=(3600*hh)+(60*mm)+ss; 

       //Random Delay (-0.5/0.5) 
       float lag=r.nextFloat()*(0.5f-0.5f)+0.5f; 
       secTime= (secTime - (int) (2 - lag)); 

       w.println("Client time is: " + secToTime(secTime)); 
       w.flush();  

      } 
      while(s.hasNextLine()){ 
       String input=s.nextLine(); 
       System.out.println(input); 
      } 

      in.close(); 
      out.close(); 
      sock.close(); 
     } catch (IOException ex) { 
      System.out.println(ex); 
     } 
    }  
} 

및 주요 ...

package ntp; 

public class NTP { 


    public static void main(String[] args) { 
     Server server = new Server(2000); //set port 
     Client client = new Client(2000); 

     server.start(); 
     client.start(); 
    } 
} 

여기

package ntp; 

import java.io.*; 
import java.net.*; 
import java.text.SimpleDateFormat; 
import java.util.*; 
/** 
* @author Anastasis Chirstodoulakis 
*/ 
public class Server extends Thread { 
    private int totalTime=0; 
    private int x=0;   //counter 
    private int moTime=0;  //average time 
    private int PORT; 
    private Socket sock = new Socket(); 

    public Server(int PORT) { 
     this.PORT=PORT; 
    } 

    private Server(Socket sock) { 
     this.sock = sock; 
    } 

    @Override 
    public void run(){ 
     try { 
      //open socket 
      ServerSocket server = new ServerSocket(PORT); 
      InputStream in = sock.getInputStream(); 
      OutputStream out = sock.getOutputStream(); 
      PrintWriter w = new PrintWriter(out); //buffer 
      Scanner s = new Scanner(in); 
      SimpleDateFormat time = new SimpleDateFormat("HH.mm.ss."); 

      while(true){ 
       sock = server.accept(); 
       new Thread(new Server(sock)).start(); 

       String msg=s.nextLine(); 
       System.out.println(msg); 
       //get time and set format 
       Date date=new Date();  //get current time 
       SimpleDateFormat sd=new SimpleDateFormat("yyyy.MM.dd.HH:mm:ss");  
       String sdf=sd.format(date); 
       //convert time into seconds 
       String arr[]=msg.split(" "); 
       String st=arr[3]; 
       String arr1[]=st.split("\\."); 
       int hh=Integer.parseInt(arr1[0]); 
       int mm=Integer.parseInt(arr1[1]); 
       int ss=Integer.parseInt(arr1[2]); 
       int secTime=(3600*hh)+(60*mm)+ss; 

       totalTime += secTime; 
       x++; 

       if(x==10){ 
        moTime=totalTime/10; //to get average time 

        String moHour= secToTime(moTime);     
        w.println("Server time is:"+ moHour); 
        w.flush(); //to empty the buffer 
       } 
       in.close(); 
       out.close(); 
       sock.close(); 
      } 
     } 
     catch (IOException ex) { 
      System.out.println(ex); 
     } 
     catch (NullPointerException ex){ 
      System.out.println(ex); 
     } 
    }  

    public String secToTime(int totalSec){ 
     //seconds to HH,mm,ss 
     int hour=totalSec/3600; 
     int remain=totalSec%3600; 
     int min=remain/60; 
     int sec=remain%60; 

     String hours = (hour < 10 ? "0" : "") + hour, 
     mins = (min < 10 ? "0" : "") + min, 
     secs = (sec < 10 ? "0" : "") + sec; 
     String send = hours + "." + mins + "." + secs + "."; 

     return send; 
     } 
} 

그리고

는 클라이언트 코드입니다하지만 난 괜찮아 생각 .......... ..... .................... ................... ...... .........

감사합니다.

+0

어떤 줄이 예외입니까? – sashkello

+0

thread "Thread-0"의 예외 java.lang.NullPointerException \t at ntp.Server.run (Server.java:30) –

+0

InputStream in = sock.getInputStream(); 서버 코드 –

답변

1

. 스트림을 사용하여 구현하려고 시도하는 것은 비 스타터입니다. NTP는 비 연결형입니다. 스트림에는 서로 연결된 두 개의 엔드 포인트가 필요합니다.

TCP를 통해 구현 된 자신의 프로토콜 인 경우 : 스트림을 사용하려면 먼저 스트림 소켓을 연결해야합니다. 서버 쪽에서는 accept입니다. 클라이언트 쪽에서는 connect입니다.

0

서버를 실행하기 전에 먼저 setSock해야합니다. NTP는 데이터 그램 프로토콜이 아닌 바이트 스트림 프로토콜입니다 : 이것은 실제 NTP 있어야하는 경우

package ntp; 

public class NTP { 


public static void main(String[] args) { 
    Server server = new Server(2000); //set port 
    server.setSocket(new Socket()); // you also need write setter for socket. 
    Client client = new Client(2000); 

    server.start(); 
    client.start(); 
    } 
} 

.......

+0

지금이 ... java.net.SocketException : 소켓이 연결되어 있지 않습니다 –

+0

소켓 연결에 대한 경험이 없지만 해당 소켓에 값을 설정하고 연결해야 할 수 있습니다. sock.connect() 또는 뭔가. –

+0

http://www.avajava.com/tutorials/lessons/how-do-i-make-a-socket-connection-to-a-server.html 여기에 귀하의 예 –