Java 客户端-服务器程序字符串泄漏?

Java 客户端-服务器程序字符串泄漏?,java,Java,我的服务器程序:- 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.InputStr

我的服务器程序:-

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();
    }
}
我从服务器发送的输出,即

out2.println("aaa 12212");
仅在客户端变为12212,为什么?其他文本在哪里

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

我没有运行你的代码,但是。 而((inm.read())!=-1){ }

我认为.read()消耗了一些字节


您应该使用一些缓冲区(字节[])并调用.read(缓冲区)=-1

也许你的本意是

List<String> printers =new ArrayList<String>();
String line; 
while ((line = inm.readLine()) != null)
    printers.add(line);
List printers=new ArrayList();
弦线;
而((line=inm.readLine())!=null)
打印机。添加(行);

注意:字段/变量名使用camelCase。

这很奇怪。我在客户端收到
AA12212
。但这是完全可以理解的,因为通过调用
inm.read()
,第一个字节会被悄悄地丢弃。请注意,从当前位置到行尾的读数。阅读前不会返回到行首注意:
PrintWriter
方法不会引发IOExceptions,由于未调用
checkError
,您可能会错过一些异常。可能不是真正的问题,但我建议不要在这样的应用程序中使用
PrintWriter
。@Carlos那么我应该使用什么呢?只使用
BufferedWriter
(或检查“checkError°”的结果)bt它说使用line作为int而不是string???@Harinder,这是什么意思?它对我来说很好。此代码中没有
int
值。厚度很大..问题已解决!!:-)
List<String> printers =new ArrayList<String>();
String line; 
while ((line = inm.readLine()) != null)
    printers.add(line);