【问题标题】:conect android(socket client) with c++(socket server) via TCP通过 TCP 将 android(socket 客户端)与 c++(socket server)连接
【发布时间】:2016-03-02 05:17:35
【问题描述】:

我在大学项目中有一个实现要做,但我不知道如何实现它!我的问题就像标题说的那样,通过套接字将 android 与 c++ 连接起来。

c++ 必须至少管理一对套接字客户端(android 设备)或更多。 所以我尝试...

#include <iostream>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<unistd.h>

using namespace std;

int main()
{
    int client, server;
    int portnum = 1500;
    bool isExit = false;
    int bufsize = 1024;
    char buffer[bufsize];

    struct sockaddr_in server_addr;
    socklen_t size;

    //init socekt

    client = socket(AF_INET, SOCK_STREAM, 0);

    if(client < 0){
        cout << "Error Estableciendo la conexion" << endl;
    }

    cout <<"server Socket conexion creada" << endl;

    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htons(INADDR_ANY);
    server_addr.sin_port = htons(portnum);


    //biding soket

    if(bind(client,(struct sockaddr*)&server_addr,sizeof(server_addr)) < 0){
        cout << "Error Biding Socket" << endl;
        exit(1);
    }

    size= sizeof(server_addr);
    cout << "buscando clientes" << endl;

    //escuchando sokets

    listen(client,1);

    //accept client

    server = accept(client, (struct sockaddr*)&server_addr, &size);

    if(server < 0){
        cout<< "Error al Aceptar" << endl;
        exit(1);
    }

    while(server >0){
        strcpy(buffer,"server conectado---\n");
        send(server,buffer,bufsize,0);

        cout <<"conectado con el cliente" << endl;
        cout << "Ingresad # paara terminar la conexion" << endl;

        cout <<"client: ";
        do{
            recv(server,buffer,bufsize,0);
            cout << "buffer" << " ";
            if(*buffer == '#'){
                *buffer = '*';
                isExit=true;
            }
        }while(*buffer != '*');

        do{
            cout << "\n server: ";
            do{
                cin >> buffer;
                send(server,buffer,bufsize,0);
                if(*buffer == '#'){
                    send(server,buffer,bufsize,0);
                    *buffer = '*';
                    isExit=true;
                }
            }while(*buffer != '*');

            cout << "Client: ";

            do{
                recv(server,buffer,bufsize,0);
                cout << buffer << " ";
                if(*buffer == '#'){
                    *buffer = '*';
                    isExit = true;
                }
            }while(*buffer != '*');
        }while(isExit);

        cout << "Conection Terminated..." << endl;
        cout << "Goodbye..." << endl;
        isExit =false;
        exit(1);
    }
    close(client);
    return 0;
}

聆听每一个连接(如果您在我的代码中看到错误的逻辑,请告诉我以及我需要做些什么来修复它)

在 android 中,我在一个类中制作了类似的东西,它从一个活动中调用,仅用于测试......

import java.net.Socket;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Socktest {

    public void prueba() {
        try {
            Socket sock = new Socket("127.0.0.1",1234);

            // Your Java Code Verbatim:
            BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
            String test = br.readLine();

            System.out.println(test);
            sock.close();
        } catch (Exception ex) {
            System.out.println(ex.getCause().toString());
        }
    }
}

(如果您看到错误的逻辑,请告诉我,因为我想从我的失败中学到更多)

当我编译时服务器运行良好,它等待接收一个新的连接,但是当我运行 android 活动并且我运行“连接类”时它说访问被拒绝,我正在使用 linux mint 如果这有影响。 ..

我会很感激你的意见、建议和意见。

【问题讨论】:

  • 看起来您在服务器上将 portnum 设置为 1500,但客户端正在尝试连接到端口 1234。此外,客户端正在尝试连接到 localhost (127.0.0.1),所以除非java代码与服务器在同一台机器上运行,它不会工作
  • Socket sock = new Socket("127.0.0.1",1234); 这行是你的问题,127.0.0.1 是本地环路 IP,它实际上是映射到正在运行的设备的 IP 地址
  • 你的监听套接字叫做client。它不是客户。您正在监听一个端口并尝试连接到另一个端口。
  • sorry iam 新手在这个项目的所有方面,所以我更改了端口号,是的,它们都在同一台机器上,andriod 设备是 android studio 和 c++ 服务器的 nexus 模拟器它在 qt 中编译,我不知道是否有影响。

标签: java android c++ sockets tcp


【解决方案1】:

Socket sock = new Socket("127.0.0.1",1234); 这行是你的问题,127.0.0.1 是本地循环 IP,它实际上是一个映射到代码所在设备的 IP 地址,所以你的 android 客户端永远不会连接到c++ 代码正在运行,您需要做的是找到运行 c++ 代码的机器的 IP 地址,然后将 127.0.0.1 更改为该 IP 地址。

如果你的手机连接到你的c++服务器所连接的wifi路由器,那么这个IP地址就是本地IP地址,一切都很简单

如果您的移动设备连接到某个移动网络,并且您的服务器位于不同的网络上,那么您需要找出暴露给世界的计算机的 IP 地址(取决于您可能拥有的 Internet 服务提供商配置)保持静态的 IP 地址,或每次与 ISP 服务器的连接重置时都会更改的 IP 地址) 您可以通过访问 http://whatismyipaddress.com/ 之类的网站找到您的机器暴露的 IP 地址,然后如果您的机器位于路由器后面,您需要进行端口转发(在这种情况下,将您的端口 1234 转发到您的机器本地 IP 地址)你可以查看this guide 了解如何操作。

因此,为了避免第二步的复杂性,我建议您使用 wifi 路由器将您的手机和服务器连接在同一本地网络(即您的 LAN)中。

查找机器IP地址的方法:

在基于 linux 的机器中,只需打开终端并输入 ifconfig 并查看 eth0,您的 IP 地址将在 inet addr: 之后,例如像这样 inet addr:10.99.123.23

【讨论】:

  • 好吧,我忘了提到我正在运行 android studio 中的 nexus 虚拟模拟器来进行连接,我不知道这是否会影响任何事情?和 c++ ide 它的 qhre 我正在运行 c++ 套接字服务器它的 Qtcreator ......它们都在 linux mint 的同一台电脑上
  • @EdwinAguilar 是的,这意味着它们都是通过 LAN 协议连接的,所以请执行第 1 步
  • 我试过了,但没有任何效果。我的 android 连接到 pi 的 wifi 网络。在 Android 应用程序中,套接字是这样创建的:Socket sock = new Socket("ip of the pi", 1500); 我没有收到任何东西;服务器甚至没有检测到新的客户端。你有什么想法吗?
  • @Maxouille 创建一个不同的问题,显示您的尝试。
猜你喜欢
  • 2016-09-15
  • 1970-01-01
  • 2016-03-31
  • 1970-01-01
  • 2017-09-27
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
相关资源
最近更新 更多