Android应用程序使用Socket.io连接到Node.js服务器

我无法让我的Android应用程序连接到socket.io聊天服务器。我正在使用由Gottox创建的socket.io-java-

client,可以在这里找到:https :

//github.com/Gottox/socket.io-java-

client

服务器在端口7000上本地运行。我使用的是Android模拟器,因此我使用的是10.0.2.2:7000来访问服务器。

任何帮助将不胜感激,我对SSL没有任何经验。如果找到有效的解决方案,我也会将其发布。

var express = require('express');

var app = express();

var server = require('http').createServer(app).listen(7000);

var io = require('socket.io').listen(server);

io.sockets.on('connection', function(client){

client.on('message', function(err, msg){

client.broadcast.emit('message', msg);

});

});

{

"name": "simplechat",

"version": "0.0.1",

"main": "app.js",

"dependencies": {

"express" : "~4.0.0",

"socket.io" : "~0.9.13"

}

}

public class SendMessageActivity extends Activity {

private static final String SERVER_ADDRESS = "https://10.0.2.2:7000";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_send_message);

System.out.println("Sever: " + SERVER_ADDRESS);

try {

SocketIO socket = new SocketIO(new URL(SERVER_ADDRESS), new IOCallback() {

@Override

public void onDisconnect() {

System.out.println("disconnected");

}

@Override

public void onConnect() {

System.out.println("connected");

}

@Override

public void onMessage(String s, IOAcknowledge ioAcknowledge) {

}

@Override

public void onMessage(JSONObject jsonObject, IOAcknowledge ioAcknowledge) {

}

@Override

public void on(String event, IOAcknowledge ioAcknowledge, Object... objects) {

}

@Override

public void onError(SocketIOException e) {

e.printStackTrace();

}

});

} catch (MalformedURLException ex) {

ex.printStackTrace();

}

}

<uses-permission

android:name="android.permission.INTERNET">

</uses-permission>

08-09 16:07:28.224    8411-8441/com.example.puma.chatexample W/System.err﹕ io.socket.SocketIOException: Error while handshaking

08-09 16:07:28.225 8411-8441/com.example.puma.chatexample W/System.err﹕ at io.socket.IOConnection.handshake(IOConnection.java:322)

08-09 16:07:28.225 8411-8441/com.example.puma.chatexample W/System.err﹕ at io.socket.IOConnection.access$600(IOConnection.java:39)

08-09 16:07:28.225 8411-8441/com.example.puma.chatexample W/System.err﹕ at io.socket.IOConnection$ConnectThread.run(IOConnection.java:199)

08-09 16:07:28.226 8411-8441/com.example.puma.chatexample W/System.err﹕ Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'javax.net.ssl.SSLSocketFactory javax.net.ssl.SSLContext.getSocketFactory()' on a null object reference

08-09 16:07:28.226 8411-8441/com.example.puma.chatexample W/System.err﹕ at io.socket.IOConnection.handshake(IOConnection.java:302)

08-09 16:07:28.227 8411-8441/com.example.puma.chatexample W/System.err﹕ ... 2 more

回答:

我实际上解决了问题。我使用了PC的本地IP

http://192.168.0.xxx:7000,该应用程序能够从模拟器连接到聊天服务器。我不知道为什么会这样,但是将来可能会对某人有所帮助:)

这就是我最终构造项目的方式。我创建了一个singleton类来处理Android端的套接字连接(您也可以将其作为服务来完成)。收到消息时,单例类向其他应用程序广播一个意图。然后由广播接收者在相关活动中获取意图。

public class SocketSingleton {

private static SocketSingleton instance;

private static final String SERVER_ADDRESS = "http://1.2.3.4:1234";

private SocketIO socket;

private Context context;

public static SocketSingleton get(Context context){

if(instance == null){

instance = getSync(context);

}

instance.context = context;

return instance;

}

public static synchronized SocketSingleton getSync(Context context){

if (instance == null) {

instance = new SocketSingleton(context);

}

return instance;

}

public SocketIO getSocket(){

return this.socket;

}

private SocketSingleton(Context context){

this.context = context;

this.socket = getChatServerSocket();

this.friends = new ArrayList<Friend>();

}

private SocketIO getChatServerSocket(){

try {

SocketIO socket = new SocketIO(new URL(SERVER_ADDRESS), new IOCallback() {

@Override

public void onDisconnect() {

System.out.println("disconnected");

}

@Override

public void onConnect() {

System.out.println("connected");

}

@Override

public void on(String event, IOAcknowledge ioAcknowledge, Object... objects) {

if (event.equals("chatMessage")) {

JSONObject json = (JSONObject) objects[0];

ChatMessage chatMessage = new ChatMessage(json);

Intent intent = new Intent();

intent.setAction("newChatMessage");

intent.putExtra("chatMessage", chatMessage);

context.sendBroadcast(intent);

}

}

@Override

public void onError(SocketIOException e) {

e.printStackTrace();

}

});

return socket;

} catch (MalformedURLException ex) {

ex.printStackTrace();

}

return null;

}

}

public class ChatActivity extends Activity {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_chat);

IntentFilter newChatMessageFilter = new IntentFilter("newChatMessage");

this.registerReceiver(new MessageReceiver(), newChatMessageFilter);

...

public class MessageReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent){

final ChatMessage chatMessage =(ChatMessage) intent.getExtras().get("chatMessage");

runOnUiThread(new Runnable() {

@Override

public void run() {

mAdapter.add(chatMessage);

mAdapter.notifyDataSetChanged();

}

});

}

}

}

var express = require('express');

var app = express();

var server = require('http').createServer(app).listen(1234);

var io = require('socket.io').listen(server);

io.sockets.on('connection', function(client){

console.log("client connected: " + client.id);

client.on("sendTo", function(chatMessage){

console.log("Message From: " + chatMessage.fromName);

console.log("Message To: " + chatMessage.toName);

io.sockets.socket(chatMessage.toClientID).emit("chatMessage", {"fromName" : chatMessage.fromName,

"toName" : chatMessage.toName,

"toClientID" : chatMessage.toClientID,

"msg" : chatMessage.msg});

});

});

以上是 Android应用程序使用Socket.io连接到Node.js服务器 的全部内容, 来源链接: utcz.com/qa/422240.html

回到顶部