Для Java-приложения: почему нет возможности запустить два разных потока в одном и том же главном ???
Один поток, который прослушивает входящие соединения с портом, и другой поток, который слушает другиесоединения с совершенно другим портом ???
Что-то вроде:
public static void main(String[] args) {
// TODO Auto-generated method stub
ClientThread clienThread= new ClientThread();
new Thread(clienThread).start();
ThreadPooledServer server = new ThreadPooledServer(6000);
new Thread(server).start();
}
Где ClientThread () и ThreadPooledServer () - это два разных потока!
Вопрос: Почему неява позволила мне это сделать?
public class Start {
Socket socket;
private String serverIpAddress="127.0.0.1";
static Thread cThread;
public static void main(String[] args) {
// TODO Auto-generated method stub
ClientThread clienThread= new ClientThread();
new Thread(clienThread).start();
ThreadPooledServer server = new ThreadPooledServer(6000);
new Thread(server).start();
}
}
public class ClientThread implements Runnable {
public void run() {
try {
InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
socket = new Socket(serverAddr, 6100);
System.out.println("s-a creat");
} catch (UnknownHostException e) {
System.err.println("Don't know about host");
} catch (IOException e) {
System.err
.println("Couldn't get I/O for the connection to host");
}
}
}
public class ThreadPooledServer implements Runnable {
protected int serverPort =6000;
public static String SERVERIP = "127.0.0.1";
protected ServerSocket serverSocket = null;
protected boolean isStopped = false;
protected Thread runningThread = null;
public static int clientconnection = 0;
Vector<WorkerRunnable> workerList = null;
protected ExecutorService threadPool =
Executors.newFixedThreadPool(5);
public ThreadPooledServer(int port) {
this.serverPort = port;
workerList = new Vector<WorkerRunnable>();
}
public void run() {
synchronized (this) {
this.runningThread = Thread.currentThread();
}
openServerSocket();
while (!isStopped()) {
Socket clientSocket = null;
try {
System.out.println("Serverul asteapta clienti spre conectare");
clientSocket = this.serverSocket.accept();
clientconnection++;
System.out.println("Serverul a acceptat clientul cu numarul:"
+ clientconnection);
// Log.d("Server:","s-a acceptat un nou client");
} catch (IOException e) {
if (isStopped()) {
System.out.println("Server Stopped.");
return;
}
throw new RuntimeException("Error accepting client connection",
e);
}
// creare thread pt noul client conectat
//WorkerRunnable workerRunnable = new WorkerRunnable(clientSocket);
//Thread workerThread = this.threadPool.execute(new WorkerRunnable(clientSocket));
//workerThread.start();
this.threadPool.execute(new WorkerRunnable(clientSocket));
//this.workerList.add(workerRunnable);
}
this.threadPool.shutdown();
System.out.println("Server Stopped.");
}
private synchronized boolean isStopped() {
return this.isStopped;
}
public synchronized void stop() {
this.isStopped = true;
try {
this.serverSocket.close();
// stop thread-uri workers
for (int i = 0; i < this.workerList.size(); i++) {
WorkerRunnable worker = this.workerList.elementAt(i);
worker.stop();
}
} catch (IOException e) {
throw new RuntimeException("Error closing server", e);
}
}
private void openServerSocket() {
try {
InetSocketAddress serverAddr = new InetSocketAddress(SERVERIP,
serverPort);
serverSocket = new ServerSocket();
serverSocket.bind(serverAddr);
} catch (IOException e) {
throw new RuntimeException("Cannot open port 6000", e);
}
}
}
public class WorkerRunnable implements Runnable {
protected Socket clientSocket = null;
Scanner s = null;
String longitude;
String latitude;
boolean stop = false;
public WorkerRunnable(Socket clientSocket) {
this.clientSocket = clientSocket;
}
public void run() {
try {
System.out.println("O noua conexiune acceptata"
+ clientSocket.getInetAddress() + "cu portul"
+ clientSocket.getPort());
Scanner is = new Scanner(new DataInputStream(
this.clientSocket.getInputStream()));
while (!stop) {
while (is.hasNext()) {
try {
longitude = is.next();
latitude = is.next();
System.out.println(longitude);
} catch (Exception e) {
e.printStackTrace();
}
}
}
is.close();
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void stop() {
this.stop = true;
}
Это все, что у меня есть !!!
РЕДАКТИРОВАТЬ: я переместил код ClientThread в другой класс, и мне удалось запустить мой код, но теперь я не могу создать два сокета.
Я имею в виду, что он создает один, но для второго яget:
"Не удалось получить ввод-вывод для подключения к хосту"
Я предполагаю, что это происходит отсюда:
catch (IOException e) {
System.err
.println("Couldn't get I/O for the
connection to host");
}
Кто-то знает, почему?