`
Supanccy2013
  • 浏览: 225041 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

一台主机取另一台主机上的日期时间(java多线程。网络编程实现)

阅读更多
注:原创作品,分享以供学习交流,转载请注明出处!

实现机制:
1,主机a,客户机b
2,主机a不断轮训接受客户机b的连接,客户机连接就开启一个新的线程,该线程启动一个定时任务每隔一段时间,发送主机a上的日期时间,给客户机。
3,客户机b连接上主机a上,不断监听接受主机a发送的字符,一旦检测到a有日期时间发送过来,就立马更新本机的日期时间。
4,本博文实例所有配置在配置文件中配置。
5,博文实例采用cs模式。
6,本博文主机代码,和客户机代码可分别打包成可运行的jar文件分布在不同的机器上运行。

代码:
服务端:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import java.util.Timer;
import java.util.TimerTask;

public class Server {
	SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

	ServerSocket serverSocket = null;
	int port = 0;
	private BufferedReader in = null;
	private PrintWriter out = null;

	public Server() throws Exception {
		sf.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));
		port = new Integer(Utils.getServerProperties()[0]).intValue(); // 利用工具类读取配置文件把得到的字符串端口号转换为int类型的。
		serverSocket = new ServerSocket(port);
		System.out.println("Server port is: " + port);
		System.out.println("Server starting time is: " + sf.format(new Date()));
		System.out.println("Server is running…………");
		System.out.println("**********************");
		System.out.println();
		while (true) // 无限死循环,时刻监听客户端的请求。
		{
			Socket socket = serverSocket.accept();
			System.out.println(socket.getInetAddress().getHostAddress() + "  "
					+ "on the time : " + sf.format(new Date())
					+ "  connected the server。");
			this.in = new BufferedReader(new InputStreamReader(
					socket.getInputStream(), "GB2312"));
			this.out = new PrintWriter(socket.getOutputStream(), true);
			new MyThread(socket, in, out).start(); // 客户端一旦建立连接就生成一个线程
		}
	}

	public static void main(String[] args) throws Exception {
		System.out.println();
		System.out.println("**********************");
		System.out.println("Date and time server is starting…………");
		System.out.println("Version: 2.0");
		new Server();
	}
}

class MyThread extends Thread // 每一个连接都生成一个线程
{
	private BufferedReader in = null;
	private PrintWriter out = null;

	public MyThread(Socket socket, BufferedReader in, PrintWriter out)
			throws Exception // 无参数构造函数
	{
		this.in = in;
		this.out = out;
	}

	public void run() {
		MyTask task = new MyTask(in, out);
		Timer timer = new Timer();
		timer.schedule(task, 10000,
				new Integer(Utils.getServerProperties()[2]).intValue()); // 定时器,每隔一定时间给客户端发送一个服务器上的时间,客户端接收到数据后对本地日期和时间进行更行
	}
}

class MyTask extends TimerTask {

	// private BufferedReader in = null;
	private PrintWriter out = null;
	String dateAndTime = null;

	public MyTask(BufferedReader in, PrintWriter out) {
		// this.in = in;
		this.out = out;
	}

	public void run() {
		dateAndTime = Utils.getDateAndTime();
		dateAndTime = dateAndTime + "-" + Utils.getServerProperties()[2];
		out.println(dateAndTime);
	}
}



客户端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client
{
	Socket socket = null;
	private BufferedReader in = null;
	// private PrintWriter out = null;
	String serverDateAndTime[] = null;
	int period = 0;

	public Client() throws Exception
	{

		System.out.println("Client is starting……");
		String[] ServerIpAndPort = Utils.getServerIpAndPortProperties(); // 得到客户端配置文件的属性值
		System.out.println("The server ip address is: " + ServerIpAndPort[0]);
		System.out.println("The server port is :" + ServerIpAndPort[1]);
		System.out.println("Connecting server………………");
		try
		{
			this.socket = new Socket(ServerIpAndPort[0], Integer.valueOf(
					ServerIpAndPort[1]).intValue());
			this.in = new BufferedReader(new InputStreamReader(
					socket.getInputStream(), "GB2312"));
			// this.out = new PrintWriter(socket.getOutputStream(), true);
		} catch (NumberFormatException e)
		{
			System.out
					.println("Connecting server occured exception, please check netword and properties files .");
			System.out.println("Client will exit afiter 10 seconds .");
			Utils.pause(10000);
			System.exit(0);
		} catch (UnknownHostException e)
		{
			System.out
					.println("Connecting server occured exception, please check netword and properties files .");
			System.out.println("Client will exit afiter 10 seconds .");
			Utils.pause(10000);
			System.exit(0);
		} catch (IOException e)
		{
			System.out
					.println("Connecting server occured exception, please check netword and properties files .");
			System.out.println("Client will exit afiter 10 seconds .");
			Utils.pause(10000);
			System.exit(0);
		}
		System.out.println("Connected the server successfully .");

		while (true)
		{
			System.out.println();
			serverDateAndTime = in.readLine().split("-");
			System.out.println();
			System.out.println();
			System.out.println("*************************");

			System.out.println("The time of this update is :"
					+ serverDateAndTime[0] + "-" + serverDateAndTime[1] + "-"
					+ serverDateAndTime[2] + "-" + serverDateAndTime[3] + "-"
					+ serverDateAndTime[4] + "-" + serverDateAndTime[5] + "-"
					+ serverDateAndTime[6] + " .");
			period = new Integer(serverDateAndTime[7]).intValue();

			System.out.println("Starting update local date and time .");
			Utils.setDateAndTime(serverDateAndTime);
			System.out.println("Update successfully .");
			System.out.println("Server will update local date and time after "
					+ period / 3600000 + " hours .");
			System.out.println("*************************");
		}
	}

	public static void main(String[] args) throws Exception
	{
		try
		{
			new Client();
		} catch (java.net.SocketException e)
		{
			System.out.println("Connecting server failed");
			new Client();
		}

	}
}



工具类:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
import java.util.Properties;
import java.util.TimeZone;

public class Utils
{
	private static TimeZone tz = TimeZone.getTimeZone("GMT+8:00"); // 设置北京时区
	private static Calendar Cld = null;
	private static int year;
	private static int month;
	private static int day;
	private static int hour;
	private static int minute;
	private static int second;
	private static int milliSecont;
	private static StringBuffer dateAndTimeTemp = null;
	private static String dateAntTime = null;
	private static String command1;
	private static String command2;

	public static String getDateAndTime() // 获得客户机请求时的系统日期和时间函数(精确到毫秒)
	{
		Cld = Calendar.getInstance(tz); // 得到北京时区的日期和时间
		year = Cld.get(Calendar.YEAR);
		month = Cld.get(Calendar.MONTH) + 1;
		day = Cld.get(Calendar.DATE);
		hour = Cld.get(Calendar.HOUR_OF_DAY); // 得到二十四小时中的小时
		minute = Cld.get(Calendar.MINUTE);
		second = Cld.get(Calendar.SECOND);
		milliSecont = Cld.get(Calendar.MILLISECOND);
		dateAndTimeTemp = new StringBuffer();
		dateAndTimeTemp.append(year).append("-").append(month).append("-")
				.append(day).append("-").append(hour).append("-")
				.append(minute).append("-").append(second).append("-")
				.append(milliSecont);
		dateAntTime = dateAndTimeTemp.toString();
		return dateAntTime;
	}

	public static String[] getServerProperties() // 得到服务端配置文件ServerPort.properties的属性值
	{
		String ServerProperties[] = new String[3];
		InputStream inputStream = null;
		try
		{
			inputStream = new FileInputStream("ServerPort.properties");
		} catch (FileNotFoundException e1)
		{
			System.out
					.println("配置文件ServerPort.properties找不到,请检查该文件是否存在,之后重启本程序,程序将在10秒钟后自动关闭。");
			pause(10000);
			System.exit(0);
		}
		Properties p = new Properties();
		try
		{
			p.load(inputStream);
		} catch (IOException e)
		{
			System.out
					.println("读取配置文件ServerPort.properties时程序出现异常,请检查该文件名是否正确,该文件是否存在,之后重启本程序。程序将在10秒钟后自动关闭");
			pause(10000);
			System.exit(0);
		}
		ServerProperties[0] = p.getProperty("ServerPort");
		ServerProperties[1] = p.getProperty("delay");
		ServerProperties[2] = p.getProperty("period");
		return ServerProperties;
	}

	public static String[] getServerIpAndPortProperties() // 得到客户端配置文件ServerIpAndPort.properties的属性值
	{
		String[] ServerIpAndPort = new String[2];
		Properties p = new Properties();
		try
		{
			InputStream inputStream = new FileInputStream(
					"ServerIpAndPort.properties");
			p.load(inputStream);
		} catch (IOException e)
		{
			System.out.println("读取配置文件ServerIpAndPort.properties时程序出现异常。");
			System.out.println("请检查该文件名是否正确,该文件是否存在,之后重启本程序。程序将在10秒钟后自动关闭");
			pause(10000);
			System.exit(0);
		}
		ServerIpAndPort[0] = p.getProperty("ServerIp");
		ServerIpAndPort[1] = p.getProperty("ServerPort");
		return ServerIpAndPort;
	}

	public static void pause(int milliSecond) // 程序暂停函数,参数是暂停的毫秒数
	{
		try
		{
			Thread.sleep(milliSecond);
		} catch (InterruptedException e)
		{
			System.out.println("程序暂停时出现位置异常程序,程序即将退出");
			System.exit(0);
		}
	}

	public static void setDateAndTime(String[] dateAndTime)
	{
		command1 = "cmd /c date " + dateAndTime[0] + "-" + dateAndTime[1] + "-"
				+ dateAndTime[2];
		command2 = "cmd /c time " + dateAndTime[3] + ":" + dateAndTime[4] + ":"
				+ dateAndTime[5] + "." + 60;
		Process p;
		Process q;
		try
		{
			p = Runtime.getRuntime().exec(command1);
			q = Runtime.getRuntime().exec(command2);
			p.waitFor();
			p.destroy();
			q.waitFor();
			q.destroy();
		} catch (Exception e)
		{
			System.out.println("设置本地系统的日期和时间时程序出现异常。");
			e.printStackTrace();
		}
	}
}
分享到:
评论

相关推荐

    java多线程扫描器(转载)

    ### Java多线程扫描器:实现对任意主机端口的扫描 #### 一、系统功能与设计要点 **1.1 设计任务与要求** Java多线程扫描器的开发旨在深化对Java面向对象程序设计的理解,特别是巩固Java语言的语法规范。此项目的...

    基于java的多线程端口扫描软件

    总的来说,这个项目涵盖了Java多线程编程、Socket网络通信、GUI设计和打包部署等多个方面,对于学习和理解这些基础知识非常有帮助。通过分析和实践这个程序,开发者可以深入理解网络扫描的工作原理,同时提升Java...

    Java 网络编程实例

    通过这个实例,我们可以深入理解Java的Socket编程、多线程以及网络通信的基本原理。 1. **Java Socket编程**: Java Socket是Java提供的用于实现网络上不同主机间的进程通信的API。在本例中,服务器端创建一个...

    java网络编程精讲

    - 对等网络模型:在网络中的每一台计算机既可以作为服务器也可以作为客户端,它们之间可以直接进行通信。 3. **协议与端口**: - TCP/IP协议族是互联网中最常用的一套协议集合,包括TCP、UDP、IP、ICMP等协议。 ...

    一个多线程ping的例子

    在IT领域,多线程编程是一种常见的技术,用于提高程序的执行效率,特别是在需要执行并发任务时。这个例子,"一个多线程ping的例子",显然旨在演示如何利用多线程来同时ping多个IP地址,以检查它们的网络可达性。在...

    学会Java网络编程

    Java 网络编程基础知识 Java 网络编程是指使用 Java 语言实现的网络通信编程,涵盖了网络协议、Socket 编程、IO 流传...这只是 Java 网络编程的基础知识,更多的内容还包括 Socket 编程、IO 流传输、多线程编程等等。

    Java网络编程实例

    总结,Java网络编程实例涵盖了Socket编程、TCP/UDP通信、HTTP/FTP协议实现、异常处理、安全通信以及多线程和非阻塞I/O等关键概念。通过学习和实践这些实例,开发者能够构建强大的网络应用程序,满足各种网络通信需求...

    Java网络编程-Socket-文件传输小案例

    在Java编程领域,网络编程是不可或缺的一部分,而Socket通信则是实现网络数据传输的基础。本案例主要探讨了如何使用Java的Socket API进行简单的文件传输。在这个过程中,我们将涉及到以下几个关键知识点: 1. **...

    商业编程-源码-ftp协议实现多线程断点续传.zip

    FTP(File Transfer Protocol)协议是Internet上用于在主机之间传输文件的标准协议,它允许用户从一台计算机(客户端)向另一台计算机(服务器)上传或下载文件。多线程和断点续传是FTP协议实现中两个重要的技术特性...

    6JAVA编程高级-网络编程

    **IP地址** 是分配给互联网上每一台主机的唯一标识符。根据版本的不同,可以分为 IPv4 和 IPv6。 - **IPv4**:由四个十进制数字组成,每个数字介于 0 到 255 之间,中间用点号分隔开。如:192.168.1.1。 - **IPv6**...

    Java实现远程桌面(参赛作品)

    在这个项目中,"Java实现远程桌面"是一个使用纯Java编程语言编写的远程桌面解决方案,它使得用户能够在一台计算机上操控另一台计算机,无论它们之间的距离有多远。下面我们将深入探讨这个项目的相关知识点: 1. **...

    java编写Socket扫描程序,识别局域网内活跃的主机

    - **并发编程**:了解Java多线程模型,如线程池的使用,以优化并发性能。 - **网络编程异常处理**:处理网络连接可能出现的各种异常,如SocketTimeoutException、UnknownHostException等。 - **网络安全和道德规范**...

    Java在网络编程示例

    在Java编程领域,网络编程是不可或缺的一部分,它允许程序通过网络进行通信,交换数据和实现分布式服务。本示例将深入探讨Java在网络编程中的应用,通过提供的四个源代码文件:SimpleServer.java、SimpleClient.java...

    Java之网络编程篇

    3. **getAllByName(String host)**:当一台主机可以通过多个IP地址访问时,可以使用此方法获取所有匹配的`InetAddress`对象数组。如果找不到主机,同样会抛出`UnknownHostException`异常。 ```java try { ...

    聊天器JAVA做的,可在两台主机上运行,并对话

    Java编写的聊天器是一款能够实现在两台主机之间进行实时通信的应用程序,它利用了Java的强大功能和跨平台特性。这个聊天器不仅支持文本交流,还具有表情发布功能,为用户提供了更为丰富的互动体验。在设计和实现这个...

    java网络编程基础知识

    - **定义**:IP地址是分配给网络上的每一台计算机或网络设备的一个数字标识,用来唯一标识Internet上的每一台主机。 - **格式**:IPv4地址由四个8位的二进制数组成,通常表示为四个十进制数,每个数介于0到255之间,...

    JAVA SWING 多线程扫描局域网IP及端口 v2 源码

    Java Swing 是Java GUI(图形用户界面)库的一部分,它提供了丰富的组件...这个源码项目为学习Java Swing、多线程编程、网络扫描等技术提供了一个实用的示例,对于想要深入这些领域的开发者来说,具有很高的参考价值。

    Java面试之Socket编程

    Java网络编程是开发分布式应用程序的关键技术之一,其中Socket编程扮演着至关重要的角色。在Java面试中,对Socket编程的理解和应用能力通常是评估开发者技能的重要标准。以下是对Socket编程的详细阐述: 1. **Java ...

    Java TCP IP Socket编程(中文版).pdf

    在TCP/IP模型中,IP地址是用于标识网络中设备位置的地址,而端口号则用于标识同一台设备上不同的通信服务。通常,一个完整的通信地址由IP地址和端口号共同组成。 计算机网络中的名字通常指的是域名,它为复杂的IP...

    网络编程的例子,好啊

    网络编程是计算机科学中的一个重要领域,它涉及到通过网络在不同设备间交换数据和实现通信。在本案例中,我们将深入探讨“Java网络应用编程”,这是一个关键的标签,表明我们将使用Java语言来构建网络应用程序。 ...

Global site tag (gtag.js) - Google Analytics