保持java网络套接字活着的简单方法是什么?

时间:2013-11-08 09:24:52

标签: java multithreading sockets networking

我正在尝试编写一个小程序来打开一个到Minecraft服务器的套接字,这样我就可以通过它的远程控制台与它进行交互。

我掌握了有关如何使用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();
        }
    }
}

1 个答案:

答案 0 :(得分: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();
}