-1

リモートコンソールを介して対話できるように、ミニクラフトサーバーへのソケットを開く小さなプログラムを作成しようとしています。

Java ソケットの基本的な操作方法は理解できましたが、コンソールからユーザー入力を取得したり、構成ファイルを読み取ったりする作業を行っている間、ソケットをバックグラウンドで実行し続ける簡単な方法がわかりません。

私が見たいくつかの例では、スレッドを使用し、ソケットをサーバーに接続したままにするためだけにネットワーク スレッドを作成していました。

スレッドを動作させようとすると、プログラムは実行されますが、すぐにスレッド 1 (私が作成したスレッド) に切り替わり、スレッド 0 が中断されて待機するように指示されているため、テスト行が出力されません。

私は本当にスレッド化を完全に理解していないので、それで少し途方に暮れています。しかし、何かを簡単にする方法がわかりません。何か案は?

これは私がこれまでに行ったコードです。それほど多くはありませんが、役立つかもしれません。

package com.solignis.rcon;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;

public class Connection extends Thread {

    private InetSocketAddress serverAddress;
    private int timeout;

    private Socket socket;

    public Connection(String par1, int par2) {
        serverAddress = new InetSocketAddress(par1, par2);
    }

    @Override
    public void run() {
        socket = new Socket();

        try {
            socket.connect(serverAddress, timeout);
        } catch (IOException e) {
            e.printStackTrace();
        }

        while(socket.isConnected()) {

        }
    }

    public void connect() {
        this.run();
        try {
            this.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Connecting to " + serverAddress.toString());

        if(socket.isConnected()){
            System.out.println("Connection established");
        }else{
            System.out.println("Connection failed");
        }
    }

    public void disconnect() {
        this.notify();

        try {
            socket.close();
        } catch (IOException ie) {
            ie.printStackTrace();
        }
    }
}
4

1 に答える 1

0

メソッドの実行が終了し、クライアント ソケットへの参照がないため、ソケットは閉じられます。サーバーへのストリームの書き込みを継続するスレッドと、サーバーからのストリームの読み取りを継続する別のスレッドを開始することをお勧めします。コードは次のようになります。

class ReadThread extends Thread {

    private Socket s ;

    public ReadThread (Socket s) {
        this.s = s;
    }

    public void run() {
        try {
            while (true) {
                InputStream is = s.getInputStream();
                //read stream from the server
            }
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }


class WriteThread extends Thread {
     //Like the read thread,keep a while(true) loop writing to the server
}


main(){
    Socket s=new Socket(host,pot);
    new WriteThread(s).start();
    new ReadThread(s).start();
}
于 2013-11-08T09:54:45.557 に答える