gpt4 book ai didi

java - 无法通过套接字发送命令

转载 作者:行者123 更新时间:2023-12-01 13:06:51 24 4
gpt4 key购买 nike

我是 Java 世界的新手,现在我正在尝试创建一个套接字程序。我创建了一个服务器和一个客户端,但它们似乎不起作用。现在我发布代码。

这是服务器:

import java.net.*;
import java.io.*;

public class TCPCmdServer
{
public int port;
public ServerSocket server;

TCPCmdServer (int port)
{
this.port = port;
if(!createServer())
System.out.println("Cannot start the server");
else System.out.println("Server running on port " + port);
}

public boolean createServer ()
{
try
{
server = new ServerSocket(port);
}
catch (IOException e)
{
e.printStackTrace();
return false;
}

return true;
}

public static void main (String [] args)
{
TCPCmdServer tcp = new TCPCmdServer(5000);

boolean flag = true;
while (flag)
{
try
{
Socket socket = tcp.server.accept();
System.out.println("A client has connected");
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
out.write("Welcome on the server... type the commands you like, type END to close me\n");
out.flush();

String cmd = in.readLine();
System.out.println("Recieved: " + cmd);
if (cmd.equals("END"))
{
System.out.println("Shutting down server...");
socket.close();
in.close();
out.close();
flag = false;
}
else
{
Process p = Runtime.getRuntime().exec(cmd);
BufferedReader pRead = new BufferedReader(new InputStreamReader(p.getInputStream()));

String line;
while ((line = pRead.readLine()) != null)
{
System.out.println(line);
out.write(line + "\n");
out.flush();
}
}
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
}
}

这是客户端:

import java.net.*;
import java.io.*;

public class TCPCmdClient
{
public Socket socket;
public int port;
public String ip;

TCPCmdClient (String ip, int port)
{
this.ip = ip;
this.port = port;
if (!createSocket())
System.out.println("Cannot connect to the server. IP: " + ip + " PORT: " + port);
else System.out.println("Connected to " + ip + ":" + port);
}

public boolean createSocket ()
{
try
{
socket = new Socket(ip, port);
}
catch (IOException e)
{
e.printStackTrace();
return false;
}

return true;
}

public static void main (String [] args)
{
TCPCmdClient client = new TCPCmdClient("127.0.0.1", 5000);

try
{
BufferedReader sysRead = new BufferedReader(new InputStreamReader(System.in));
BufferedReader in = new BufferedReader(new InputStreamReader(client.socket.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(client.socket.getOutputStream()));

String response = in.readLine();
System.out.println("Server: " + response);

boolean flag = true;
while (flag)
{
System.out.println("Type a command... type END to close the server");
String cmd = sysRead.readLine();
out.write(cmd + "\n");
out.flush();
if (cmd.equals("END"))
{
client.socket.close();
sysRead.close();
in.close();
out.close();
flag = false;
} else
{
String outputline;
while ((outputline = in.readLine()) != null)
System.out.println(outputline);
}
}
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
}

[旧]我相信问题出在输入和输出流上,但我不明白为什么它们不起作用。

预期的行为如下:客户端连接到服务器,然后服务器发送响应。客户端要求用户插入MS-DOS命令(或“END”命令),然后该命令被发送到服务器。服务器在运行它的计算机上执行命令(如果命令是 END,它将关闭连接)。然后服务器将命令的结果发送给客户端,客户端将其显示给用户。[/旧]

现在唯一的问题是,每当我想执行新命令时,我都必须关闭并重新打开客户端

最佳答案

在服务器代码中,您正在为从客户端收到的每个命令创建一个新套接字。这就是为什么每次要向服务器发送命令时都必须打开一个新客户端的原因。要纠正此问题,首先需要删除服务器代码中的 while(flag) 循环。然后您可以使用以下命令建立与客户端的连接并在它们之间发送和接收命令和输出。

        Socket socket = tcp.server.accept();
System.out.println("A client has connected");
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
out.write("Welcome on the server... type the commands you like, type END to close me\n");
out.flush();

try {
while(!(cmd = in.readLine()).equals("END")) {
System.out.println("Recieved: " + cmd);

Process p = Runtime.getRuntime().exec(cmd);
BufferedReader pRead = new BufferedReader(new InputStreamReader(p.getInputStream()));

String line;
while ((line = pRead.readLine()) != null) {
System.out.println(line);
out.write(line + "\n");
out.flush();
}
}
} catch (IOException ex) {
ex.printStackTrace();
} finally {
System.out.println("Shutting down server...");
socket.close();
in.close();
out.close();
}

关于java - 无法通过套接字发送命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23198645/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com