Java客户端/服务器-通过套接字连接发送多个字符串
我有一个程序Java客户端/服务器-通过套接字连接发送多个字符串,java,sockets,tcp,Java,Sockets,Tcp,我有一个程序Client,它向服务器发送字符串LISTALL。 之后,服务器需要使用ps-e命令检查系统(Linux)上所有正在运行的进程,然后将结果返回给客户端。 显然,结果是由多个字符串组成的,那么如何让客户端接收并存储它们呢 现在,这是我从客户那里得到的: 发送到服务器的消息:LISTALL 从服务器收到的消息:null 并从服务器: 服务器已启动并正在侦听。。 从客户端收到的消息:LISTALL 然后它按预期列出了来自ps-e命令的结果 我的代码: 服务器: public class S
Client
,它向服务器发送字符串LISTALL
。
之后,服务器需要使用ps-e
命令检查系统(Linux)上所有正在运行的进程,然后将结果返回给客户端。
显然,结果是由多个字符串组成的,那么如何让客户端接收并存储它们呢
现在,这是我从客户那里得到的:
发送到服务器的消息:LISTALL
从服务器收到的消息:null
并从服务器:
服务器已启动并正在侦听。。
从客户端收到的消息:LISTALL
然后它按预期列出了来自ps-e
命令的结果
我的代码:
服务器:
public class Server
{
private static Socket socket;
public static void main(String[] args)
{
try
{
int port = 25000;
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("Server Started and listening to the port 25000");
//Server is running always. This is done using this while(true) loop
while(true)
{
//Reading the message from the client
socket = serverSocket.accept();
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String list = br.readLine();
System.out.println("Message received from client is "+list);
//Sending the response back to the client.
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
String returnMessage;
try
{
ProcessBuilder build = new ProcessBuilder("ps", "-e");
Process proc = build.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
while (reader.readLine() != null) {
returnMessage=reader.readLine();
bw.write(returnMessage);
proc.waitFor();
System.out.println("Message sent to the client is "+returnMessage);
bw.flush();}
}
catch(NumberFormatException e)
{
//Input was not a number. Sending proper message back to client.
returnMessage = "Please send a proper number\n";
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
socket.close();
}
catch(Exception e){}
}
}
}
public class Client
{
private static Socket socket;
public static void main(String args[])
{
try
{
String host = "localhost";
int port = 25000;
InetAddress address = InetAddress.getByName(host);
socket = new Socket(address, port);
//Send the message to the server
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
String list = "LISTALL";
String sendMessage = list + "\n";
bw.write(sendMessage);
bw.flush();
System.out.println("Message sent to the server : "+sendMessage);
//Get the return message from the server
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
while (br.readLine() != null) {
String message = br.readLine();
System.out.println("Message received from the server : " +message);
}}
catch (Exception exception)
{
exception.printStackTrace();
}
finally
{
//Closing the socket
try
{
socket.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}
客户端:
public class Server
{
private static Socket socket;
public static void main(String[] args)
{
try
{
int port = 25000;
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("Server Started and listening to the port 25000");
//Server is running always. This is done using this while(true) loop
while(true)
{
//Reading the message from the client
socket = serverSocket.accept();
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String list = br.readLine();
System.out.println("Message received from client is "+list);
//Sending the response back to the client.
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
String returnMessage;
try
{
ProcessBuilder build = new ProcessBuilder("ps", "-e");
Process proc = build.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
while (reader.readLine() != null) {
returnMessage=reader.readLine();
bw.write(returnMessage);
proc.waitFor();
System.out.println("Message sent to the client is "+returnMessage);
bw.flush();}
}
catch(NumberFormatException e)
{
//Input was not a number. Sending proper message back to client.
returnMessage = "Please send a proper number\n";
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
socket.close();
}
catch(Exception e){}
}
}
}
public class Client
{
private static Socket socket;
public static void main(String args[])
{
try
{
String host = "localhost";
int port = 25000;
InetAddress address = InetAddress.getByName(host);
socket = new Socket(address, port);
//Send the message to the server
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
String list = "LISTALL";
String sendMessage = list + "\n";
bw.write(sendMessage);
bw.flush();
System.out.println("Message sent to the server : "+sendMessage);
//Get the return message from the server
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
while (br.readLine() != null) {
String message = br.readLine();
System.out.println("Message received from the server : " +message);
}}
catch (Exception exception)
{
exception.printStackTrace();
}
finally
{
//Closing the socket
try
{
socket.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}
您的读取循环不正确。它们应为一般形式:
String line;
while ((line = reader.readLine()) != null) {
// Do something with `line`
}
目前,您正在丢弃每一个奇数行,如果有奇数行,则打印空值。出于某种原因,我仍然从客户端获得相同的输出。也就是说,它不是输出从服务器接收的
消息:…
,然后是正确的输出,而是显示从服务器接收的消息:null
。仅当您没有执行此代码时。有了这个代码,这是不可能的,正如你自己所看到的。注意,你在两个地方犯了这个错误。所以我必须在写循环中进行相同的修复?你必须在犯相同错误的地方进行相同的修复。我没有看到任何写循环。您还需要关闭套接字。对不起,我指的是客户端的读取循环。我修复了客户端和服务器的读取循环,但它仍然给了我相同的结果。