public MultiPointerServer() throws IOException, AWTException 
	{
		thisPtr = this;
		loadConfig(CONFIG_FILE);
		/*
		try
		{
			localAddr = InetAddress.getLocalHost();
			if (localAddr.isLoopbackAddress())
			{
				localAddr = LinuxInetAddress.getLocalHost();
			}
			mLocalHostName = localAddr.getHostName();
			mLocalHostIP =  localAddr.getHostAddress();
		}
		catch (UnknownHostException e)
		{
			e.printStackTrace();
		}
		*/
	    // ローカルホスト名とIPアドレスを取得
	    try 
	    {
			InetAddress addr = InetAddress.getLocalHost();
			mLocalHostName = addr.getHostName();
			mLocalHostIP   = addr.getHostAddress();
	    }
	    catch (UnknownHostException e) 
	    {
	      e.printStackTrace();
	    }
		mOSName = System.getProperty("os.name");
		mOSArch = System.getProperty("os.arch");
		mOSVersion = System.getProperty("os.version");
		
		// ポートの重複チェック
		try
		{
			ServerSocket serverSoc = new ServerSocket(mPortNum);
			serverSoc.close();
			
		}
		catch( BindException e )
		{
			JOptionPane.showMessageDialog(null, "ポート番号:" + String.valueOf(mPortNum) + "が既に使用されています。\nサーバソフトが起動中でないか確認してください。\n起動していない場合、config.txtのport:の値を変更してください。");
			System.exit(1);
			return;
		}
		
		SystemTray tray = SystemTray.getSystemTray();

		mPopupMenu = new PopupMenu("Wi-Fi Multi TouchPad Server");
		makeMenu( mPopupMenu );
		
		Image iconImage = ImageIO.read(new File("./res/icon.png"));
		icon = new TrayIcon( iconImage, "Wi-Fi Multi TouchPad Server\nServer IP:" + mLocalHostIP, mPopupMenu);
		
		icon.addMouseListener(this);
		
		tray.add(icon);
		
		// ウィンドウ表示
//		mPointerFrame = new PointerFrame(200,200);
//	    mPointerFrame.setVisible(true);
//	    mPointerFrame.setAlwaysOnTop(true);
//		ScreenKeyboard mScreenKeyboard = new ScreenKeyboard();
//		mScreenKeyboard.setVisible(true);
//		mScreenKeyboard.setAlwaysOnTop(true);
		
		mReceiveThread = new ReceiveThread( this, mPortNum );
		mReceiveThread.start();
		mReceiveThreadUDP = new ReceiveThreadUDP( this, mPortNum );
		mReceiveThreadUDP.start();
		
		// 切断チェックスレッド
		mDisconnectThread = new Thread(){
			public void run()
			{
				while( true )
				{
					try {
						sleep(10000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
					String disconnectedIp = "";
					synchronized( mIpList )
					{
						for( String ip : mIpList)
						{
							// ipへの接続確認。
							InetSocketAddress socketAddress = new InetSocketAddress(ip, mPortNum );
	
							//socketAddressの値に基づいて通信に使用するソケットを作成する。
	
							Socket socket = new Socket();
							//タイムアウトは10秒(10000msec)
							try {
								socket.connect(socketAddress, 10000);
	
								/*
								//接続先の情報を入れるInetAddress型のinadrを用意する。
								InetAddress inadr;
	
								//inadrにソケットの接続先アドレスを入れ、nullである場合には
								//接続失敗と判断する。
								//nullでなければ、接続確立している。
								if ((inadr = socket.getInetAddress()) != null) 
								{
									System.out.println("Connect to " + inadr);
								}
								else 
								{
									System.out.println("Connection failed.");
									return;
								}
	
								//メッセージの送信処理
	
								//PrintWriter型のwriterに、ソケットの出力ストリームを渡す。
								PrintWriter writer = new PrintWriter(socket.getOutputStream());
	
								//ソケットから出力する。
								writer.println( "Ho_!" );
								//終了処理
								writer.close();
								*/
								socket.close();
								
							} catch (IOException e) {
								// 切断されたと判断。
	//							e.printStackTrace();
								disconnectedIp = ip;
								break;
							}
						}
					}
					if( disconnectedIp.equals(""))
					{
					}
					else
					{
						icon.displayMessage("Disconnected", disconnectedIp, TrayIcon.MessageType.INFO);
						PointerFrame P = mIpPointerFrameMap.get( disconnectedIp );
						if( P != null )
						{
							P.setVisible( false );
							P = null;
							mIpPointerFrameMap.remove( mIpList.indexOf( disconnectedIp ) );
						}
						
						mIpList.remove( mIpList.indexOf( disconnectedIp ) );
						makeMenu( mPopupMenu );
					}
				}//while(true)
			}
		};
		mDisconnectThread.start();
		
		try {
			mDisconnectThread.join();
		} catch (InterruptedException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}
		DebugLog( "切断検出スレッドが終了しました。" );
		
		
//		mClipThread = new ClipboardWatchThread( 500, mPortNum );
//		mClipThread.start();
	}