几天调的代码,其实技术上算不上突破或者改进,不过思想或者是思维上有所提高。至少常sir给的解释还是那么的清晰,赞一个常sir!
今天写的代码是这样的,写的是传输一个文件(这个文件很大,比如在20M以上),用TCP传输,从服务器传到客户端。其实这个跟我昨天写的那个差不多,但是关键就在于自己的思路不清晰,导致出了问题,然后很郁闷的调啊调。回头看一下其实自己真的正如常sir所说:思路很混乱。
其实面对这个问题,很简单,就是建立一个socket链接,再打开这个文件,然后read,比如每次2048个字节(char类型的是一个字节,而整型的是4个字节),然后就是send当传送的数据少于2048时表示,已经传到末尾了,把这传完就算结束了。
我出的问题是这里,直接上代码:(这个是服务器端的代码,里面有问题)
里面的问题主要集中在自己的逻辑很乱:
1.首先这个do while语句就显得我很业余:我当初这样用是想着到最后的一次传送时数据会少于2048,我就想着要多发送一次。其实不用这样,常sir的帮助下,首先不是非要在y==2048的时候才循环,y代表的是发送的数据量,应该是只要有数据(即y大于0,就发送)。
2.在那个send函数里面的2048,代表的是这次是要发送的总量,这里应该是读了多少数据就发多少数据,因此这里应该是y,并且应该先读,在send。
3.那里的seek函数的作用没有起到,因为read函数读完之后的指针位置,读完之后就没有变,因此不用调指针的位置。从那个代码中也可以看到:与当前位置的偏移为0,,什么也不偏,其实没有作用;
正确的代码是:
客户端的错误也是这样:
其中错误也是很明显
1.y==2048,是错的,判断条件应为y>0;
2.在write函数里面应该是接收了多少就写入多少,即write(buff,y)。
3.seek函数没有起到作用,因为每个循环,指针就在最后面.
4.这里的flush函数,作用是每次循环就写入磁盘,其实在这个里面不用这样,不用每次都保存。让函数在缓存满的时候再写入,也行,在close函数的时候,也会写入的。
应该这样写:
~~~~~~~~~
下面是搞清了int和char类型互转的问题。
char类型存的也是数字,只不过是通过ascii码,然后可以输出成各种字符。
从char类型专程int类型其中内存中的数字是不变的,转成的数字还是那个;
例如:char a='0'//0的ascii码是0x30,即十进制的48
int b=(int)a; 这时候b应为48
另一种情况
char a=0;//这里传给a的就是0ascii码也是0,即在内存中就是0x00
转为整型的时候就是0
~~~~~~~
今天还是有所收获的,明天继续。
今天想着周二老师可能会过来,但是自己还是多虑了。我感觉以后就大胆的过去,老师有事的话会找我的。