该实例是基于传统的ServerSocket和Socket来写的,因此使用的是也是传统的BIO(Blocking IO),并发的时候都是通过阻塞的方式来处理的,该实例是和MINA 2.0实例——TimeServer对应的,采用单线程通过循环来提供并发访问,以更好的反应BIO和NIO的区别,代码如下:
import java.io.DataInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
public class SocketTimeServer {
public static void main(String args[]){
try{
ServerSocket serverSocket = new ServerSocket(60001);
while(true){
Socket ss = serverSocket.accept();
String client = ss.getRemoteSocketAddress().toString();
System.out.println("开启一个客户端连接" + client);
PrintStream ss_out = new PrintStream(ss.getOutputStream());
String temp = null;
do{
DataInputStream ss_in = new DataInputStream(ss.getInputStream());
temp = ss_in.readLine();
if(temp!=null && "quit".equals(temp.trim().toLowerCase())){
ss.close();
System.out.println("关闭一个客户端连接"+client);
break;
}
System.out.println("MESSAGE ”" + temp + "“ FROM: " + client);
ss_out.println("Server Time: "+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(System.currentTimeMillis()));
}while(temp!=null);
}
}catch(IOException e){
e.printStackTrace();
}
}
}
测试方法同MINA 2.0实例——TimeServer:
直接编译执行该类,则启动了服务器,端口是60001。客户端使用最简单的,windows下使用cmd进入控制台(Windows 7默认没有开启该客户端,需要通过“控制面板->程序->程序和功能->打开或关闭Windows功能”,选择“Telnet服务器”和“Telnet客户端”来安装),通过“telnet 127.0.0.1 60001”访问服务器,然后随便输入或者不输入内容,点击回车,即可连接到服务器获取服务器端的时间,而服务器端也可以打印出监控到的客户端的地址;这里可以多开几个cmd窗口,通过telnet进行连接,可以发现不同的窗口对于服务器来说是不同的session。本例在本机和另外一台机器上各开启了一个来进行测试,和MINA不同的是,本实例由于是传统的Socket,因此当一个客户端接入服务器之后,就将服务器阻塞了,这个时候,其他的客户端即使连入了客户端,也不能实时获取服务,必须之前的客户端的连接被关闭或者其操作完成自动退出,之后其他的客户端才能获取服务:
第一个客户端连入后:
如果第一个客户端一直不关闭连接,则第二个其他机器的客户端连入后即使操作,也不能获取结果,只有当第一个客户端关闭了,才会有服务,此时第二个服务端的客户端窗口显示(和第一个客户端一样输入了1,2,3,4,5并各有一个回车):

服务器端的控制栏打印显示:
只有第一个客户端通过输入quit或者关闭cmd窗口关闭了连接,第二个才能获取服务:
第一个客户端输入quit后的窗口显示:
此时,的第二个客户端的窗口打印如下:
服务器端的窗口打印如下:
有此可见,当使用传统socket编程时,只能通过多个线程来提供实时的多并发访问了,基于NIO的非阻塞socket编程参见MINA 2.0实例——TimeServer。