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

📄 connection.java

📁 定要上载质量高而定要上载质量高而定要上载质量高而定要上载质量高而定要上载质量高而
💻 JAVA
字号:
/*
 * Created on Aug 29, 2004
 */
package org.flexdock.docking.drag.outline.x11;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Properties;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.flexdock.util.ResourceManager;

/**
 * @author Christopher Butler
 */
public class Connection {
    private static Log log = LogFactory.getLog(Connection.class);
    
	public static final String LOCALHOST = "127.0.0.1";
	public static final String DISPLAY_VAR = "DISPLAY";
	private static final ConnectionInfo CONNECTION_INFO = getConnectionInfo();
	private static final boolean SERVER_AVAILABLE = isServerAvailable();
	
	private Socket socket;
	private DataInputStream dataIn;
	private OutputStream dataOut;
	
	public Connection() throws IOException {
		if(!SERVER_AVAILABLE)
			throw new RuntimeException("X Server is unavailable.  Please check your xhost access control list to ensure localhost may connect.");
			
		try {
			socket = new Socket(CONNECTION_INFO.host, 6000 + CONNECTION_INFO.display);
			dataIn = new DataInputStream(socket.getInputStream());
			dataOut = socket.getOutputStream();
		} catch(IOException e) {
			close();
			throw e;
		} 
	}
	
	public void close() {
		ResourceManager.close(dataOut);
		ResourceManager.close(dataIn);
		ResourceManager.close(socket);
	}
	
	public void sendRequest(DataBuffer req) throws IOException {
		sendRequest(req, false);
	}
	
	public DataBuffer sendRequest(DataBuffer req, boolean readReply) throws IOException {
		if(req==null)
			return null;
		
		synchronized(dataOut) {
			dataOut.write(req.getBytes());
			if(!readReply)
				return null;
			
			byte[] tmp = new byte[4096];
			int bytesRead = -1;
			synchronized(dataIn) {
				bytesRead = dataIn.read(tmp);
			}
			
			byte[] ret = new byte[bytesRead];
			System.arraycopy(tmp, 0, ret, 0, bytesRead);
			return new DataBuffer(ret);			
		}

	}
	
	private static boolean isServerAvailable() {
		try {
			Process process = Runtime.getRuntime().exec("xhost +" + CONNECTION_INFO.host);
			process.waitFor();
			DataInputStream in = new DataInputStream(process.getInputStream());
			in.readFully(new byte[in.available()]);
			in.close();
			return true;
		} catch (Exception e) {
			log.debug(e.getMessage(), e);
			return false;
		}
	}

	
	private static class ConnectionInfo {
		private String host = LOCALHOST;
		private int display;
		private int screen;
	}
	private static ConnectionInfo getConnectionInfo() {

		String displayInfo = getEnv().getProperty(DISPLAY_VAR);
		ArrayList list = new ArrayList();
		StringBuffer sb = new StringBuffer();
		
		for(int i=0; i<displayInfo.length(); i++) {
			char c = displayInfo.charAt(i);
			if(c==':' || c=='.') {
				list.add(sb.toString());
				sb = new StringBuffer();
			}
			else
				sb.append(c);
		}
		if(sb.length()>0)
			list.add(sb.toString());
		while(list.size()<3)
			list.add("");
		
		
		ConnectionInfo info = new ConnectionInfo();
		info.host = getHost(list.get(0));
		info.display = getInt(list.get(1));
		info.screen = getInt(list.get(2));
		return info;
	}
	
	private static int getInt(Object data) {
		try {
			return Integer.parseInt(data.toString());
		} catch(Exception e) {
			return 0;
		}
	}
	
	private static String getHost(Object data) {
		if(data==null || data.toString().trim().length()==0)
			return LOCALHOST;
		return data.toString().trim();
	}
	
	private static Properties getEnv() {
		try {
			Process proc = Runtime.getRuntime().exec("env");
			proc.waitFor();
			BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
			
			Properties p = new Properties();
			while(br.ready()) {
				String data = br.readLine();
				int indx = data.indexOf('=');
				if(indx!=-1) {
					String key = data.substring(0, indx);
					String value = data.substring(indx+1, data.length());
					p.setProperty(key, value);
				}
			}
			return p;
		} catch(Exception e) {
			log.debug(e.getMessage(), e);
			return new Properties();
		}
	}
}

⌨️ 快捷键说明

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