在java上使用套接字打开两个端口连接
我想在java上使用套接字打开两个端口的连接,但它不起作用。我在这里读到应该使用SocketChannel而不是socket,但是我想使用getInput/outputStream()方法,这在socket通道中是不可能的。我想到了这样的事情:在java上使用套接字打开两个端口连接,java,sockets,Java,Sockets,我想在java上使用套接字打开两个端口的连接,但它不起作用。我在这里读到应该使用SocketChannel而不是socket,但是我想使用getInput/outputStream()方法,这在socket通道中是不可能的。我想到了这样的事情: public class ServeurMaitre { public ServerSocket serverSocket = null; int poolSize = 15; Selector selector = null;
public class ServeurMaitre {
public ServerSocket serverSocket = null;
int poolSize = 15;
Selector selector = null;
private ExecutorService pool = null;
boolean logged=false;
ServeurMaitre(int port1, int port2, int size){
try {
serverSocket = new ServerSocket(port1, size);
serverSocket = new ServerSocket(port2, size);
pool = Executors.newFixedThreadPool(poolSize);
System.out.println("Serveur en marche. En attente des clients");
} catch (IOException ex) {
Logger.getLogger(ServeurMaitre.class.getName()).log(Level.SEVERE, null, ex);
}
}
void ConnexionServeur() throws IOException {
while(true) {
Socket cnx = serverSocket.accept();
if (cnx.getLocalPort()==3333) {
pool.execute(new EsclaveXML(cnx, this));
}
if(cnx.getLocalPort()==8000) {
pool.execute(new EsclaveHTTP(cnx, this));
}
}
}
}
有了这一点:
public class Main{
public static void main(String[] args) throws IOException {
ServeurMaitre serveur = new ServeurMaitre(8000, 3333, 1);
serveur.Initialisation();
serveur.ConnexionServeur();
}
}
这是两个奴隶都在做的事情:
public class EsclaveHTTP implements Runnable{
Socket socket = null;
ServeurMaitre sm = null;
public EsclaveHTTP(Socket cnx, ServeurMaitre serveurMaitre) {
this.socket=cnx;
this.sm=serveurMaitre;
}
@Override
public void run() {
BufferedReader in = null;
PrintWriter out = null;
String message_distant = "";
try {
in = new BufferedReader (new InputStreamReader (socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream());
message_distant = in.readLine();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(message_distant); //etc etc and at the end:
if(!socket.isClosed())
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
第二个呢
public class EsclaveXML implements Runnable{
Socket socket = null;
public EsclaveXML(Socket cnx, ServeurMaitre serveurMaitre) {
this.socket=cnx;
}
@Override
public void run() {
try {
BufferedReader input = new BufferedReader(
new InputStreamReader(socket.getInputStream(), "8859_1"), 1024);
StringBuffer sb = new StringBuffer();
InputStream ch = socket.getInputStream();
//System.out.println(ch);
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse(ch, new ParseurXML());
}catch (DOMException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (TransformerFactoryConfigurationError e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
catch(IOException e) {System.out.println(e);}
finally {
try { if(socket != null) socket.close();}
catch(IOException e) {}
}
}
}
但它只接受一种连接
如何进行某种并行连接?您正在覆盖serverSocket变量
serverSocket = new ServerSocket(port1, size);
serverSocket = new ServerSocket(port2, size);
因此,您只接受第二个连接。您需要两个变量,serverSocket1和serverSocket2,并在这两个变量上调用accept()。您正在覆盖serverSocket变量
serverSocket = new ServerSocket(port1, size);
serverSocket = new ServerSocket(port2, size);
因此,您只接受第二个连接。您需要两个变量,serverSocket1和serverSocket2,并在这两个变量上调用accept()。您的意思是要在客户端和服务器之间建立读/写连接吗?为什么不能用普通的套接字api调用getInputStream和getOutputStream?实际上,目标是让服务器在两个端口上运行*一个接收http连接(来自浏览器)并处理它们,另一个接收来自控制台客户端的xml代码。我将编辑我的帖子,向您展示两个从属服务器都在做什么您的意思是想在客户端和服务器之间建立读/写连接吗?为什么不能用普通的套接字api调用getInputStream和getOutputStream?实际上,目标是让服务器在两个端口上运行*一个接收http连接(来自浏览器)并处理它们,另一个接收来自控制台客户端的xml代码。我将编辑我的帖子,向你展示两个奴隶都在做什么。我如何保证平行接受连接呢?我试过了。但是现在t2似乎在等待t1的执行(t1和t2是两个线程)。我不能同时运行它们吗?@abderramanmrabet:Your
Main
正在调用serveur.ConnexionServeur()
,它只为1个ServerSocket
运行accept()
循环。对于每个ServerSocket
,您需要一个单独的accept()
循环,并且应该在单独的线程中运行这些循环,而不是在主线程中运行。我如何保证连接的并行接受呢?我试过了。但是现在t2似乎在等待t1的执行(t1和t2是两个线程)。我不能同时运行它们吗?@abderramanmrabet:YourMain
正在调用serveur.ConnexionServeur()
,它只为1个ServerSocket
运行accept()
循环。每个ServerSocket
都需要一个单独的accept()
循环,并且应该在单独的线程中运行这些循环,而不是在主线程中运行。