[英]conect android(socket client) with c++(socket server) via TCP
我有一个大学项目要做的实现,我不知道该怎么做! 我的问题就好像标题说的那样,通过套接字用c ++连接android。
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上工作...
我将对您的评论,建议和意见感到满意。
Socket sock = new Socket("127.0.0.1",1234);
这行是您的问题所在, 127.0.0.1
是本地循环IP,它实际上是一个IP地址,该IP地址映射到代码所在的设备,因此您的android客户端永远不会连接到运行c ++代码的计算机,您需要做的是找到正在运行c ++代码的计算机的IP地址,然后将127.0.0.1
更改为该IP地址。
如果您的手机已连接到与c ++服务器相连的wifi路由器,则此IP地址将是本地IP地址,一切都很简单
如果您的移动设备已连接到某个移动网络,并且您的服务器位于其他网络上,则需要找出暴露给外界的计算机的IP地址(取决于Internet服务提供商的配置,您可能拥有IP地址保持静态,或者IP地址在每次与ISP服务器的连接每次重置时都会更改)。您可以通过访问http://whatismyipaddress.com/等网站来查找计算机的IP地址,如果您的计算机位于路由器后面, ,您需要进行端口转发(在这种情况下,将端口1234
转发到计算机的本地IP地址),您可以查看本指南以了解如何执行此操作。
因此,为避免第二步的复杂性,我建议您使用wifi路由器将移动设备和服务器连接到同一局域网(即LAN)中。
查找机器IP地址的方法:
在基于Linux的计算机上,只需打开一个终端并输入ifconfig
并查看eth0
您的IP地址将在inet addr:
,例如这样的inet addr:10.99.123.23
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.