java - 使用 websocket 制作 android 聊天模块
问题描述
我想在 android 应用程序上制作一个聊天模块。用户和管理员进行简单聊天以进行通信。使用节点 js 的服务器。而客户端使用java-WebSocket-client。
首先,我在节点 js 上创建 Web 套接字服务器。
const Messages = require('./models/index').Messages;
const WebSocketServer = require("ws").Server;
module.exports = (server) => {
const wss = new WebSocketServer({server: server});
wss.on("connection", function (ws) {
console.info("websocket connection open");
ws.on("join", function (userId) {
console.log(userId +" : has joined the chat " );
Messages.findAll({
attributes: ['message', 'roomId', 'senderId','createdAt'],
where: { roomId: userId },
order: [ ['createdAt', 'ASC'] ]
}).then(message => {
ws.send('get_last_messages', message);
});
});
ws.on('message', (data) => {
console.log("websocket received a message");
console.log(data);
ws.on("close", function () {
console.log("websocket connection close");
});
});
console.log("websocket server created");
Android chatActivity(实现“org.java-websocket:Java-WebSocket:1.3.9”):
public class MainActivity extends Activity {
private WebSocketClient mWebSocketClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
connectWebSocket();
}
private void connectWebSocket() {
URI uri;
try {
uri = new URI("ws://websockethost:8080");
} catch (URISyntaxException e) {
e.printStackTrace();
return;
}
mWebSocketClient = new WebSocketClient(uri) {
@Override
public void onOpen(ServerHandshake serverHandshake) {
Log.i("Websocket", "Opened");
mWebSocketClient.send("Hello from " + Build.MANUFACTURER + " " + Build.MODEL);
}
@Override
public void onMessage(String s) {
final String message = s;
runOnUiThread(new Runnable() {
@Override
public void run() {
TextView textView = (TextView)findViewById(R.id.messages);
textView.setText(textView.getText() + "\n" + message);
}
});
}
@Override
public void onClose(int i, String s, boolean b) {
Log.i("Websocket", "Closed " + s);
}
@Override
public void onError(Exception e) {
Log.i("Websocket", "Error " + e.getMessage());
}
};
mWebSocketClient.connect();
}
public void sendMessage(View view) {
EditText editText = (EditText)findViewById(R.id.message);
mWebSocketClient.send(editText.getText().toString());
editText.setText("");
}
但它不起作用。连接关闭。
如何正确创建nodejs websocket服务器和android websocketclient?
解决方案
您需要添加互联网权限AndroidManifest.xml
,看起来您在 MainThread 上进行网络通信。
https://developer.android.com/training/basics/network-ops/connecting
推荐阅读
- clojure - Clojure 空序列行为
- swift - 需要按两次取消按钮才能转到上一个视图控制器
- javascript - 创建 Photoshop 插件 - 尝试在 javascript 函数中找到更简单的源文件方法
- javascript - 导出数组 ReactJS - 错误:数组是只读的
- javascript - 如何将字符串数组复制到对象中
- reactjs - 在 React 应用程序中运行 Jest 测试时错误的表覆盖率
- shell - 如何使用 ImageMagic 清除图像的水印?
- node.js - socket.io 客户端无法从 XHR 长轮询升级到 websocket
- react-native - React-Navigation this.props.navigation.navigate undefined is not an object
- c# - 在 Pythonnet 中运行自述文件