您的位置:首页 > 理论基础 > 计算机网络

服务器socket与安卓端socket对接

2015-12-18 22:43 471 查看
本周继续进行智慧办公室项目的网络环境搭建,主要完成的功能有:

1.读取文件信息,写入socket发送到安卓客户端

2.接收安卓客户端的灯光控制信息,写入文件储存,然后将新的状态信息返回给安卓客户端用于更新UI

3.解决了socket接收到的字符串数组内存泄露bug

智慧办公室的项目接手到现在,本来我是负责底层的驱动开发,但是由于原来网络传输数据处理的方式太过不妥,于是我就按照自己的意愿往下折腾,还真的折腾出很多问题,这可真的很难为我这个本来就对网络传输不太擅长的家伙,因为一开始接触的网络传输协议是TCP/IP协议,也写过能够互相通信的C/S模式demo,所以我就选择了自己相对擅长的socket来进行网关到服务器的数据链路搭建,本来点对点传输的确比较简单方便,但是整个项目又不是只要传输一次数据,就不得不使用多线程的方式在程序中创建多个socket来分别完成不同的连接任务,一个用来接收客户端连接发送传感器状态信息,一个用来接收客户端控制命令,改写服务器文本内容,还有一个就用来读取文件内容,向开发板发送灯光控制指令,看起来比较简单,但是一旦和安卓端配合不好,就可能遇到无法连接、发送错误、接收错误、客户端闪退、服务器卡死等各种问题,这些问题在这个星期集中爆发了,不过我和安卓端的小学弟还是一个个地解决了问题,怎么解决的呢,以下就是思路参考,由于不想让同行以及大师看到我稚嫩的编码风格,所以我就不贴代码,大致说下思路,欢迎看的人拍砖交流~

1.读取文件,我习惯使用fopen(),fscanf(),fprintf(),组合,原因之一就是因为它们长相友好,很像初学C时经常用的scanf()和printf()函数,使用方法也很简单,参考百度百科,这里我就不用展开说了,主要是在将得到的数据保存返回的时候遇到了一些问题,开始学C的时候就对字符串的处理很迷糊,做到这儿也遇到了一些问题,不过主要是指针没理解透彻,我用的方法是——在函数中打开文件读取内容,函数的参数是一个字符型数组首地址,将内容全部拼接为一个长字符串,最后strcpy()一下,这样传进来的字符数组参数就被改变了,然后在主程序中将字符串用socket
 的send()函数发送出去,比较简单,然后接收就不是我要做的事了。

2.然后接收安卓客户端的数据就更简单了,因为我们约定了数据的格式,就是101010这样的字符串数组,表示四个灯和门窗的状态,我接收到之后就会用上面的方法写入文件,然后第二行代码就是用send()函数将客户端发给我的内容返回给他,但是我认为这个返回不是很有必要,因为他已经知道了我要改变成什么样子,他就直接更新灯光状态就可以了,完全可以不用我的返回数据。

3.在初学C语言指针的时候,一不留神把指针用错了,就会在指针上输出好多个“烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫”,第一次看到的时候真是笑死了,可是后来被它纠缠了好久,然后就着手解决,我们一般遇到这种情况很多时候是因为数组越界,或者输出未初始化指针,主要表现为,你声明了一个10个元素的字符数组,只给它赋值了五个字符,那么未初始化的内存空间就是烫了~就像下面这样

#include<stdio.h>
int main()
{

char s[50];

s[0]='s';

s[1]='s';

s[2]='s';

s[3]='s';

s[4]='s';

printf("%s\n",s);

return 0;
}



如果直接声明字符指针,程序就会直接停止运行,所以指针不能滥用~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tcp socket 开发 网络