0

我尝试为一个应用程序编写一个简单的服务器,用户可以使用 telnet 从 PC 向 IP 和端口写入消息。它工作得很好,它可以显示

问题是,当用户关闭 telnet 窗口(PC 中的 CMD 窗口,用户连接到应用程序的位置)时,应用程序停止。

有没有办法防止这种行为?这是我的代码:

//Defined in Activity class 
//Sockets, servers, clients and stuff    
public java.net.ServerSocket MyServerSocket;
public String IpAddress = "";
public int Port = 12345;
public Handler UpdateConversationHandler;
public Thread ServerThread = null;

Activity 类中的嵌套类:

class ServerThread implements Runnable{

    public final String IpAddress;
    public final int Port;

    public ServerThread(String ipAddress, int port)
    {
        IpAddress = ipAddress;
        Port = port;
    }

    public void run() {
        Socket socket = null;

        try{
            MyServerSocket = new ServerSocket(Port);
        } catch (IOException e) {
            e.printStackTrace();
        }

        while(!Thread.currentThread().isInterrupted()){
            try{
                socket = MyServerSocket.accept();
                CommunicationThread commThread = new CommunicationThread(socket);
                new Thread(commThread).start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

class CommunicationThread implements Runnable
{
    private Socket clientSocket;
    private BufferedReader input;

    public CommunicationThread(Socket clientSocket)
    {
        this.clientSocket = clientSocket;

        try{
            this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
        } catch (IOException e){
            e.printStackTrace();
        }
    }

    public void run() {
        while(!Thread.currentThread().isInterrupted()){
            try{
                String read = input.readLine();
                UpdateConversationHandler.post(new UpdateUIThread(read));
            } catch (IOException e){
                e.printStackTrace();
            }
        }
    }
}

class UpdateUIThread implements Runnable {

    private String msg;

    public UpdateUIThread(String str) {
        this.msg = str;
    }

    @Override
    public void run() {
        _textview_info.setText("Client Says: "+ msg );

    }
}

我也有这个onStop方法代码,但它没有帮助!

@Override
protected void onStop() {
    super.onStop();

    //Closing server socket
    try
    {
        MyServerSocket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这是服务器启动的 onCreate 方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    _context = this;

    //Prepare spinners
    _preferences = getSharedPreferences("org.pervasivesystems.nexusmosaic", MODE_PRIVATE);
    _preferencesEditor = _preferences.edit();
    _spinner_videos = (Spinner) findViewById(R.id.spinner_select_video);
    _spinner_ids = (Spinner) findViewById(R.id.spinner_select_id);
    populateSpinners();

    //Prepare server
    IpAddress = getIpAddress();
    TextView tvIpAddress = (TextView) findViewById(R.id.textview_ip_address_value);
    tvIpAddress.setText(IpAddress);
    _textview_info = (TextView) findViewById(R.id.textview_information);
    UpdateConversationHandler = new Handler();
    ServerThread = new Thread(new ServerThread(IpAddress, Port));
    this.ServerThread.start();
}

更新

当我启动应用程序时,甚至在使用 telnet 从 PC 连接到应用程序之前,我在 LOGCAT 中不断收到以下消息:

11-14 15:45:32.460    W/System.err? at java.lang.Thread.run(Thread.java:856)
11-14 15:45:32.460    W/System.err? java.net.SocketException: Socket is closed
11-14 15:45:32.460    W/System.err? at java.net.ServerSocket.checkOpen(ServerSocket.java:362)
11-14 15:45:32.460     W/System.err? at java.net.ServerSocket.accept(ServerSocket.java:120)
11-14 15:45:32.460    W/System.err? at .MainActivity$ServerThread.run(MainActivity.java:233)

第 233 行引用此代码:

    while(!Thread.currentThread().isInterrupted()){
        try{
            socket = MyServerSocket.accept(); //LINE 233
            CommunicationThread commThread = new CommunicationThread(socket);
            new Thread(commThread).start();
        } catch (IOException e) {
            e.printStackTrace();
        }

我还发现从 PC 关闭 telnet 窗口后,UpdateUiThread继续运行。

4

2 回答 2

0

可能发生的情况是您的通信线程注意到终止的连接并退出。你就是这样写的。我不确定你想让它做什么......

如果您想在终止连接后做某事,只需在后面加上一些代码

while(!Thread.currentThread().isInterrupted()){  ...  }

等待线程完成,然后做你想做的事。

有时它可以帮助我在整个线程代码中添加一些系统输出,以掌握事情何时触发/结束。这会有所帮助,相信我。

于 2013-11-14T15:21:26.630 回答
-2

尝试这个

do{
    if(!Thread.currentThread().isInterrupted()){
        try{

            socket = MyServerSocket.accept();

            if(socket!=null && socket.isConnected()){
                CommunicationThread commThread = new CommunicationThread(socket);
                new Thread(commThread).start();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
  }while(socket!=null && socket.isConnected());
于 2013-11-14T16:01:44.653 回答