场景:
要用无线网络传送两种数据到服务器端,前一种数据量很小(一些字符串,小于100byte,数据是随机采集的,两次数据采集的间隔时间为100ms~10s之间),后一种数据量很大(jpeg图片,大于100kb,定时采集),无线网络速度10kb/s左右
要求:
前一种数据的传输要保证实时性(延时不能太大),后一种的数据要在第二次采集之前完成传输
问题:
如何用TCP通信完成以上内容?
目前主要存在的问题就是传送图片要用太长的时间,这样就无法保证那些小数据传输的实时性了
在发送图片数据时,检测到如果有其它数据需要发,则先发送其它数据。
这个思路实现应该不难吧。
按理说,你的图片应该是在一个线程里面发送的,而其他数据在另一个线程,而发送图片时间很长,分包发送必然循环,系统自己会协调好两个线程的时间片,除非你修改了优先级。
不过我并不清楚你的程序框架,说的并不一定就对。毕业论文
你或者可以建立一个发送线程,用一个链表保存所有要发送的数据包,而你其他数据不管是不是图片都添加到链表中,如果是图片分包时一个一个从后面加入,需要及时发送数据插到链表头。这样就能保证。
分1k大小是可以的。然后按照顺序发送,服务器收到直接写文件就可以了,因为tcp是保证先发先到的。
不过你还要设计tcp协议,告诉服务器一些必要信息,如文件名,文件是否传完等等信息。
我把不同数据用不同的数据包发送,但都是包头+包体结构,然后开了3个线程来发送这三种不同大小的数据包,这3个线程都访问应用同一个socket连接,分别每隔20s、2s、1s发送一次数据,为了保证每次都能发送完整的包头和包体,我将这些代码放入一个socket通信临界区,同时,防止一个socket被多个线程使用,造成数据混乱
本来想为了保证数据发送的实时性,将每个线程设置为不同的优先级,但是,如果一个高优先级的线程去抢占一个正处于临界区的低优先级线程,我觉得这样可能发生死锁,因为,低优先级被抢占时,正处于临界区,被抢占后就无法释放临界区资源,而高优先级的线程就要一直等待这个资源
3个线程访问一个socket会有问题。你用2个线程+2个socket就可以了,小数据发送的线程th1,大图片发送的线程th2,优先级设置为th1>th2,th1一直等待发送数据,一有就马上发送。th2将一个大图片分割成很多小数据,比如1K每个,在循环中发送。如果小数据需要发送时,th1应该会马上执行,因为优先级比th2高。th2会暂停一下。等待th1发送完毕后,th2会继续发送。之所以将th2的大图片分割为很多小数据,1是因为大数据发送时,会因为超过MTU而分包,2是,如果一次就发送很大数据,因为发送的调用最终会进入内核,这个时候可能是th1打断不了的。