我可以通过本机Java.net.socket与使用socket.io的Node js服务器连接Android客户端



我使用node.js and socket.io构建了一个服务器,用于聊天应用程序,我想从使用本机Java.net.socket的Android Client应用程序连接到服务器。我可以做吗?

在这里,我找到了一个可以正常工作的解决方案。此代码部分适用于服务器端套接字。

var net = require('net');
var sockets = [];
var svr = net.createServer(function(sock) {
    console.log('Connected: ' + sock.remoteAddress + ':' + sock.remotePort);
    sockets.push(sock);
    sock.write('Welcome to the server!n');
    sock.on('data', function(data) {
        for (var i=0; i<sockets.length ; i++) {
            if (sockets[i] != sock) {
                if (sockets[i]) {
                    sockets[i].write(data);
                }
            }
        }
    });
    sock.on('end', function() {
        console.log('Disconnected: ' + sock.remoteAddress + ':' + sock.remotePort);
        var idx = sockets.indexOf(sock);
        if (idx != -1) {
            delete sockets[idx];
        }
    });
});
var svraddr = '192.168.0.8';
var svrport = 1234;
svr.listen(svrport, svraddr);
console.log('Server Created at ' + svraddr + ':' + svrport + 'n');

Android客户端代码如下:通过Android客户端连接到服务器的给定IP和端口。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
public class Client {
private Socket socket;
private OutputStream socketOutput;
private BufferedReader socketInput;
private String ip;
private int port;
private ClientCallback listener=null;
public Client(String ip, int port){
    this.ip=ip;
    this.port=port;
}
public void connect(){
    new Thread(new Runnable() {
        @Override
        public void run() {
            socket = new Socket();
            InetSocketAddress socketAddress = new InetSocketAddress(ip, port);
            try {
                socket.connect(socketAddress);
                socketOutput = socket.getOutputStream();
                socketInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                new ReceiveThread().start();
                if(listener!=null)
                    listener.onConnect(socket);
            } catch (IOException e) {
                if(listener!=null)
                    listener.onConnectError(socket, e.getMessage());
            }
        }
    }).start();
}
public void disconnect(){
    try {
        socket.close();
    } catch (IOException e) {
        if(listener!=null)
            listener.onDisconnect(socket, e.getMessage());
    }
}
public void send(String message){
    try {
        socketOutput.write(message.getBytes());
    } catch (IOException e) {
        if(listener!=null)
            listener.onDisconnect(socket, e.getMessage());
    }
}
private class ReceiveThread extends Thread implements Runnable{
    public void run(){
        String message;
        try {
            while((message = socketInput.readLine()) != null) {   // each line must end with a n to be received
                if(listener!=null)
                    listener.onMessage(message);
            }
        } catch (IOException e) {
            if(listener!=null)
                listener.onDisconnect(socket, e.getMessage());
        }
    }
}
public void setClientCallback(ClientCallback listener){
    this.listener=listener;
}
public void removeClientCallback(){
    this.listener=null;
}
public interface ClientCallback {
    void onMessage(String message);
    void onConnect(Socket socket);
    void onDisconnect(Socket socket, String message);
    void onConnectError(Socket socket, String message);
}
}

主动脉是:

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Client socket = new Client("192.168.0.8", 1234);
    socket.setClientCallback(new Client.ClientCallback () {
        @Override
        public void onMessage(String message) {
        }
        @Override
        public void onConnect(Socket socket) {
                socket.send("Hello World!n");
                socket.disconnect();
        }
        @Override
        public void onDisconnect(Socket socket, String message) {
        }
        @Override
        public void onConnectError(Socket socket, String message) {
        }
    });
    socket.connect();
}
}

您问题的答案是no. a java.net.socket不能使用nodejs socket.io连接,因为两者的协议规格都不同。

注意:socket.io不是websocket实现。尽管socket.io确实在可能的情况下将Websocket用作运输,但在需要消息确认时,它为每个数据包添加了一些元数据:数据包类型,名称空间和ACK ID。这就是为什么WebSocket客户端将无法成功连接到socket.io服务器,并且socket.io客户端也无法连接到Websocket服务器(例如ws://echo.websocket.org(。请在此处查看协议规范。

从nodejs socket.io github页面引用。因此,当无法连接到socket.io时,java.net.socket也无法连接。如果您想与Java客户端进行通信,则可以使用socket.io库为Java设计。

在nodejs中,您可以从此示例中使用

和sockect.io博客

在Java中,作为服务器,您可以在非常简单的情况下使用PrintWriterSocket上写入数据。就像端口9090上的打开插座下方一样,并将当前日期发送给客户端:

/**
 * Runs the server.
 */
public static void main(String[] args) throws IOException {
    ServerSocket listener = new ServerSocket(9090);
    try {
        while (true) {
            Socket socket = listener.accept();
            try {
                PrintWriter out =
                    new PrintWriter(socket.getOutputStream(), true);
                out.println(new Date().toString());
            } finally {
                socket.close();
            }
        }
    }
    finally {
        listener.close();
    }
}

代码

最新更新