⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timeservice.java

📁 用FLASH和JAVA制作一个实时同步的时钟
💻 JAVA
字号:
import java.net.*;
import java.io.*;

import org.quickserver.net.server.ClientCommandHandler;
import org.quickserver.net.server.ClientHandler;
/*
 * 	TimeService主要是实现QuickServer的ClientCommandHandler接口
 * 	然后在QuickServier的实例中将它绑定到一个端口就可以完成网络服务了
 */
public class TimeService implements ClientCommandHandler {
	//SerMem是一个内部类,他是一个子线程,用来实现循环发送时间到客户端
	//内部类的代码在TimeService类的下面
	SerMem sm;
	
	//这个方法是当与客户端建立Socket连接后自动调用的
	//ClientHandler这个对象是来操作客户端socket的句柄,被QuickServer封装过
	public void gotConnected(ClientHandler handler)
			throws SocketTimeoutException, IOException {
		//在控制台输出当前连接到服务器的客户端ip地址
		System.out.println("[message]:A new socket has contented,IP:"+handler.getSocket().getInetAddress());
		//建立一个新线程对象
		sm = new SerMem(handler);
		//启动该线程
		sm.start();
	}
	//handleCommand是接口实现方法,当接收到客户端发送的数据时调用的方法
	//commnad是由客户端发来的字符串数据
	public void handleCommand(ClientHandler handler, String command)
			throws SocketTimeoutException, IOException {
		//这里默认接收到任何数据都会断开socket连接
		handler.closeConnection();
		//清理并结束线程
		sm.clean();
	}
	//当连接意外丢失时调用的方法
	public void lostConnection(ClientHandler handler) throws IOException {
		sm.clean();//清理并结束线程
	}
	//当连接被关闭时调用的方法
	public void closingConnection(ClientHandler handler) throws IOException {
		sm.clean();//清理并结束线程
	}
}

//实现一个子线程需要继承于Thread类或者实现Runable接口两种方法
class SerMem extends Thread {
	//声明一个客户端socket操作对象
	ClientHandler handler;
	//建立一个用来格式化时间字符串的DateFormat对象
	java.text.DateFormat df=java.text.DateFormat.getTimeInstance();
	
	//构造方法,需要提供客户端socket操作对象
	public SerMem(ClientHandler handler) {
		this.handler = handler;
	}
	//结束线程时候调用此方法,释放socket操作对象的资源
	public void clean()
	{
		handler=null;
	}
	
	//线程启动后执行run方法
	public void run() {
		//做一个无限循环的程序块
		while (true) {
			//当丢失客户端操作对象时中断循环结束线程
			if(handler==null)
			{
				return;
			}
			try {
				//使用socket操作对象的sendClientMsg方法向客户端发送时间数据
				//这里在数据的前后要追加一个0字节的占位符,因为在flash中遇到0字节的数据时
				//才判定数据接收成功,前面的\0来区别之前的数据
				handler.sendClientMsg("\0" + df.format(new java.util.Date()) + "\0");
				//让这个子线程挂起1秒中, sleep方法可以让此线程在1秒后继续执行
				Thread.sleep(1000);
			} catch (Exception e) {
				clean();
				e.printStackTrace();
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -