从客户端传输到服务器时字符串被截断-Java
我试图将客户端系统的详细信息发送到服务器系统,但服务器没有接收到所有信息。一旦到达第一行,它就停止打印。有人帮我解决这个问题 //服务器从客户端传输到服务器时字符串被截断-Java,java,string,client,server,lan,Java,String,Client,Server,Lan,我试图将客户端系统的详细信息发送到服务器系统,但服务器没有接收到所有信息。一旦到达第一行,它就停止打印。有人帮我解决这个问题 //服务器 void connect_clients() throws ClassNotFoundException, InterruptedException { try { ServerSocket listener = new ServerSocket(7700); jButton1.setTe
void connect_clients() throws ClassNotFoundException, InterruptedException
{
try {
ServerSocket listener = new ServerSocket(7700);
jButton1.setText("Server Running!");
jButton1.setEnabled(false);
ObjectInputStream ois; // = new ObjectInputStream(socket.getInputStream());
while (true) {
socket = listener.accept();
socketList.add(socket);
ois = new ObjectInputStream(socket.getInputStream());
String message = (String) ois.readObject();
System.out.println("Message Received: " + message); */*/*this is not printing everything
}
}
catch(IOException ex)
{
JOptionPane.showMessageDialog(null, ex);
}
}
//客户
void connect_server() throws IOException
{
try {
// TODO code application logic here
String serverAddress = JOptionPane.showInputDialog(
"Enter IP Address of a machine that is\n" +
"running the date service on port 9090:");
s = new Socket(serverAddress, 7700);
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
ObjectInputStream ois = null;
BufferedReader input;
String answer;
while(true){
input =
new BufferedReader(new InputStreamReader(s.getInputStream()));
DataOutputStream dOut = new DataOutputStream(s.getOutputStream());
answer = input.readLine();
System.out.println(answer);
if(answer != null)
{
oos.reset();
String line = "";
String command = "powershell.exe Get-ItemProperty HKLM:\\Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | \n" +
"Format-Table –AutoSize";
// Executing the command
Process powerShellProcess = Runtime.getRuntime().exec(command);
// Getting the results
powerShellProcess.getOutputStream().close();
System.out.println("Standard Output:");
BufferedReader stdout = new BufferedReader(new InputStreamReader(
powerShellProcess.getInputStream()));
while ((line = stdout.readLine()) != null) {
byte[] mybytearray = new byte[(int) line.length()];
oos.writeObject(mybytearray);
}
stdout.close();
System.out.println("Standard Error:");
BufferedReader stderr = new BufferedReader(new InputStreamReader(
powerShellProcess.getErrorStream()));
while ((line = stderr.readLine()) != null) {
oos.writeObject(line);
System.out.println("fdg"+line);
//printing the output to a file --start
try(PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("myfile.txt", true)))) {
out.println(line);
}
catch (IOException e)
{
JOptionPane.showMessageDialog(null, e);
}
}
stderr.close();
System.out.println("Done");
}
}
}
catch (ConnectException e) {
JOptionPane.showMessageDialog(null, e);
}
catch (SocketException e) {
JOptionPane.showMessageDialog(null, e);
}
}
您在同一个
ObjectOutputStream
上多次调用writeObject
——但在读取代码时,您只调用readObject
一次
您需要循环读取代码,例如
while (true) {
String message = (String) ois.readObject();
System.out.println("Message Received: " + message);
}
现在,当它到达流的末尾时将抛出一个异常,我怀疑-您可能应该有一些sentinel值(例如null)来指示“数据的结尾”。(我不认为ObjectInputStream
只是为您做这件事。)
此外,在客户端代码中,您正在创建多个InputStreamReader
对象来包装同一套接字的InputStream
——这不是一个好主意
从根本上说,我认为您需要更仔细地考虑服务器和客户机之间的协议-考虑服务器是如何知道客户机何时完成一组输出,何时应该发送下一个进程名称等。然后尝试重新设计代码,以便只包装一次特定流最后,在一个方向上使用
ObjectInputStream
/ObjectOutputStream
,而在另一个方向上使用纯文本似乎很奇怪。在我看来,协议很少会不对称到这种程度。您正在包装s.getOutputStream()
在ObjectOutputStream
和DataOutputStream
中,我觉得这是一个非常糟糕的主意。考虑到您从未使用dOut
,这可能不是问题所在,但这仍然是一个糟糕的主意……而且您在循环中这样做,这会让事情变得更糟。在循环顶部只打开这些流一次。那么,这是什么呢正确的方法和解决方案?它很有效,也没有异常抛出。:)哦,不,当我看到它使用“JTextArea”时,我明白了你想说的问题。如何摆脱它@JonSkeet。@问题:仔细阅读我的其余答案,并仔细思考您希望协议是什么样子。然后我真的会从头开始这些代码-它们现在非常混乱。是的,它正在匆忙地完成这项工作。我真正想要实现的是请求客户机提供客户机系统的详细信息,我通过发送一条小消息来请求它,然后有一段代码返回详细信息,并将该详细信息传递给服务器端的套接字。除了“while”循环之外,我已经让所有东西都正常工作了,即使在传输到服务器所需的数据之后,它也会一直持续。当我在“控制台”中显示结果时,它工作正常,但当我在“JTextArea”中显示时,它会显示并快速滚动,并永远循环@JonSkeet@question当前位置匆忙并不意味着你可以省吃俭用。退一步,反复思考协议,并适当地设计它。以一种有节制的方式来做这件事要比在这里或那里尝试调整快得多。