2011-04-26 59 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