2013-05-17 41 views
0

我有一个关于我正在处理的服务器客户端NTP项目的代码... 我初始化了套接字,但是我得到了java.net.SocketException:Socket没有连接这个错误。任何线索?TCP NTP Java Socket程序

任何人都可以帮我吗?

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 


      while(true){ 
       ServerSocket server = new ServerSocket(PORT+=1000); 
       sock = server.accept(); 
       new Thread(new Server(PORT+=1000)).start(); 

       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."); 

       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; 
     } 
} 

这里是客户端代码,但我认为这是确定...

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(); 
    } 
} 

.......... ..... .................... ................... ...... .........

谢谢你的时间。

回答

2

正是在这里,这些行:

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循环(服务器类)在创建线程之后。看来你正在试图在套接字被接受之前使用客户端。

+0

确实,您尝试在连接建立之前创建流。它与客户端无关 – BlacKow

+0

仍然无法正常工作...我正在开发 java.net.ConnectException:连接被拒绝:connect –

+0

当我运行程序时,我得到输出:“客户端时间是: 21年12月25日“。如果您有该程序的一个实例已在运行,则可能会拒绝连接,从而阻塞该端口。我已经看到这个代码在堆栈溢出两次,不知道我们是否可以调试一切。 –