java遠程訪問
⑴ java 遠程 調用的幾種實現方式簡析 詳細�0�3
基本原理 要實現網路機器間的通訊,首先得來看看計算機系統網路通信的基本原理,在底層層面去看,網路通信需要做的就是將流從一台計算機傳輸到另外一台計算機,基於傳輸協議和網路 IO 來實現,其中傳輸協議比較出名的有 http、tcp、 udp 等等,http、tcp、udp 都是在基於Socket 概念上為某類應用場景而擴展出的傳輸協議,網路IO,主要有bio、nio、aio 三種方式,所有的分布式應用通訊都基於這個原理而實現,只是為了應用的易用,各種語言通常都會提供一些更為貼近應用易用的應用層協議。 應用級協議 遠程服務通訊,需要達到的目標是在一台計算機發起請求,另外一台機器在接收到請求後進行相應的處理並將結果返回給請求端,這其中又會有諸如 onewayrequest、同步請求、非同步請求等等請求方式,按照網路通信原理,需要實現這個需要做的就是將請求轉換成流,通過傳輸協議傳輸至遠端,遠端計算機在接收到請求的流後進行處理,處理完畢後將結果轉化為流,並通過傳輸協議返回給調用端。原理是這樣的,但為了應用的方便,業界推出了很多基於此原理之上的應用級的協議,使得大家可以不用去直接操作這么底層的東西,通常應用級的遠程通信協議會提供: 1.為了避免直接做流操作這么麻煩,提供一種更加易用或貼合語言的標准傳輸格式;2.網路通信機制的實現,就是替你完成了將傳輸格式轉化為流,通過某種傳輸協議傳輸至遠端計算機,遠端計算機在接收到流後轉化為傳輸格式,並進行存儲或以某種方式通知遠端計算機。 所以在學習應用級的遠程通信協議時,我們可以帶著這幾個問題進行學習: 1.傳輸的標准格式是什麼?2.怎麼樣將請求轉化為傳輸的流?3.怎麼接收和處理流?4.傳輸協議是? 不過應用級的遠程通信協議並不會在傳輸協議上做什麼多大的改進,主要是在流操作方面,讓應用層生成流和處理流的這個過程更加的貼合所使用的語言或標准,至於傳輸協議則通常都是可選的,在java 領域中知名的有:RMI、 XML-RPC、Binary-RPC、SOAP、CORBA、JMS,來具體的看看這些遠程通信的應用級協議: RMIRMI 是個典型的為java 定製的遠程通信協議,我們都知道,在 singlevm 中,我們可以通過直接調用javaobjectinstance 來實現通信,那麼在遠程通信時,如果也能按照這種方式當然是最好了,這種遠程通信的機製成為RPC(RemoteProcereCall),RMI 正是朝著這個目標而誕生的。 來看下基於RMI 的一次完整的遠程通信過程的原理: 1.客戶端發起請求,請求轉交至RMI 客戶端的stub 類;2.stub 類將請求的介面、方法、參數等信息進行序列化;3.基於socket 將序列化後的流傳輸至伺服器端;4.伺服器端接收到流後轉發至相應的skelton 類;5.skelton 類將請求的信息反序列化後調用實際的處理類;6.處理類處理完畢後將結果返回給 skelton 類;7.Skelton 類將結果序列化,通過socket 將流傳送給客戶端的 stub;8.stub 在接收到流後反序列化,將反序列化後的JavaObject 返回給調用者。 根據原理來回答下之前學習應用級協議帶著的幾個問題: 1.傳輸的標准格式是什麼?是JavaObjectStream。2.怎麼樣將請求轉化為傳輸的流?基於Java 串列化機制將請求的javaobject 信息轉化為流。3.怎麼接收和處理流?根據採用的協議啟動相應的監聽埠,當有流進入後基於Java 串列化機制將流進行反序列化,並根據RMI 協議獲取到相應的處理對象信息,進行調用並處理,處理完畢後的結果同樣基於java 串列化機制進行返回。4.傳輸協議是?Socket。 XML-RPCXML-RPC 也是一種和RMI 類似的遠程調用的協議,它和RMI 的不同之處在於它以標準的 xml 格式來定義請求的信息(請求的對象、方法、參數等),這樣的好處是什麼呢,就是在跨語言通訊的時候也可以使用。 來看下XML-RPC 協議的一次遠程通信過程: 1.客戶端發起請求,按照XML-RPC 協議將請求信息進行填充;2.填充完畢後將xml 轉化為流,通過傳輸協議進行傳輸;3.接收到在接收到流後轉換為xml,按照XML-RPC 協議獲取請求的信息並進行處理;4.處理完畢後將結果按照XML- RPC 協議寫入xml 中並返回。 同樣來回答問題: 1.傳輸的標准格式是?標准格式的XML。2.怎麼樣將請求轉化為傳輸的流? 將XML 轉化為流。3.怎麼接收和處理流?通過監聽的埠獲取到請求的流,轉化為XML,並根據協議獲取請求的信息,進行處理並將結果寫入XML 中返回。4. 傳輸協議是?Http。 Binary-RPCBinary-RPC 看名字就知道和XML-RPC 是差不多的了,不同之處僅在於傳輸的標准格式由XML 轉為了二進制的格式。 同樣來回答問題: 1.傳輸的標准格式是?標准格式的二進制文件。2.怎麼樣將請求轉化為傳輸的流?將二進制格式文件轉化為流。3.怎麼接收和處理流?通過監聽的埠獲取到請求的流,轉化為二進制文件,根據協議獲取請求的信息,進行處理並將結果寫入XML 中返回。4.傳輸協議是?Http。 SOAPSOAP 原意為SimpleObjectAccessProtocol,是一個用於分布式環境的、輕量級的、基於XML 進行信息交換的通信協議,可以認為SOAP 是XMLRPC 的高級版,兩者的原理完全相同,都是http+XML,不同的僅在於兩者定義的XML 規范不同,SOAP 也是Webservice 採用的服務調用協議標准,因此在此就不多加闡述了。 (公用對象請求代理[調度]程序體系結構),是一組用來定義"分布式對象系統"的標准,由 OMG(ObjectMenagementGroup)作為發起和標准制定單位。CORBA 的目的是定義一套協議,符合這個協議的對象可以互相交互,不論它們是用什麼樣的語言寫的,不論它們運行於什麼樣的機器和操作系統。CORBA 在我看來是個類似於SOA 的體系架構,涵蓋可選的遠程通信協議,但其本身不能列入通信協議這里來講,而且CORBA 基本淘汰,再加上對CORBA 也不怎麼懂,在此就不進行闡述了。 JMSJMS 呢,是實現java 領域遠程通信的一種手段和方法,基於JMS 實現遠程通信時和RPC 是不同的,雖然可以做到RPC 的效果,但因為不是從協議級別定義的,因此我們不認為JMS 是個RPC 協議,但它確實是個遠程通信協議,在其他的語言體系中也存在著類似JMS 的東西,可以統一的將這類機制稱為消息機制,而消息機制呢,通常是高並發、分布式領域推薦的一種通信機制,這里的主要一個問題是容錯(詳細見ErLang 論文)。 來看JMS 中的一次遠程通信的過程: 1.客戶端將請求轉化為符合JMS 規定的Message;2.通過JMSAPI 將Message 放入JMSQueue 或Topic 中;3.如為JMSQueue,則發送中相應的目標Queue 中,如為Topic,則發送給訂閱了此Topic 的JMSQueue。4.處理端則通過輪訓 JMSQueue,來獲取消息,接收到消息後根據JMS 協議來解析Message 並處理。 回答問題: 1.傳輸的標准格式是?JMS 規定的Message。2.怎麼樣將請求轉化為傳輸的流?將參數信息放入Message 中即可。3.怎麼接收和處理流?輪訓JMSQueue 來接收Message,接收到後進行處理,處理完畢後仍然是以Message 的方式放入 Queue 中發送或Multicast。4.傳輸協議是?不限。 基於JMS 也是常用的實現遠程非同步調用的方法之一。
⑵ 如何用java遠程登錄windows
Java使用SSH遠程訪問Windows並執行命令
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
public class SSHWindows {
public static void main(String[] args) {
// TODO Auto-generated method stub
String hostname ="192.168.30.10";
String username="administrator";
String password="Talent123";
try{
//建立連接
Connection conn= new Connection(hostname);
// System.out.println("set up connections");
conn.connect();
//利用用戶名和密碼進行授權
boolean isAuthenticated = conn.authenticateWithPassword(username, password);
if(isAuthenticated ==false)
{
// System.out.println("--------");
throw new IOException("Authorication failed");
}
//打開會話
Session sess = conn.openSession();
// System.out.println("cmd----");
//執行命令
sess.execCommand("ruby C:\\WhatWeb-master\\whatweb --output-xml http://216.139.147.75:443/");
// System.out.println("The execute command output is:");
InputStream stdout = new StreamGobbler(sess.getStdout());
BufferedReader br = new BufferedReader(new InputStreamReader(stdout));
while(true)
{
String line = br.readLine();
if(line==null) break;
System.out.println(line);
}
// System.out.println("Exit code "+sess.getExitStatus());
sess.close();
conn.close();
// System.out.println("Connection closed");
}catch(IOException e)
{
System.out.println("can not access the remote machine");
}
}
}
⑶ 如何用java 遠程連接 access資料庫
package com.jiuzi.connection;
import java.sql.*;
public class ConnectAccess {
/**
* 初學者請注意:
* 1:先建立一個access文件a1.mdb,並放在D:\下;
* 2:在資料庫文件a1.mdb中建立一個表Table1;
* 3:為Table1添加一列,並插入至少一條記錄;
* 4:本文是一個完整的類,直接拿去運行就可以。
*/
public static void main(String args[]) throws Exception {
ConnectAccess ca=new ConnectAccess();
ca.ConnectAccessFile();
// ca.ConnectAccessDataSource();
}
public void ConnectAccessFile() throws Exception
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
/**
* 直接連接access文件。
*/
String dbur1 = "jdbc:odbc:driver={Microsoft Access Driver
(*.mdb)};DBQ=d:\\hongloumeng.mdb";
Connection conn = DriverManager.getConnection(dbur1, "username", "password");
Statement stmt = conn.createStatement();
String sql="select * from dream where 序號=1";
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
String text=rs.getString(4);
System.out.println(rs.getString(1));
System.out.println(rs.getString(2));
System.out.println(rs.getString(3));
System.out.println(text);
}
rs.close();
stmt.close();
conn.close();
}
public void ConnectAccessDataSource()throws Exception {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
/**
* 採用ODBC連接方式 如何建立ODBC連接?
* 答:在windows下,【開始】->【控制面板】->【性能和維護】->【管理工具】->【數
據源】,在數據源這里添加一個指向a1.mdb文件的數據源。
* 比如創建名字為dataS1
*/
String dbur1 = "jdbc:odbc:dataS1";// 此為ODBC連接方式
Connection conn = DriverManager.getConnection(dbur1, "username", "password");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from Table1");
while (rs.next()) {System.out.println(rs.getString(1));
}
rs.close();
stmt.close();
conn.close();
}
}
利用連接池(以下是一個連接池)
package com.jiuzi.connection;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
public class ConnectionPool {
private List<ConnectionDesc> connections = new ArrayList<ConnectionDesc>();
private static final int MIN_CONNECTIONS = 2;
private static final int MAX_CONNECTIONS = 10;
private static ConnectionPool connectionPool = null;
static {
try {
connectionPool = new ConnectionPool();
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "資料庫連接錯誤:"+
("jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=d:\\hongloumeng.mdb"+
e.getMessage()));
System.exit(-1);
System.err.println();
}
}
private ConnectionPool() throws Exception {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
for(int i = 0; i < MIN_CONNECTIONS; ++i) {
this.createNewConnection();
}
}
public static ConnectionPool getInstance() {
return connectionPool;
}
public static void main(String [] args) throws Exception {
final ConnectionPool pool = ConnectionPool.getInstance();
for(int i = 0; i < 5; ++i) {
new Thread() {
public void run() {try {
Connection conn = pool.getConnection();
Thread.sleep(5000);
pool.releaseConnection(conn);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
}
public synchronized Connection getConnection() throws Exception {
ConnectionDesc cd = null;
for (int i = 0; i < connections.size(); i++) {
cd = connections.get(i);
if (cd.isIdle()) {
cd.setState(true);
System.out.println("Connection No." + cd.getNo() + " has been
Occupied.");
return cd.getConn();
}
}
cd = createNewConnection();
cd.setState(true);
return cd.getConn();
}
public synchronized void releaseConnection(Connection conn) {
for (int i = 0; i < this.connections.size(); i++) {
ConnectionDesc cd = this.connections.get(i);
if (cd.getConn() == conn) {
cd.setState(false);
System.out.println("Connection No." + cd.getNo() + " has been
released.");
}
}
}
public synchronized ConnectionDesc createNewConnection()
throws Exception {
if (this.connections.size() < MAX_CONNECTIONS) {
Connection conn =
DriverManager.getConnection("jdbc:odbc:driver={Microsoft Access Driver
(*.mdb)};DBQ=db\\hongloumeng.mdb",
"username", "password");
ConnectionDesc cd = new ConnectionDesc(conn);
this.connections.add(cd);
cd.setState(false);
return cd;
}
System.err.println("Too many Connection with DB:" + connections.size());
if(JOptionPane.OK_OPTION==JOptionPane.showConfirmDialog(null, "E00101:太多連接
了,對其連接復位嗎?")){
resetConnection();
}
return null;
}
public void resetConnection(){
for(ConnectionDesc desc:connections){
if(!desc.isIdle()){
desc.setState(false);
}
}
}
}
class ConnectionDesc {
private Connection conn;
//state 指的是此連接是否被使用: true 為是,false 為不是
private boolean state;
private int no;
private static int count = 0;
ConnectionDesc(Connection conn) {
this.conn = conn;
this.no = count++;
System.out.println("Connection No." + this.no + " has been created.");
}
public void setState(boolean state) {
this.state = state;
}
public boolean isIdle() {
return !state;
}
public int getNo() {
return this.no;
}
public Connection getConn() {
return conn;
}
}
⑷ JAVA中如何通過IP 、埠連接到遠程計算機,並讀取文件。
其實,如果不是不通過j2ee的話,就是套接字編程了吧。
需要你在遠程機器上運行一個客戶端了吧。
如果是j2ee的話,就是一個文件下載了吧。
直接通過下載,把流傳輸過去。
⑸ Java實現訪問遠程資料庫的實例
Mysql默認關閉遠程登錄許可權,需要給遠程用戶添加許可權才能連接。
通過select*from mysql.user\G 查看用戶及許可權。
一.允許root用戶在任何地方進行遠程登錄,並具有所有庫任何操作許可權,具體操作如下:
1、在本機先使用root用戶登錄mysql:
mysql -u root -p"password"
2、進行授權操作:
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
3、重載授權表:flush privileges;
二.允許root用戶在一個特定的IP進行遠程登錄,並具有所有庫任何操作許可權,具體操作如下:
1、在本機先使用root用戶登錄mysql:
mysql -u root -p"password"
2、進行授權操作:
GRANT ALL PRIVILEGES ON *.* TO root@"172.16.16.152" IDENTIFIED BY "password" WITH GRANT OPTION;
3、重載授權表:flush privileges;