非阻塞模式开发,6K进展

来源:互联网 发布:深入体验java项目开发 编辑:程序博客网 时间:2024/06/11 14:09

本来一直想在阻塞模式下码一个能够互相聊天的工具出来,

后来看了非阻塞模式的概念才知道,用阻塞模式开发互动的聊天工具是不方便的。

假设你的服务器要等待用户输入,然后将消息发送给客户端,

这时候send()进程就会一直等待你的输入然后发送,这时候线程就阻塞了,

如果客户端此时给你发消息,你处于阻塞状态,客户端就会报错,

服务器没法收到这个信息,聊天也就不从谈起。

 

非阻塞模式开发中讲,要用多线程的思想来解决这个问题,

将新建的socket使用函数(如ioctlsocket(SOCKET))将你新建的套接字转换成非阻塞模式,

这时候,如果你使用一个recv或者send函数的时候,socket会不断的尝试recv和send,

不成功就返回一个WSAEWOULDBLOCK,然后继续尝试;

成功之后就会接受或者发送出数据。

如果你创建了两个线程,一个接收,一个发送,都在不停的尝试收发数据,

就可以实现实时聊天,

当时中间还有很多多线程技术细节需要实现,

书中的实例用了一个类,CClient,还有一些句柄、CreateThread()函数等功能我还不是很清楚,

暂时没能读懂那个例子,当然代码一直在敲,书中代码是一段一段的不完整,有些东西需要你自己补充,

让我有时候编起来有点迷茫,今天争取把客户端敲完了,然后改改错,试着把客户端的原理理解了。

 

今天积累一点小知识,

1.socket报错的时候,SOCKET_ERROR我发现是socket已经new好了之后才会报这个错,

如果你是SOCKET s=socket(2,SOCK_STREAM,0);这时候如果出错,s的值报错为INVALID_SOCKET。

可能是因为socket还没建好,称不上socket error吧。

2.accept函数使用的时候遇到了一点点问题,accept函数第一个参数是要用来监听的socket,第二个参数是如果server接收了某个

client的连接请求,那么client的地址就给了addr,也就是第二个参数,第三个参数是sockaddr_in的长度,类型是int*,

在操作的时候,第三个变量我想用(int*)sizeof(sockaddr_in),但是不行,说没法类型转换,

书上用了两步,int clientLen=sizeof(sockaddr_in);

函数中第三个参数用&sockaddr_in,就可以编译通过了。

 

这两天师兄给我讲了更多的6k的知识,还有些java的背景,

师兄是虔诚的java程序员,讲起java来逸兴遄飞兴高采烈,

我境界不高,还体会不到java到底哪有这么大的魅力。

师兄说,选这个课题,是因为java有前途,是一种应用前景十分广泛的语言,

在嵌入式领域、网络领域都有巨大的市场,嵌入式领域以手持设备居多,java的平台无关性,

使得你写好了一段程序可以在任何装有java运行环境的地方跑,这是有点,

但是platform-independent是建立在牺牲效率和内存的基础上,

java平台无关,所以就要求jvm平台相关,

不同的系统装不同的jvm,将java编译好的class文件翻译成本地系统、本地cpu能够认识的指令集,

指令集有很多,每种处理器可能认识的指令集不一样,于是jvm就有各种版本,

java牺牲了中间件的效率和主机内存,换来了平台无关性,

为了克服效率和内存的问题,我们设计javasoc,使用硬件实现虚拟机,

直接将.class文件通过查表翻译成我们芯片认识的指令集,

当然我们的芯片只认识java程序,其他的东东不能跑,

这样只要是java程序来了,不用装虚拟机,直接可以在我们的芯片上跑。

当然仅仅有个芯片是不够的,你给别人一个芯片,别人也不知道怎么用,

于是我们设计soc,把整个系统都给你搭好了,将时钟、复位、各种外设控制器都给你集成好了,放到芯片里面,

这样你把芯片放到板上就能够跑。

当然前提是你得使用我们提供的java类库,毕竟驱动总得有嘛,驱动是我们用java写的。

 

原创粉丝点击