gpt4 book ai didi

Android 中带有选择器的 Java TCP 服务器 NIO

转载 作者:行者123 更新时间:2023-12-02 07:41:37 24 4
gpt4 key购买 nike

我正在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类只是一个将用作机器人之间消息的类。

我什至尝试过这个code一切都很顺利,但选择器却不然。我希望我能清楚地说明问题所在。

提前致谢:)

最佳答案

删除 new InetSocketAddress() 的第一个参数,即用于绑定(bind) ServerSocketChannel 的参数。目前您仅绑定(bind)到127.0.0.1,其他主机无法看到该地址。通过省略参数,您将绑定(bind)到 0.0.0.0,这意味着“监听所有接口(interface)”。

关于Android 中带有选择器的 Java TCP 服务器 NIO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11509909/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com