gpt4 book ai didi

android - 有人成功地为 Android 实现了 WebSocket 服务器吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:27:37 28 4
gpt4 key购买 nike

我正在尝试在同一台 Android 设备上同时实现 WebSocket 客户端和 WebSocket 服务器。基本上我有两个需要通信的 Android 应用程序。我已经成功地使用 LocalSockets 实现了几个测试应用程序,但目标客户端应用程序是一个网络浏览器应用程序,因此它只能使用 WebSockets。

我试过 https://github.com/TooTallNate/Java-WebSocket执行。我的客户端应用程序在前台运行,服务器应用程序在后台的 Android 服务中运行。本质上,我采用了我的 LocalSocket 实现,并将 LocalSockets 替换为 TooTallNate 的 WebSockets。 WebSocket 服务器似乎无法启动。明显的症状是客户端每次尝试发送内容时都会抛出 NotYetConnectedException。

另一个症状是,如果我尝试使用 WebSocketServer.run() 而不是 WebSocketServer.start(),我会从 ServerSocketChannel.open() 得到一个 IOException。

此时当然欢迎任何想法。谢谢!

最佳答案

一个基本的实现是这样的:

public class ChatServer extends WebSocketServer
{
private final String TAG = LogHelper.makeLogTag(ChatServer.class);

private Map<String, WebSocket> clients = new ConcurrentHashMap<>();

public ChatServer(int port)
{
super(new InetSocketAddress(port));
}

public ChatServer(InetSocketAddress address)
{
super(address);
}

@Override
public void onOpen(WebSocket conn, ClientHandshake handshake) {
String uniqueID = UUID.randomUUID().toString();
clients.put(uniqueID, conn);

conn.send(WrapHelper.regToJson(uniqueID));
conn.send(WrapHelper.resToJson("Welcome to the server!"));


broadcast((WrapHelper.resToJson("new connection: " + handshake.getResourceDescriptor()))); //This method sends a message to all clients connected
LogHelper.e(TAG, conn.getRemoteSocketAddress().getAddress().getHostAddress() + " entered the room!");
}

@Override
public void onClose(WebSocket conn, int code, String reason, boolean remote) {
broadcast(WrapHelper.resToJson(conn + " has left the room!"));
LogHelper.e(TAG, conn + " has left the room!");
}

@Override
public void onMessage(WebSocket conn, String message) {
Gson gson = new Gson();
final Frame frame = gson.fromJson(message, Frame.class);
if (frame != null) {
LogHelper.e(TAG, "frame: " + frame);

switch (frame.getCmd()) {
case CMD_MSG:
broadcast(message);

break;

case CMD_REG_USER:

break;
}
}
LogHelper.e(TAG, conn + ": " + message);
}

@Override
public void onMessage(WebSocket conn, ByteBuffer message) {
broadcast(message.array());
LogHelper.e(TAG, conn + ": " + message);
}

@Override
public void onError(WebSocket conn, Exception ex)
{
ex.printStackTrace();
if (conn != null) {
// some errors like port binding failed may not be assignable to a specific websocket
}
}

@Override
public void onStart()
{
LogHelper.e(TAG, "Server started!");
setConnectionLostTimeout(0);
setConnectionLostTimeout(100);
}
}

在此示例中,您可以看到我们正在覆盖 WebSocketServer 类的抽象方法。您可以创建一个界面来更新您的 UI。

然后在你的主要 Activity 中你可以像这样使用它:

@Override
protected void onCreate(Bundle savedInstanceState)
{
...

ChatServer server = new ChatServer(DEFAULT_CHAT_PORT);
server.start();

...
}

我有一个 chat sample here. 的完整实现

关于android - 有人成功地为 Android 实现了 WebSocket 服务器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16638927/

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