2011-04-26 57 views
2

我的服務器程序: -客戶端服務器程序字符串泄漏?

import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 

import javax.print.PrintService; 
import javax.print.PrintServiceLookup; 


public class GetFileServeredit implements Runnable { 

    public static final int SERVERPORT = 4747; 
    public String FileName=null; 
    public void run() { 
     try { 
      ServerSocket svr=new ServerSocket(SERVERPORT); 
      while(true){ 
       System.out.println("S: Waiting..."); 

       Socket sktClient=svr.accept(); 
       System.out.println("S: Receiving..."); 
       try{ 

        PrintService services[] = PrintServiceLookup.lookupPrintServices(null, null); 

        PrintWriter out2 = new PrintWriter(new BufferedWriter(new OutputStreamWriter(sktClient.getOutputStream())),true); 

        /*for(int z=0;z<services.length;z++){ 

         out2.println(services[z]); 

        }*/ 
        out2.println("aaa 12212"); 
        out2.flush(); 
        out2.close(); 

        sktClient.close(); 

        System.out.println("Transfer complete."); 


       } 
       catch(Exception e){ 
        e.printStackTrace(); 
       } 
      } 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String [] args){ 

     Thread servThread =new Thread(new GetFileServeredit()); 
     servThread.start(); 
    } 
} 

我的客戶端程序 : -

import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.util.ArrayList; 


public class ClientPrinters implements Runnable { 
    static final int PORT = 4747; //Change this to the relevant port 
    static final String HOST = "192.***.*.***"; //Change this to the relevant HOST,//(where Server.java is running) 

    public void run() { 

     try { 
      System.out.print("Sending data...\n"); 
      Socket skt = new Socket(HOST, PORT);   

      ArrayList Printers =new ArrayList(); 
      InputStream inStream = skt.getInputStream(); 
      BufferedReader inm = new BufferedReader(new InputStreamReader(inStream)); 


      while ((inm.read()) != -1) { 
       Printers.add(inm.readLine()); 
      } 


      inm.close(); 
      inStream.close(); 
      skt.close(); 

      } 
     catch(Exception e) {   
      System.out.print("Error! It didn't work! " + e + "\n"); 
     } 
    } 

    public static void main(String [] args){ 

     Thread cThread =new Thread(new ClientPrinters()); 
     cThread.start(); 
    } 
} 

是我發送形成即

out2.println("aaa 12212"); 

服務器的出只在客戶端變爲12212側,爲什麼呢?其他文字在哪裏?

+1

這很奇怪。我在客戶端收到「a 12212」。但是這是完全可以理解的,因爲通過調用'inm.read()'來默認丟棄第一個字節。請注意,['BufferedReader :: readLine'](http://download.oracle.com/javase/1.4.2/docs/api/java/io/BufferedReader.html#readLine())從當前位置讀取,直到隊伍的盡頭。在閱讀 – Oswald 2011-04-26 10:45:48

+1

之前,它不會返回到行的開頭注意:'PrintWriter'方法不會拋出IOExceptions,因爲不調用'checkError',所以可能會丟失一些。可能不是實際的問題,但我建議不要使用'PrintWriter'作爲這樣的應用程序。 – 2011-04-26 11:16:37

+0

@Carlos,我該怎麼用? – Harinder 2011-04-27 04:25:36

回答

1

也許你打算爲

List<String> printers =new ArrayList<String>(); 
String line; 
while ((line = inm.readLine()) != null) 
    printers.add(line); 

!注意:使用駝峯現場/變量名。

+0

bt它說使用行而不是字符串? – Harinder 2011-04-26 10:46:53

+0

@Harinder,這是什麼說的?它對我來說編譯得很好。此代碼中沒有「int」值。 – 2011-04-26 10:52:21

+0

Awww我正在寫閱讀,而不是readLine .. – Harinder 2011-04-26 12:21:17

3
while ((inm.read()) != -1) { 
    Printers.add(inm.readLine()); 
} 

此行第一讀取單個和如果即成功,則它試圖讀取一條線。這吞下(並忽略)每行一個字符。

此外:您不指定任何字符編碼在您的服務器和客戶端:只要客戶端和服務器使用相同的區域設置運行,這將工作(有一些限制)。但是一旦他們使用不同的默認編碼,它就會中斷。

這可能是最好的,只需指定編碼使用「在電線上」。一個很好的選擇是UTF-8:

// server 
PrintWriter out2 = new PrintWriter(new BufferedWriter(new OutputStreamWriter(sktClient.getOutputStream(), "UTF-8")),true); 

// client 
BufferedReader inm = new BufferedReader(new InputStreamReader(inStream, "UTF-8")); 
3

我沒有運行你的代碼,但是。 ((inm.read())!= -1){ }

我認爲.read()消耗了一些字節。

你應該使用一些緩衝(字節[]),並調用.read(緩衝區)= - 1