java - 如何使用 Socket.IO-client Java 将 String 消息从 Android 发送到服务器?

标签 java android sockets socket.io

我使用 socket.io-client-java图书馆

我有安卓客户端和Java服务器

服务器代码:

public class Server {
public static void main(String[] args) throws IOException {
    System.out.println("Welcome to Server side");
    BufferedReader in = null;
    PrintWriter out = null;

    ServerSocket servers = null;
    Socket fromclient = null;

    // create server socket
    try {
        servers = new ServerSocket(4444);
    } catch (IOException e) {
        System.out.println("Couldn't listen to port 4444");
        System.exit(-1);
    }

    try {
        System.out.print("Waiting for a client...");
        fromclient = servers.accept();
        System.out.println("Client connected");
    } catch (IOException e) {
        System.out.println("Can't accept");
        System.exit(-1);
    }

    in = new BufferedReader(new
            InputStreamReader(fromclient.getInputStream()));
    out = new PrintWriter(fromclient.getOutputStream(), true);
    String input, output;

    System.out.println("Wait for messages");
    while ((input = in.readLine()) != null) {
        if (input.equalsIgnoreCase("exit")) break;
        out.println("S ::: " + input);
        System.out.println(input);
    }
    out.close();
    in.close();
    fromclient.close();
    servers.close();
}
}

和客户:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Socket mSocket = null;
private Button button;

    {
    try {
        mSocket = IO.socket(Constants.CHAT_SERVER_URL);
    } catch (URISyntaxException e) {
        throw new RuntimeException(e);
    }
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    button = (Button) findViewById(R.id.button);
    button.setOnClickListener(this);
    mSocket.connect();
}

@Override
public void onClick(View v) {
    if (v.getId() == R.id.button){
        mSocket.emit("new message", "Some message");
    }
}
}

如果我尝试连接到服务器,我会得到:

Welcome to Server side
Waiting for a client...Client connected
Wait for messages
GET /socket.io/?EIO=3&transport=polling HTTP/1.1
User-Agent: Dalvik/1.4.0 (Linux; U; Android 2.3.7; Android SDK built for x86 Build/GINGERBREAD)
Host: 10.0.2.2:4444
Connection: Keep-Alive
Accept-Encoding: gzip

但是当我尝试发送字符串消息时

mSocket.emit("new message", "Some message");

没有任何反应。我发错了还是服务器有问题?

最佳答案

要正确初始化 socket.io 客户端,您需要执行如下操作:

  Socket _socket = IO.socket(SERVER_URI);
        _socket.on(Socket.EVENT_CONNECT, _onConnectionListener)
                .on(Socket.EVENT_DISCONNECT, _onDisconnectListener)
                .on(Socket.EVENT_CONNECT_ERROR, _onConnectionErrorListener)
                .on(Socket.EVENT_MESSAGE, _onMessageReceivedListener)
                .on(CHAT_MESSAGE_PUBLISH, _onMessageReceivedListener);

每个监听器在事件发生时运行,例如:

private Emitter.Listener _onMessageReceivedListener = new Emitter.Listener() {
    @Override
    public void call(Object... args) {

        JSONArray jsonArray = (JSONArray) args[0];
        if (jsonArray != null && jsonArray.length() > 0) {
            Gson gson = new Gson();

            List<MessageModel> historyList = gson.fromJson(jsonArray.toString(), listType);
            loadReceivedMessage(historyList);

            chatLoging(jsonArray.toString());
        }
    }
};

call() 方法将在您从服务器接收到新消息时触发。

关于java - 如何使用 Socket.IO-client Java 将 String 消息从 Android 发送到服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32817408/

相关文章:

c - 如何处理 Hook 的 WSARecv

java - Android 相机预览 byte[] 到 Java 图片

java - 直接访问数组的一部分

android - 监听器映射标记外的触摸

android - 如何从 Android Lollipop 中的 URI 获取图像的文件路径?

c - Socket C 同时处理 recv() 和 send()

java - 使用mockito在TestFx中模拟FileChooser

java - JAI 将 Alpha channel 添加到 RenderedImage

java - 我需要有关获取发布和调试证书指纹的帮助

检查 UDP 端口是否已在 C 中打开