安卓app与阿里云服务器的无线通信(非局域网)

Posted 行稳方能走远

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓app与阿里云服务器的无线通信(非局域网)相关的知识,希望对你有一定的参考价值。

参照:安卓app与阿里云服务器的无线通信(非局域网)
作者:图触靓
发布时间: 2020-08-01 16:13:14
网址:https://blog.csdn.net/bhbhhyg/article/details/107732156

写在阿里云里面的服务器代码:


   
  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include<netinet/in.h>
  4. #include <arpa/inet.h>
  5. #include<stdio.h>
  6. #include<stdlib.h>
  7. #include <unistd.h>
  8. #include<string.h>
  9. #include <sys/types.h>
  10. #include <sys/stat.h>
  11. #include <fcntl.h>
  12. int initsocket(){
  13. int s_fd=socket(AF_INET, SOCK_STREAM, 0);
  14. if (s_fd== -1)
  15. {
  16. perror( "socket");
  17. exit( -1);
  18. }
  19. struct sockaddr_in addr;
  20. memset(&addr, 0, sizeof(struct sockaddr_in));
  21. addr.sin_family=AF_INET;
  22. addr.sin_port=htons( 3389); //端口号,注意要先在网络与安全->安全组中先添加一个端口
  23. inet_aton( "172.23.250.6",&addr.sin_addr); //IP地址,该ip地址要填内网地址!!
  24. // addr.sin_port=htons(atoi(argv[2]));
  25. // inet_aton(argv[1],&addr.sin_addr);
  26. int bid=bind(s_fd,(struct sockaddr *)&addr, sizeof(struct sockaddr_in));
  27. listen(s_fd, 10);
  28. int len= sizeof(struct sockaddr_in);
  29. return s_fd;
  30. }
  31. int main(){
  32. char readbuf[ 2]={ 0};
  33. int s_fd=initsocket(); //初始化服务器
  34. printf( "wait connect.....\\n");
  35. while( 1){
  36. int fd_a=accept(s_fd, NULL, NULL); //该函数用来接受连接,没有连接的时候也可以用来阻塞while(1)
  37. printf( "connect\\n");
  38. memset(readbuf, 0, 2); //初始化字符串
  39. int r=read(fd_a,readbuf, 2); //读指令
  40. if(r== -1)
  41. {
  42. perror( "read");
  43. }
  44. else
  45. {
  46. printf( " cmd is %c \\n",readbuf[ 0]); //打印安卓客户端发来的指令
  47. }
  48. }
  49. return 0;
  50. }

注意!!!:以上ip地址需要填内网的ip,服务器内网ip可以通过ifconfig命令来查看。端口号要先在网络与安全->安全组中先添加

安卓app中发送指令代码:


   
  1. public void sendMessage() {
  2. new Thread( new Runnable() {
  3. @Override
  4. public void run() {
  5. // TODO Auto-generated method stub
  6. try {
  7. Socket client = new Socket( "47.115.9.106", 3389); //注意ip要填你阿里云服务器的外网ip,端口号要在网络与安全->安全组中先添加端口,在到云电脑内把该端口拉入白名单
  8. OutputStream out = client.getOutputStream();
  9. out.write(message.getBytes());
  10. out.close();
  11. client.close();
  12. } catch (Exception e) {
  13. // TODO Auto-generated catch block
  14. e.printStackTrace();
  15. }
  16. }
  17. }).start();
  18. }

拉入防火墙白名单

这里的指令有三个

firewall-cmd --list-all                                              列出所有端口号白名单
firewall-cmd --add-port=8888/tcp --permanent     添加一个8888端口为白名单
firewall-cmd --reload                                             更新防火墙操作

安卓对应按键的写法:(Netuils为一个类,我的发送指令的sendMessage方法是写在类里面的)


   
  1. Button kd=(Button)findViewById(R.id.kd);
  2. kd.setOnClickListener( new OnClickListener() {
  3. @Override
  4. public void onClick(View arg0) {
  5. new NetUtils( "A").sendMessage();
  6. }
  7. });

效果

当我们的安卓手机连接任意的网络,点击按钮后,都能将按键对应的指令发送到云服务器上:

以上是关于安卓app与阿里云服务器的无线通信(非局域网)的主要内容,如果未能解决你的问题,请参考以下文章

树莓派与安卓手机app的WIFI通信(局域网通信)

aria2安卓版设置怎么填

安卓视频播放(阿里云视频点播播放器SDK+SurfaceView)

阿里云通信发布全新号码认证服务, 重新定义手机号码认证的方式

java接受安卓及ios App上传的图片,并保存到阿里OSS

使用socket通信本地电脑与阿里云服务器报错connection time out及解决方案(java语言)