Строка, усеченная при передаче с клиента на сервер - Java
Я пытаюсь отправить подробности о клиентской системе в серверную систему, но сервер не получает ничего. Прекращает печать, как только достигает первой строки. кто-то поможет мне справиться с этой проблемой.
// Сервер
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);
}
}
1 ответ
Ты звонишь writeObject
несколько раз на одном ObjectOutputStream
- но в коде чтения, вы только звоните readObject
один раз
Вам нужно будет зациклить в коде чтения, например,
while (true) {
String message = (String) ois.readObject();
System.out.println("Message Received: " + message);
}
Теперь это вызовет исключение, когда он достигнет конца потока, я подозреваю - у вас, вероятно, должно быть какое-то значение часового типа (например, ноль), чтобы указать "конец данных". (Я не думаю, ObjectInputStream
просто делает это для вас.)
Кроме того, в вашем клиентском коде вы создаете несколько InputStreamReader
объекты, обертывающие один и тот же сокет InputStream
- это плохая идея.
По сути, я думаю, что вам нужно более тщательно подумать о протоколе между сервером и клиентом - подумать о том, как сервер должен знать, когда клиент завершил с одним набором выходных данных, и когда он должен отправить следующее имя процесса, и т. д. Затем попытайтесь изменить дизайн своего кода так, чтобы вы когда-либо оборачивали какой-либо конкретный поток только один раз (хотя эта обертка, конечно, может быть обернута сама по себе). Наконец, кажется странным использовать ObjectInputStream
/ObjectOutputStream
в одном направлении, но просто текст в другом направлении. Протоколы редко должны быть асимметричными в этом отношении, ИМО.