Java传统Socket实例——TimeServer

该实例是基于传统的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,因此当一个客户端接入服务器之后,就将服务器阻塞了,这个时候,其他的客户端即使连入了客户端,也不能实时获取服务,必须之前的客户端的连接被关闭或者其操作完成自动退出,之后其他的客户端才能获取服务:

第一个客户端连入后:

Java传统Socket实例——TimeServer_第1张图片

如果第一个客户端一直不关闭连接,则第二个其他机器的客户端连入后即使操作,也不能获取结果,只有当第一个客户端关闭了,才会有服务,此时第二个服务端的客户端窗口显示(和第一个客户端一样输入了1,2,3,4,5并各有一个回车):

Java传统Socket实例——TimeServer_第2张图片

服务器端的控制栏打印显示:

Java传统Socket实例——TimeServer_第3张图片

只有第一个客户端通过输入quit或者关闭cmd窗口关闭了连接,第二个才能获取服务:

第一个客户端输入quit后的窗口显示:

Java传统Socket实例——TimeServer_第4张图片

此时,的第二个客户端的窗口打印如下:

Java传统Socket实例——TimeServer_第5张图片

服务器端的窗口打印如下:

Java传统Socket实例——TimeServer_第6张图片

有此可见,当使用传统socket编程时,只能通过多个线程来提供实时的多并发访问了,基于NIO的非阻塞socket编程参见MINA 2.0实例——TimeServer。


你可能感兴趣的:(Java传统Socket实例——TimeServer)