- 简单一发一收
- 多线程通信:每个server是一个线程,每次调用accept()函数和client形成连接以后,实例化一个线程来处理这个连接,线程start()运行写在线程类中run()方法中的数据传输
- Group chat: 创建一个简单的gui用户界面作为client,client中写入,在server控制台中读取到;广播功能:从一个client收到的一条消息,发给所有已经形成连接的clients,创建一个vector来储存所有的client,每次连接成功以后加入vector。把这个vector传给每一个连接的线程,当收到消息以后,循环vector中的所有成员,用bufferedwriter对象传入数据。在client端,创建一个运行着的线程兼听server传来的消息并输出。
一些bug
- readline()函数本身有阻塞,导致write也不能运行,出现死锁。程序中体现为收不到消息或者close()以后才可以收到。解决:可以单向关闭用socket.shutdownOutput()但是这样之后就不能再write可能不适用;或者可以对readline进行判断,比如写的时候加一个eof标志位或者在判断readline读到的是不是null来进行while循环。
- vector的使用,添加的内容必须是对象,用Enumeration循环的时候,要像ArrayList那样写到Enumeration<对象>这样定义。把enu.nextElement()先提取出来,否则会一直next出现空指针。