2012-01-08 184 views
0

我有一個類實現了serversocket類,還有另一個類實現了客戶端1. Socket類。套接字無法接收數據

所以我想要做的是。在獲取流之後,我希望客戶端向服務器發送一個數字,然後服務器會反過來響應客戶端是否爲素數。顯示在awt.Label中。

但我無法收到任何迴應。

下面是客戶端的構造函數的代碼:

public ClientIsPrime() 
{ 
    setLayout(new GridLayout(2,2)); 
    add(new Label("Enter a number: ")); 
    add(numEntry=new TextField(10)); 
    add(checkPrime=new Button("Check if number is Prime")); 
    add(result=new Label("Result is shown here")); 

    try 
    { 
     Socket client = new Socket(InetAddress.getLocalHost(), 5959); 
     in=client.getInputStream(); 
     out=client.getOutputStream(); 
    }catch(UnknownHostException e) 
    { 
     result.setText("Local Host cannot be resolved"); 
    }catch(IOException e) 
    { 
     result.setText("IOException occured"); 
    } 

    checkPrime.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent ae) 
     { 
      try 
      { 
       int num; 
       num=Integer.parseInt(numEntry.getText()); 
       out.write(num); 
       out.flush(); 

       int c; 
       result.setText(""); 
       String s=""; 
       while((c=in.read())!=-1) 
        s+=((char)c); 
       result.setText(s); 
      }catch(IOException e) 
      { 
       result.setText("IOException occured"); 
      }catch(NumberFormatException e) 
      { 
       result.setText("Please enter a valid number."); 
      } 
     } 
    }); 
} 

代碼服務器:

public static void main(String args[])throws IOException 
{ 
    server=new ServerSocket(5959); 

    socket=server.accept(); 

    System.out.println("connected"); 

    InputStream in=socket.getInputStream(); 
    OutputStream out=socket.getOutputStream(); 
    int c; String numStr=""; 
    while((c=in.read())!=-1) 
     numStr+=((char)c); 
    int num=Integer.parseInt(numStr); 
    if(num==3) 
     out.write("Number is Prime".getBytes()); 
    else 
     out.write("Number is not Prime".getBytes()); 
    out.flush(); 

    in.close(); 
    out.close(); 
} 

它不是一個真正的應用程序。我正在學。

+0

素數實現不正確..但不需要任何東西..只是想測試消息是否正在傳輸或不.. ..就這樣做..我會很好地寫入素數實現。 。 – ritesht93 2012-01-08 23:30:43

+0

從我所瞭解的有關java套接字的知識中,您可以正確地做到這一點。您的端口是否已轉發並且防火牆已關閉? – Axis 2012-01-08 23:42:53

+0

因此,澄清:是服務器收到素數的問題,但客戶端永遠不會收到響應? – chradcliffe 2012-01-08 23:45:32

回答

0

如果你想發送跨線整數是infinitely容易對原始套接字流的頂層DataOutputStream類/ DataInputStream和只是做writeInt()和的readInt()

+0

嗯,這是好的..我知道..我甚至可以使用ObjectInputStream .. 但我想嘗試與輸入和輸出流..它應該這樣工作..! 學習..只是想試試.. – ritesht93 2012-01-08 23:50:15

+0

和反正謝謝你的回覆..! :) – ritesht93 2012-01-08 23:56:08

1

的幾個問題。

首先你的服務器實現永遠不會退出while循環。 InputStream.read()的API指出,它將阻塞,直到收到數據或流關閉。數據流永遠不會關閉,因此在讀取初始數據後,讀數將永遠阻塞。

要解決這個問題,你必須決定你的協議是什麼。見下文。

另一個問題是,您正在從客戶端寫入文本的解析int。所以說13(作爲一個整數)。但是,你正在閱讀它,就好像它是一系列字符一樣。電線上的13將被視爲一些控制字符。您需要與您如何寫入數據和讀取數據保持一致。

我的建議是有一個基本的協議。在寫入側使用DataOutputStream,在讀取側使用DataInputStream,然後匹配雙方的讀/寫調用以確保一致。

+0

嗯ok..and read()case..what如果我可以在IF條件中使用available()方法,然後輸入循環.. 以及如果我將num變量作爲字符串傳遞會怎麼樣。的toString().. – ritesht93 2012-01-08 23:59:50

+0

如果您想了解正在發生的事情,我會閱讀DataInput/OutputStream的源代碼並查看它在做什麼。瞭解它做什麼/如何/爲什麼做它很好。除此之外重塑車輪並非如此。 – 2012-01-09 00:36:21

+0

嗯..所以我認爲最好是使用數據/對象流,然後......通常感謝您的回覆! – ritesht93 2012-01-09 00:59:26

相關問題