我正在Android中开发一个将充当服务器的应用程序,这是,将有一个平板电脑作为“服务器”,并且将有其他平板电脑连接到“服务器”。
我正在尝试将Java NIO与选择器一起使用,以节省线程。但是我的问题是,我让Java代码在android的线程中运行,但是当线程运行时,它什么也没有发生。在客户端,它给出并拒绝连接拒绝。
该代码在Java应用程序中运行,但在android中未运行。
我也有互联网许可。
Java选择器:
Thread t = new Thread(new Runnable() {
private Selector selector;
private ServerSocketChannel sChan;
private List<SocketChannel> sockets;
public void run() {
try {
selector = SelectorProvider.provider().openSelector();
sChan = ServerSocketChannel.open();
InetSocketAddress iaddr = new InetSocketAddress(InetAddress.getLocalHost(), 8000);
sChan.configureBlocking(false);
sChan.socket().bind(iaddr);
System.out.println("Running on port:" + sChan.socket().getLocalPort());
sChan.register(selector, SelectionKey.OP_ACCEPT);
sockets = new LinkedList<SocketChannel>();
}
catch (IOException e) {
e.printStackTrace();
}
Iterator<SelectionKey> it;
try {
while (true) {
selector.select();
it = selector.selectedKeys().iterator();
while (it.hasNext()) {
SelectionKey key = it.next();
it.remove();
if (!key.isValid()) {
continue;
}
// Finish connection in case of an error
if (key.isConnectable()) {
SocketChannel ssc = (SocketChannel) key.channel();
if (ssc.isConnectionPending()) {
ssc.finishConnect();
}
}
if (key.isAcceptable()) {
ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
SocketChannel newClient = ssc.accept();
newClient.configureBlocking(false);
newClient.register(selector, SelectionKey.OP_READ);
sockets.add(newClient);
System.out.println("new client: " + newClient.socket().getInetAddress().getHostAddress());
}
if (key.isReadable()) {
SocketChannel sc = (SocketChannel) key.channel();
ByteBuffer data = ByteBuffer.allocate(sc.socket().getSendBufferSize());
System.out.println("new message: " + sc.socket().getInetAddress().getHostAddress());
if (sc.read(data) == -1) {
continue;
}
data.flip();
Teste m = (Teste) UdpUtil.byteToMessage(data.array());
System.out.println("message: " + m);
System.out.println("\n\n" + m.cenas);
sc.close();
}
}
}
}
catch (IOException e) {
e.printStackTrace();
}
}
});
t.start();
和客户端应用程序:
InetSocketAddress isa = new InetSocketAddress(InetAddress.getByName("192.168.2.102"), 8000);
SocketChannel sc = null;
try {
// Connect
sc = SocketChannel.open();
sc.connect(isa);
// Read the time from the remote host. For simplicity we assume
// that the time comes back to us in a single packet, so that we
// only need to read once.
byte[] message = UdpUtil.messageToByteMessage(new messages.Teste("hello there"));
ByteBuffer buf = ByteBuffer.wrap(message);
sc.write(buf);
}
finally {
// Make sure we close the channel (and hence the socket)
if (sc != null) {
sc.close();
}
}
注意:Teste类只是一个类,将用作android之间的消息。
我什至尝试了这个code,但一切顺利,但是选择器却没有。
我希望我明确指出问题所在。
提前致谢 :)
最佳答案
删除新的InetSocketAddress()的第一个参数,该参数用于绑定ServerSocketChannel。目前,您仅绑定到127.0.0.1,这在其他主机上看不到。通过省略该参数,您将绑定到0.0.0.0,这意味着“在所有接口上监听”。