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