我正在尝试编写一个小程序来打开一个到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();
}
}
}
答案 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();
}