【发布时间】: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