如何在Java中关闭线程?

如何在Java中关闭线程?,java,multithreading,sockets,Java,Multithreading,Sockets,我对Java非常陌生,我正在尝试修改一个套接字服务器的示例,以支持基于flash的游戏。要允许flash连接到服务器,我需要提供一个策略文件 我以前从未编写过服务器应用程序,所以我对需要发生的事情不太熟悉 无论如何,我已经使它输出文件,但出于某种原因,它这样做了10次 我需要先关闭线程,然后再继续执行。下面是我的代码,其中有一条注释,我需要关闭线程 import java.io.*; import java.net.*; import java.util.Random; public clas

我对Java非常陌生,我正在尝试修改一个套接字服务器的示例,以支持基于flash的游戏。要允许flash连接到服务器,我需要提供一个策略文件

我以前从未编写过服务器应用程序,所以我对需要发生的事情不太熟悉

无论如何,我已经使它输出文件,但出于某种原因,它这样做了10次

我需要先关闭线程,然后再继续执行。下面是我的代码,其中有一条注释,我需要关闭线程

import java.io.*;
import java.net.*;
import java.util.Random;

public class Main {

  private static int port=4041, maxConnections=0;
  // Listen for incoming connections and handle them
  public static void main(String[] args) {
    int i=0;

    try{
      ServerSocket listener = new ServerSocket(port);
      Socket server;

      while((i++ < maxConnections) || (maxConnections == 0)){
        doComms connection;

        server = listener.accept();
        doComms conn_c= new doComms(server);
        Thread t = new Thread(conn_c);
        t.start();
      }
    } catch (IOException ioe) {
      System.out.println("IOException on socket listen: " + ioe);
      ioe.printStackTrace();
    }
  }

}

class doComms implements Runnable {
    private Socket server;
    private String line,input;

    doComms(Socket server) {
      this.server=server;
    }

    public void run () {

        char EOF = (char)0x00;
      input="";

      try {
        // Get input from the client
        DataInputStream in = new DataInputStream (server.getInputStream());
        PrintStream out = new PrintStream(server.getOutputStream());

        while((line = in.readLine()) != null && !line.equals(".")) {
          input=input + line;
          if(line.trim().equals("h")){

              out.println("h"+EOF);

          }
          else if(line.trim().equals("i")){

               Random randomGenerator = new Random();
               int randomInt = randomGenerator.nextInt(4);

              out.println("b"+randomInt+EOF);


          }
          else if(line.trim().equals("c")){ System.out.println("Player collision.");}
          else if (line.trim().equals("<policy-file-request/>")) {
            out.println("<?xml version=\"1.0\"?>\n<!DOCTYPE cross-domain-policy SYSTEM \"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd\"><cross-domain-policy>\n<site-control permitted-cross-domain-policies=\"all\"/>\n<allow-access-from domain=\"*\"/>\n</cross-domain-policy>"+EOF);
            System.out.println("Responded to policy request");
            // I need to close the thread / disconnect the client here.
          }
          else System.out.println("Unknown command: "+line.trim());

        }
        server.close();
      } catch (IOException ioe) {
        System.out.println("IOException on socket listen: " + ioe);
        ioe.printStackTrace();
      }
    }
}
import java.io.*;
导入java.net。*;
导入java.util.Random;
公共班机{
专用静态int端口=4041,maxConnections=0;
//监听传入的连接并处理它们
公共静态void main(字符串[]args){
int i=0;
试一试{
ServerSocket侦听器=新的ServerSocket(端口);
套接字服务器;
while((i++
另外,在NetBeans中,有一个额外的小东西,它在“import java.io.*”下面加了下划线,并表示包不正确,但仍然可以正常工作

编辑:
我已经计算出它发送10次的原因是它在一次发送操作中接收了10行。我已经尝试在发送策略XML的地方添加一个“return;”,但它似乎仍然无法对客户端进行d/c操作。我还应该注意到,我打算将其作为一个多人服务器,因此我需要保持套接字打开,只关闭一个线程。

乍一看,您的
run()
方法看起来应该正常终止。我怀疑你的循环:

while((i++ < maxConnections) || (maxConnections == 0)){
while((i++
由于
maxConnections
被初始化为0且从不递增,因此循环似乎无限运行并创建许多线程-可能是套接字可以接受侦听器的线程数。然后它以
IOException
从循环中中断。这是实际发生的吗


更新:显然不是……现在没有想法。

您的代码很有意义。您的输入是什么?如果您有10行代码说“”,那么它确实会打印文件10次。那么您的所有其他if子句呢?在每一个if子句中,您都会打印+EOF,但您肯定只想为每个请求打印一个响应。而且您的“input”变量未使用。

从doComms.run()返回后,线程将死亡.请大写Java中类名的开头:它应该是DoComms,以便其他Java程序员更容易理解代码

要关闭连接,您应该调用
server.close()
来完成。要确保首先完全发送输出,您应该在调用
Socket.close()
之前调用
PrintStream上的
close()
flush()

您正在发送什么输入?看起来,如果您只从客户端发送一次
,您将只获得一次文件

不确定NetBeans,但它是否在抱怨在
.java
文件的顶部没有指定

package my.path.to.this.directory;

我建议在调试器中同时运行服务器和客户机,并逐步执行以查看每个时间点发生的情况。这将帮助您确认每个时间点的预期值。Eclipse和其他Java IDE都有非常好(且易于使用)的调试器

就您的代码而言:

  • 我会为每个人做一次line.trim() 循环迭代,而不是 反复修剪()并 不必要地制造额外的 对象
  • 确保客户端和服务器在每次请求/响应后都刷新()套接字的OutputStream。如果尚未刷新套接字的OutputStream,则连接另一端的InputStream可能会阻止等待输入,而OutputStream则阻止等待填充其缓冲区
  • 客户端中的代码是什么 看起来像?你确定是吗 正在发送null或“.”以关闭 连接?在检查“”之前是否需要修剪()
  • 正如其他人提到的,您的代码没有遵循典型的Java编码约定