TCP / IP通信线程

时间:2014-10-07 10:45:33

标签: java tcp-ip

我想用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打开的连接。

2 个答案:

答案 0 :(得分:0)

如果您正在询问如何重构代码以获得3种方法,请执行以下操作:

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变量)。

如果您问如何有效地使用服务器及其限制(最多5个连接,在其他连接之间等待6分钟),您可以这样做:

使用连接池Object pool patternConnection pool)。

连接池的原理是,不是直接询问连接,而是要求池为您创建(连接)并将其提供给您。 完成连接后(不再需要发送命令),将其返回到池中,而不是直接关闭它以使其可供其他踏板/消费者使用。

您可能必须使用您指定的限制自行编写连接池类的代码:

  • 最多5个连接
  • 如果您关闭连接,请在重新打开前等待6分钟

为了优化它并避免6分钟的等待限制,您还可以尝试以合理的方式重用连接。

答案 1 :(得分:0)

为什么不在接收端创建一个ServerSocket,将它放在无限循环上,以便它始终监听,并为每个新的传入连接打开一个线程。 你现在可以拥有无​​尽的联系。

如果您需要代码示例,请说明......

我是如何构建服务器/客户端应用程序的