通过TCP与c ++(套接字服务器)连接android(套接字客户端)

时间:2016-03-02 05:17:36

标签: java android c++ sockets tcp

我在大学项目中有一个实现,我不知道如何实现它!我的问题就像标题所说的那样,通过套接字将c ++与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());
        }
    }
}

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

当我编译时,服务器正常运行,它常常会重新启动一个新的连接,但是当一个机器人运行时,我会运行&#34;连接类&#34;它说访问被拒绝,我正在研究linux mint如果那个感觉......

我将会感激你的建议和建议。

1 个答案:

答案 0 :(得分:0)

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查看inet addr:您的IP地址将在inet addr:10.99.123.23之后,例如{{1}}