我想用Java进行TCP / IP通信,但我想打开TCP / IP端口,发送命令然后关闭该端口。
我知道我可以打开连接,发送命令,然后在一种方法中关闭连接,但问题是:我连接的机器不能接受更多的5个连接以及当连接关闭机器时大约6秒钟不接受任何其他连接。
我的目标是在一个线程中打开连接,发送命令一段时间,然后在我完成后我想关闭连接。
这就是我现在这样做的方式:
void sendCommand(String command) throws IOException {
String ipaddress = "192.168.0.2";
Socket commandSocket = null;
PrintWriter out = null;
BufferedWriter out = null;
BufferedReader in = null;
BufferedWriter outToDetailFile = null;
FileWriter fstream = null;
commandSocket = new Socket(ipaddress, 7420);
out = new PrintWriter(commandSocket.getOutputStream(), true);
out = new BufferedWriter(new OutputStreamWriter(commandSocket.getOutputStream()));
in = new BufferedReader(new InputStreamReader(commandSocket.getInputStream()));
out.write("c");out.flush();
out.write(command);out.flush();
String message = in.readLine();
//System.out.println(message);
out.close();
in.close();
commandSocket.close();
}
我基本上需要将这个方法拆分为3个部分,一部分我打电话打开连接,第二部分发送命令(我需要从我的摇摆形式发送命令)然后当我完成时发送命令我需要在按钮点击(或任何其他事件)时关闭连接。
问题是:如何在已经打开的连接中发送命令,然后在我完成发送命令后关闭该连接。
我试图实现这样的目标
-Method openConnection应该打开连接。 -Method sendCommand应该发送(以随机时间间隔(每5-10秒)多个命令)连接到已打开的套接字(用方法opneConnection打开) -Method closeConnection应该关闭openConnection打开的连接。
答案 0 :(得分:0)
Socket openConnection(String ipaddress) throws IOException {
return new Socket(ipaddress, 7420);
}
void sendCommand(Socket commandSocket, String command) throws IOException {
PrintWriter out = null;
BufferedWriter out = null;
BufferedReader in = null;
BufferedWriter outToDetailFile = null;
FileWriter fstream = null;
out = new PrintWriter(commandSocket.getOutputStream(), true);
out = new BufferedWriter(new OutputStreamWriter(commandSocket.getOutputStream()));
in = new BufferedReader(new InputStreamReader(commandSocket.getInputStream()));
out.write("c");out.flush();
out.write(command);out.flush();
String message = in.readLine();
//System.out.println(message);
}
void closeConnection(Socket commandSocket) throws IOException {
commandSocket.close();
}
现在,您必须在加载表单或要发送第一个命令时调用第一个方法(openConnection
)。
然后对于每个命令,调用第二个方法(sendCommand
),它只会在不关闭连接的情况下发送命令。
最后,在发送所有命令时(或关闭表单时)调用第三种方法(closeConnection
)。
重要的一点是不要关闭输入/输出流/编写器close the socket。
我只是使用你的代码而不试图纠正或改进它,我认为会有一些编译失败(例如:两次声明out
变量)。
使用连接池(Object pool pattern,Connection pool)。
连接池的原理是,不是直接询问连接,而是要求池为您创建(连接)并将其提供给您。 完成连接后(不再需要发送命令),将其返回到池中,而不是直接关闭它以使其可供其他踏板/消费者使用。
您可能必须使用您指定的限制自行编写连接池类的代码:
为了优化它并避免6分钟的等待限制,您还可以尝试以合理的方式重用连接。
答案 1 :(得分:0)
为什么不在接收端创建一个ServerSocket,将它放在无限循环上,以便它始终监听,并为每个新的传入连接打开一个线程。 你现在可以拥有无尽的联系。
如果您需要代码示例,请说明......
我是如何构建服务器/客户端应用程序的