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

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

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

#include <sys/types.h>
#include <sys/socket.h>
#include<netinet/in.h>
#include <arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>
#include<string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int initsocket(){
        int s_fd=socket(AF_INET, SOCK_STREAM,0);
        if (s_fd==-1)
        {
                perror("socket");
                exit(-1);
        }
        struct sockaddr_in addr;
        memset(&addr,0,sizeof(struct sockaddr_in));
 
        addr.sin_family=AF_INET;
        addr.sin_port=htons(3389); //端口号,注意要先在网络与安全->安全组中先添加一个端口
        inet_aton("172.23.250.6",&addr.sin_addr);//IP地址,该ip地址要填内网地址!!
        //        addr.sin_port=htons(atoi(argv[2]));
        //       inet_aton(argv[1],&addr.sin_addr);
        int bid=bind(s_fd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in));
        listen(s_fd,10);
        int len=sizeof(struct sockaddr_in);
        return s_fd;
}
int main(){
        char readbuf[2]={0};
        int s_fd=initsocket();  //初始化服务器
 
        printf("wait connect.....\n");
        while(1){
                int fd_a=accept(s_fd,NULL,NULL); //该函数用来接受连接,没有连接的时候也可以用来阻塞while(1)
                printf("connect\n");
                memset(readbuf,0,2);           //初始化字符串
                int r=read(fd_a,readbuf,2);   //读指令
                if(r==-1)
                {
                        perror("read");
                }
                else
                {
 
                       printf("  cmd is %c \n",readbuf[0]);//打印安卓客户端发来的指令
 
                }
}
 return 0;
}

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

安卓app中发送指令代码:

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

拉入防火墙白名单

这里的指令有三个

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

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

Button kd=(Button)findViewById(R.id.kd);
kd.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
			  new NetUtils("A").sendMessage();
			}
		});

效果

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

  • 1
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值