我正在编写外部Taskmanager,我需要通过tcp将进程列表发送到我的服务器应用程序。但我不知道如何开始以及如何运作。
编辑: 我有进程列表,我只需要通过TCP将它发送到Serverside。
感谢您的帮助。
答案 0 :(得分:1)
如果您已有一个进程列表,那么使用Java为您的目的制作客户端 - 服务器逻辑并不困难。首先,您需要建立一个服务器端:
public class ServerSide {
public static void main(String[] args) {
try
{
ServerSocket myServerSocket = new ServerSocket(9999);
Socket skt = myServerSocket.accept();
List<Process> objects = null;
try {
ObjectInputStream objectInput = new ObjectInputStream(skt.getInputStream());
try {
Object object = objectInput.readObject();
objects = (ArrayList<Process>) object;
System.out.println(objects);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
将使用ServerSocket监听指定的端口,在这种情况下是9999.然后接受连接(看看myServerSocket.accept(),它停止执行,直到接受任何连接),它创建一个Socket你可以得到它的InputStream并从中获取一个对象。在此示例中,服务器在第一次接受连接后停止,您应该接受具有无限循环的任意数量的连接。
当你有一台服务器时,你可以建立一个客户端,它将向服务器发送一个进程列表:
public class ClientSide {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1",9999);
ArrayList<Process> my = new ArrayList<Process>();
my.add(new Process("Test1"));
my.add(new Process("Test2"));
try
{
ObjectOutputStream objectOutput = new ObjectOutputStream(socket.getOutputStream());
objectOutput.writeObject(my);
}
catch (IOException e)
{
e.printStackTrace();
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这种情况下,您将自己创建一个Socket,给它一个eddress和端口号,它将在那里发送数据。然后,您可以获取OutputStream并通过它传递数据。在上面的示例中,您将传递一个Process对象实例Array。 Process类看起来像:
public class Process implements Serializable {
private String processName = null;
public Process(String processName) {
this.processName = processName;
}
@Override
public String toString() {
return processName;
}
}
在Process类的情况下,它应该实现Serializable接口。在这种情况下,您不需要为它的序列化制定一些逻辑。
但是如果你必须用Java创建一个客户端,而不是服务器,那么它可能会有点困难。你可以看看here,看看某种例子,Java客户端如何与C ++服务器通信。无论如何,在Java部分你应该使用Socket和它的OutputStream,只有数据表示会有所不同。