我想写一个类似的QQ的程序,通讯方式用TCP/IP 好还是用UDP好.另外如果用TCP/IP的话建立好连接之后,服务器或客户端向输入流写入数据一般通过什么方法通知对方接收数据呢.

解决方案 »

  1.   

    qq是通过udp来实现的,而msn是用tcp/ip实现的。。你自己衡量一下吧。。udp连接不可靠。
      

  2.   

    晕倒!建议你还是翻一下你的教课书吧!后面的部分一般都会有的!
    java的socket套接字,流是线程阻塞式的。也就是接收端只需要对流进行while循环读取,直到报错(连接终端时,流会抛异常),它会一直试图读取,如果流内无信息,她会阻塞在read语句。直到对端发来信息,底层硬件会发出相应的中断,唤醒阻塞进程,进行读取。通常是对缓冲池进行put操作,就会导致流被唤醒进行激活!唤醒流是内部自动实现的。TCP和UDP写法差不多,不过聊天程序建议使用UDP,开销小,不过建议你每次都要确认对端收到后给个回应。没有收到回应,就继续发送一遍消息!这样防止UDP丢包,UDP丢包是常有的。TCP呢,是连接开销比较大。而且你要是一直连着,它会一直占一个端口,会不太好!
      

  3.   

        谢谢天堂草大哥,我确实看过教材,但是think in java 和一本N厚N多教授编委的外国教材中的io和net的相关章节都没有提到流是线程阻塞的,讲io的时候都是从文件读取.讲net的时候都是一边发一个一边接一个,根本没有体现出这个特性.当初我选udp也是出于这个方面的考虑,不过我发现我机器上没有udp协议.我曾经考虑过用rmi包但是他不符合QQ的通讯特性.最后只好硬着头皮用tcp,think in java 中net一章中有个程序是一个无限的while循环里边是readline(),我还特地作了个实验在一个线程里开一个无限的循环(但是里边是i+=1;...)结果一跑起来差点死机,当时我就隐隐约约感觉到应该有一种机制能实现发送方和接受方的同步,但是我学编程时间太短了前几天才知道有线程阻塞这么一个说法,没有往这方面想.也怪我做事太毛躁可能稍微细心一点就能得到答案.天堂草大哥一席话让我茅塞顿开阿,真是万分感谢,不再有顾虑了.通讯就采用ObjectXXStream,程序马上就能出来(XX.readObject()也是线程阻塞的吧,别告诉他例外那样的话我就哭了).
        还有一个问题,就是这个udp协议是怎么加上去的,网络属性中看不到阿,是不是包含在tcp中的,还是包含在用到udp协议的程序中的.
        如果udp协议的问题解决了我还是要用udp,我原来设想的是土方法编码就是字节包前2位代表什么服务3,4位代表分几段等等,现在看来这么想太愚昧了.后来知道了xml,我想通过udp发送xml应该能做到吧.
      

  4.   

    当一切都建立好之后(骨架类,占位类一切都ok了就是已经得到远程类的对象的时候)把本地类的对象通过远程类的方法的参数传递过去使远程对象可以操作本地对象.举个例子我可不可以把QQ面版的Panel对象传递过去然后让服务器上的对象操作.
      

  5.   

    (看这个别看楼上)
    我还有一个疑问,当我用rmi包的时候当一切都建立好之后(骨架类,占位类一切都ok了就是已经得到远程类的对象的时候)把本地类的对象通过远程类的方法的参数传递过去使远程对象可以操作本地对象. 举个例子我可不可以把QQ面版的Panel对象传递过去然后让服务器上的对象操作. 
      

  6.   

    其实java 1.4以后就有两种socket的了,一种是传统的socket也就是我们说的堵塞的socket,还有一种是无堵塞的socket可以使用很少的线程完成大量的处理(虽然说java实现的很晚),我觉得具体还是看你自己的实现方式啦
      

  7.   

    无阻塞的socket对收发同步很难控制阿.