真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

互信息java代碼的簡單介紹

TCP/IP協(xié)議 怎么用JAVA發(fā)送和接收二進(jìn)制數(shù)據(jù) 要具體實例

1.TCP/IP協(xié)議要求信息必須在塊(chunk)中發(fā)送和接收,而塊的長度必須是8位的倍數(shù),因此,我們可以認(rèn)為TCP/IP協(xié)議中傳輸?shù)男畔⑹亲止?jié)序列。如何發(fā)送和解析信息需要一定的應(yīng)用程序協(xié)議。

吳江網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),吳江網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為吳江上1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務(wù)好的吳江做網(wǎng)站的公司定做!

2.信息編碼:

首先是Java里對基本整型的處理,發(fā)送時,要注意:1)每種數(shù)據(jù)類型的字節(jié)個數(shù);2)這些字節(jié)的發(fā)送順序是怎樣的?(little-endian還是

big-endian);3)所傳輸?shù)臄?shù)值是有符號的(signed)還是無符號的(unsigned)。具體編碼時采用位操作(移位和屏蔽)就可以了。

具體在Java里,可以采用DataOutputStream類和ByteArrayOutputStream來實現(xiàn)。恢復(fù)時可以采用

DataInputStream類和ByteArrayInputStream類。

其次,字符串和文本,在一組符號與一組整數(shù)之間的映射稱為編碼字符集(coded character

set)。發(fā)送者與接收者必須在符號與整數(shù)的映射方式上達(dá)成共識,才能使用文本信息進(jìn)行通信,最簡單的方法就是定義一個標(biāo)準(zhǔn)字符集。具體編碼時采用

String的getBytes()方法。

最后,位操作。如果設(shè)置一個特定的設(shè)為1,先設(shè)置好掩碼(mask),之后用或操作;要清空特定一位,用與操作。

3.成幀與解析

成幀(framing)技術(shù)解決了接收端如何定位消息的首位位置的問題。

如果接收者試圖從套接字中讀取比消息本身更多的字節(jié),將可能發(fā)生以下兩種情況之一:如果信道中沒有其他消息,接收者將阻塞等待,同時無法處理接收

到的消息;如果發(fā)送者也在等待接收端的響應(yīng)消息,則會形成死鎖(dealock);另一方面,如果信道中還有其他消息,則接收者會將后面消息的一部分甚至

全部讀到第一條消息中去,這將產(chǎn)生一些協(xié)議錯誤。因此,在使用TCP套接字時,成幀就是一個非常重要的考慮因素。

有兩個技術(shù):

1.基于定界符(Delimiter-based):消息的結(jié)束由一個唯一的標(biāo)記(unique

marker)指出,即發(fā)送者在傳輸完數(shù)據(jù)后顯式添加的一個特殊字節(jié)序列。這個特殊標(biāo)記不能在傳輸?shù)臄?shù)據(jù)中出現(xiàn)。幸運的是,填充(stuffing)技術(shù)

能夠?qū)ο⒅谐霈F(xiàn)的定界符進(jìn)行修改,從而使接收者不將其識別為定界符。在接收者掃描定界符時,還能識別出修改過的數(shù)據(jù),并在輸出消息中對其進(jìn)行還原,從而

使其與原始消息一致。

2.顯式長度(Explicit length):在變長字段或消息前附加一個固定大小的字段,用來指示該字段或消息中包含了多少字節(jié)。這種方法要確定消息長度的上限,以確定保存這個長度需要的字節(jié)數(shù)。

接口:

Java代碼 import java.io.IOException; import java.io.OutputStream; public interface Framer { void frameMsg(byte [] message,OutputStream out) throws IOException; byte [] nextMsg() throws IOException; }

定界符的方式:

Java代碼 import java.io.ByteArrayOutputStream; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class DelimFramer implements Framer { private InputStream in;//data source; private static final byte DELIMTER=(byte)'\n';//message delimiter public DelimFramer(InputStream in){ this.in=in; } @Override public void frameMsg(byte[] message, OutputStream out) throws IOException { //ensure that the message dose not contain the delimiter for(byte b:message){ if(b==DELIMTER) throw new IOException("Message contains delimiter"); } out.write(message); out.write(DELIMTER); out.flush(); } @Override public byte[] nextMsg() throws IOException { ByteArrayOutputStream messageBuffer=new ByteArrayOutputStream(); int nextByte; while((nextByte=in.read())!=DELIMTER){ if(nextByte==-1){//end of stream? if(messageBuffer.size()==0){ return null; }else{ throw new EOFException("Non-empty message without delimiter"); } } messageBuffer.write(nextByte); } return messageBuffer.toByteArray(); } }

顯式長度方法:

Java代碼 import java.io.DataInputStream; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class LengthFramer implements Framer { public static final int MAXMESSAGELENGTH=65535; public static final int BYTEMASK=0xff; public static final int SHOTMASK=0xffff; public static final int BYTESHIFT=8; private DataInputStream in;// wrapper for data I/O public LengthFramer(InputStream in) throws IOException{ this.in=new DataInputStream(in); } @Override public void frameMsg(byte[] message, OutputStream out) throws IOException { if(message.lengthMAXMESSAGELENGTH){ throw new IOException("message too long"); } //write length prefix out.write((message.lengthBYTEMASK)BYTEMASK); out.write(message.lengthBYTEMASK); //write message out.write(message); out.flush(); } @Override public byte[] nextMsg() throws IOException { int length; try{ length=in.readUnsignedShort(); }catch(EOFException e){ //no (or 1 byte) message; return null; } //0=length=65535; byte [] msg=new byte[length]; in.readFully(msg);//if exception,it's a framing error; return msg; } }

java中各種類型的鍵盤輸入代碼是什么

下面的是鍵盤和鼠標(biāo)的各種事件,看一下是不是你要的!

鼠標(biāo)監(jiān)聽器

鼠標(biāo)監(jiān)聽器mouseListener監(jiān)聽鼠標(biāo)事件MouseEvent。相應(yīng)事件和處理方法如下表:

鼠標(biāo)事件 處理方法

MOUSE_CLICKED MouseClicked (MouseEvent) 鼠標(biāo)點擊(單或雙)

MOUSE_PRESSED MousePressed (MouseEvent) 鼠標(biāo)按下

MOUSE_RELEASED MouseReleased(MouseEvent) 鼠標(biāo)松開

MOUSE_ENTERED MouseEntered (MouseEvent) 鼠標(biāo)進(jìn)入(某組件區(qū)域)

MOUSE_EXITED MouseExited (MouseEvent) 鼠標(biāo)離開(某組件區(qū)域)

鼠標(biāo)事件MouseEvent常用方法

int getClickCount() 得到點擊次數(shù)1 OR 2;

int getX(), int getY() 得到鼠標(biāo)的(象素)位置。

對于鼠標(biāo)的移動和拖放,另外用鼠標(biāo)運動監(jiān)聽器mouseMotionListener。因為許多程序不需要監(jiān)聽鼠標(biāo)運動,把兩者分開可簡化程序。有兩個方法處理鼠標(biāo)運動事件:

MOUSE_MOVED MouseMoved (MouseEvent) 鼠標(biāo)在移動MOUSE_DRAGGED MouseDragged(MouseEvent) 鼠標(biāo)被拖動

下面的例程演示簡單的鼠標(biāo)監(jiān)聽,并在屏幕上輸出鼠標(biāo)操作的信息。

例2

下面是討論MouseMotionListener的使用時機,它提供的下面的兩個方法,可讓你隨時掌握鼠標(biāo)的坐標(biāo),并處理拖曳鼠標(biāo)的操作。

MouseMotionListener mouseDragged(MouseEvent e)

mouseMoved(MouseEvent e)

-----------------------------------------------------------------------

下面的范例讓你知道鼠標(biāo)在JFrame上的坐標(biāo),并拖曳出直線來。

MouseDemo3.java

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

/*為了達(dá)到畫線的功能,我們分別implements MouseListener與MouseMotionListener.

*/

public class MouseDemo3 extends JFrame implements MouseListener,MouseMotionListener{

int flag;//flag=1代表Mouse Moved,flag=2代表Mouse Dragged

int x=0;

int y=0;

int startx,starty,endx,endy;//起始坐標(biāo)與終點坐標(biāo)

public MouseDemo3(){

Container contentPane=getContentPane();

contentPane.addMouseListener(this);

contentPane.addMouseMotionListener(this);

setSize(300,300);

show();

addWindowListener(

new WindowAdapter(){

public void windowClosing(WindowEvent e){

System.exit(0);

}

}

);

}

/*由mousePressed(),mouseReleased()取得示拖曳的開始與結(jié)束坐標(biāo)*/

public void mousePressed(MouseEvent e){

startx=e.getX();

starty=e.getY();

}

public void mouseReleased(MouseEvent e){

endx=e.getX();

endy=e.getY();

}

public void mouseEntered(MouseEvent e){ }

public void mouseExited(MouseEvent e){ }

public void mouseClicked(MouseEvent e){ }

/*mouseMoved(),mouseDragged()取得鼠標(biāo)移動的每一個坐標(biāo),并調(diào)用repaint()方法*/

public void mouseMoved(MouseEvent e){

flag=1;

x=e.getX();

y=e.getY();

repaint();

}

public void mouseDragged(MouseEvent e){

flag=2;

x=e.getX();

y=e.getY();

repaint();

}

public void update(Graphics g){

g.setColor(this.getBackground());

g.fillRect(0,0,getWidth(),getHeight());

paint(g);

}

public void paint(Graphics g){

g.setColor(Color.black);

if (flag==1){

g.drawString("鼠標(biāo)坐標(biāo):("+x+","+y+";)",10,50);

g.drawLine(startx,starty,endx,endy);

}

if (flag==2){

g.drawString("拖曳鼠標(biāo)價坐標(biāo):("+x+","+y+";)",10,50);

g.drawLine(startx,starty,x,y);

}

}

public static void main(String[] args){

new MouseDemo3();

}

}

例3

實現(xiàn)一個簡單的鼠標(biāo)控制程序MouseController。程序功能很簡單:隨機移動鼠標(biāo)并點擊左鍵。

代碼如下:

import java.awt.AWTException;

import java.awt.Dimension;

import java.awt.Robot;

import java.awt.Toolkit;

import java.awt.event.InputEvent;

import java.util.Random;

/**

*

*/

/**

* @Create date 2007-11-6

*/

public class MouseController implements Runnable {

private Dimension dim;

private Random rand;

private Robot robot;

private volatile boolean stop = false;

public MouseController() {

dim = Toolkit.getDefaultToolkit().getScreenSize();

rand = new Random();

try {

robot = new Robot();

} catch (AWTException ex) {

ex.printStackTrace();

}

}

public void run() {

while(!stop) {

int x = rand.nextInt(dim.width);

int y = rand.nextInt(dim.height);

robot.mouseMove(x, y);

robot.mousePress(InputEvent.BUTTON1_MASK);

try {

Thread.sleep(2000);

} catch (InterruptedException ex) {

ex.printStackTrace();

}

}

}

public synchronized void stop() {

stop = true;

}

public static void main(String[] args) {

MouseController mc = new MouseController();

Thre

$False$

ad mcThread = new Thread(mc);

System.out.println("Mouse Controller start");

mcThread.start();

try {

Thread.sleep(60000);

} catch (InterruptedException ex) {

ex.printStackTrace();

}

mc.stop();

System.out.println("Mouse Controller stoped");

}

}

例4 本例程演示鼠標(biāo)監(jiān)聽器,鼠標(biāo)點擊和運動的監(jiān)聽。

///

// MouseEvt.java

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

class MyPanel extends JPanel implements MouseMotionListener{

public MyPanel() {

addMouseListener(new MouseAdapter() {

publicvoid mouseClicked(MouseEvent evt) {

if (evt.getClickCount() = 2)

System.out.println("\n雙擊鼠標(biāo)");

int x = evt.getX(); int y = evt.getY();

System.out.println("點擊鼠標(biāo)的位置\nX:" + x + "\ty: " + y);

}

});

addMouseMotionListener(this);

}

publicvoid mouseMoved(MouseEvent evt){

System.out.println("\n鼠標(biāo)正在移動");

}

publicvoid mouseDragged(MouseEvent evt){

System.out.println("\n鼠標(biāo)正在拖動");

}

}

class MyFrame extends JFrame{

public MyFrame(){

setTitle("鼠標(biāo)事件示例程序");

setSize(300, 200);

addWindowListener(new WindowAdapter(){

publicvoid windowClosing(WindowEvent e){

System.exit(0);

}

} );

Container contentPane = getContentPane();

contentPane.add(new MyPanel());

}

}

publicclass MouseEvt{

publicstaticvoid main(String[] args){

JFrame frame = new MyFrame();

frame.setVisible(true);

}

}

///

簡要說明

在MyPanel的構(gòu)建器中添加了鼠標(biāo)適配器來監(jiān)聽鼠標(biāo)點擊數(shù)和位置。也添加了運動監(jiān)聽器來處理移動和拖放操作。

鼠標(biāo)雙擊事件

鼠標(biāo)的單雙擊事件在很多時候?qū)ξ覀儙椭艽?但是在JAVA中卻沒有給出鼠標(biāo)雙擊事件.我們可以通過事件源e.getClickCount()==2來判斷鼠標(biāo)點擊次數(shù)來實現(xiàn)鼠標(biāo)雙擊事件,例如: public class MyMouseListener

extends java.awt.event.MouseAdapter ...{

public void mouseClicked(MouseEvent e) ...{

System.out.println("clicked");

int clickTimes = e.getClickCount();

if (clickTimes == 2) ...{

System.out.println("Doublc Clicked!");

}

}

}

但是這樣并沒有達(dá)到我們的要求,因為在每次觸發(fā)雙擊事件的同時會觸發(fā)單擊事件.所以我們試圖改進(jìn)以上方案,不使用系統(tǒng)提供的e.getClickCount()方法.可以考慮當(dāng)?shù)谝淮螁螕羰髽?biāo)的時候讓鼠標(biāo)單擊事件延時0.2秒執(zhí)行,而在這段時間里等待第二次單擊,如果有第二次單擊,那么我們執(zhí)行雙擊事件任務(wù),取消單擊任務(wù);如果在這段時間沒有等到再次單擊,那么執(zhí)行單擊任務(wù).

下面是用定時器延時單擊事件實現(xiàn)鼠標(biāo)雙擊事件,單擊和雙擊事件互不影響!

public class MyMouseListener

extends java.awt.event.MouseAdapter ...{

private static boolean flag=false;//用來判斷是否已經(jīng)執(zhí)行雙擊事件

private static int clickNum=0;//用來判斷是否該執(zhí)行雙擊事件

public void mouseClicked(MouseEvent e) ...{

final MouseEvent me=e;//事件源

this.flag=false;//每次點擊鼠標(biāo)初始化雙擊事件執(zhí)行標(biāo)志為false

if (this.clickNum == 1) ...{//當(dāng)clickNum==1時執(zhí)行雙擊事件

this.mouseDoubleClicked(me);//執(zhí)行雙擊事件

this.clickNum=0;//初始化雙擊事件執(zhí)行標(biāo)志為0

this.flag=true;//雙擊事件已執(zhí)行,事件標(biāo)志為true

return;

}

//定義定時器

java.util.Timer timer=new java.util.Timer();

//定時器開始執(zhí)行,延時0.2秒后確定是否執(zhí)行單擊事件

timer.schedule(new java.util.TimerTask() ...{

private int n=0;//記錄定時器執(zhí)行次數(shù)

public void run() ...{

if(MyMouseListener.flag)...{//如果雙擊事件已經(jīng)執(zhí)行,那么直接取消單擊執(zhí)行

n=0;

MyMouseListener.clickNum=0;

this.cancel();

return;

}

if (n == 1) ...{//定時器等待0.2秒后,雙擊事件仍未發(fā)生,執(zhí)行單擊事件

mouseSingleClicked(me);//執(zhí)行單擊事件

MyMouseListener.flag = true;

MyMouseListener.clickNum=0;

n=0;

this.cancel();

return;

}

clickNum++;

n++;

}

},new java.util.Date(),500);

}

/** *//**

* 鼠標(biāo)單擊事件

* @param e 事件源參數(shù)

*/

public void mouseSingleClicked(MouseEvent e)...{

System.out.println("Single Clicked!");

}

/** *//**

* 鼠標(biāo)雙擊事件

* @param e 事件源參數(shù)

*/

public void mouseDoubleClicked(MouseEvent e)...{

System.out.println("Doublc Clicked!");

}

}

//Test.java

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class Test extends JFrame{

public Test(){

super("test");

init();

this.setSize(800,600);

this.setVisible(true);

}

private void init(){

JButton b=new JButton("button");

b.setBounds(50,50,100,30);

this.getContentPane().setLayout(null);

this.getContentPane().add(b);

b.addMouseListener(new MyMouseListener());

}

public static void main(String args[]){

new Test();

}

}

鍵盤監(jiān)聽器

鍵盤監(jiān)聽器KeyListener用來監(jiān)聽鍵盤事件。鍵盤事件有三種:KEY_PRESSED鍵按下了,KEY_RELEASED鍵松開了,KEY_TYPED鍵按過了。每個鍵都有一個鍵碼,普通鍵的鍵碼就是ASCII碼。鍵碼可通過int getKeyCode()方法獲得。Java設(shè)置了一種“虛擬鍵碼”(Virtual Key Code),用“VK_”作為前綴,例如VK_G。下面是某些特殊鍵的虛擬鍵碼。

鍵碼 含義 鍵碼 含義

VK_LEFT/VK_RIGHT 左右方向鍵 VK_CONTROL Ctrl鍵

VK_KP_UP 小鍵盤向上 VK_ATL Alt鍵

VK_PAUSE 暫停鍵 VK_SHIFT Shift鍵

VK_NUMBER0 小鍵盤數(shù)字0 VK_F1 功能鍵F1

VK_0 數(shù)字鍵0 VK_B 字母鍵B

虛擬鍵碼對應(yīng)的是鍵位,不區(qū)分大小寫。要想知道大小寫還必須查看修飾鍵(modifier key)。這由輸入事件InputEvent的getModifere()方法得到,把返回值與常量SHIFT_MASK, CONTROL_MASK, ALT_MASK比較,用以判定哪個修飾鍵處于“同時按下”狀態(tài)。

監(jiān)聽器KeyListener有三個方法keyPressed(KeyEvent evt),keyReleased(KeyEvent evt),keyTyped(KeyEvent evt),分別用于相應(yīng)事件發(fā)生后的處理。下面的例程中給自己的鍵盤監(jiān)聽器建立了showKeyEventMsg方法來顯示按鍵信息。

除了getKeyCode()方法得到鍵碼外,還可用getKeyChar()方法得到輸入的字符,用getKeyText(code)方法得到輸入的字符串。用isShiftDown()判斷shift鍵是否被按下等。當(dāng)按下Control鍵時getKeyText返回的是“ctrl",Alt和Shift也類似。

下面的例子演示得到鍵碼和字符的方法,在命令行上顯示結(jié)果。

例1 本例程演示鍵盤監(jiān)聽器后鍵碼的用法。

///

// KeyEvt.java

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

class MyKeyListener implements KeyListener{

publicvoid keyPressed(KeyEvent evt) {

System.out.println("\n按鍵被按下");

showKeyEventMsg(evt);

}

publicvoid keyReleased(KeyEvent evt){ }

publicvoid keyTyped(KeyEvent evt) { }

privatevoid showKeyEventMsg(KeyEvent evt){//顯示按鍵事件信息

//得到按鍵對應(yīng)的整型數(shù)

int code = evt.getKeyCode();

//返回按鍵事件所代表的字符

char c = evt.getKeyChar();

//得到代表按鍵的字符串

String szText = evt.getKeyText(code);

if (code != KeyEvent.VK_UNDEFINED)

System.out.println("\n按鍵對應(yīng)的整型數(shù):"+code);

if (c != KeyEvent.CHAR_UNDEFINED)

System.out.println("\n與按鍵相聯(lián)系的字符:"+c);

if (evt.isShiftDown())

System.out.println("\n按鍵Shift被按下");

System.out.println("\n按鍵本身的字符串:"+szText);

}

}

class ButtonPanel extends JPanel{

public ButtonPanel() {

//新建一個文本域組件

tf = new JTextField(20);

add(tf);

//指定用來處理該按鈕事件的監(jiān)聽器對象為JPanel本身

myListener = new MyKeyListener();

tf.addKeyListener(myListener);

}

private JTextField tf;

private MyKeyListener myListener;

}

class ButtonFrame extends JFrame{

public ButtonFrame() {

setTitle("鍵盤事件示例程序");

setSize(300, 200);

setLocation(100,100);

addWindowListener(new WindowAdapter() {

publicvoid windowClosing(WindowEvent e)

{ System.exit(0);

}

});

Container ctPane = getContentPane();

ctPane.add(new ButtonPanel());

}

}

publicclass KeyEvt{

publicstaticvoid main(String[] args) {

JFrame frame = new ButtonFrame();

frame.setVisible(true);

}

}

///簡要說明

程序建立了自己的鍵盤監(jiān)聽器MyKeyListener,定義了一個新方法showKeyEventMsg用來在標(biāo)準(zhǔn)輸出設(shè)備上顯示有關(guān)的鍵盤信息。

在面版ButtonPanel上建立文本框并加鍵盤監(jiān)聽器。把面版ButtonPanel放到窗口ButtonFrame中。

Java網(wǎng)絡(luò)編程,客戶端和服務(wù)端相互發(fā)送信息,可是我寫的雙方都沒讀到對方發(fā)送的信息,代碼如下

這個地方有問題,第一,你必須寫入newLine,要不會造成阻塞;第二,你必須先flush后才能讀服務(wù)器;第三,你從控制臺輸入應(yīng)該有個結(jié)束標(biāo)志,要不你在while里面把bw關(guān)閉了,你還怎么循環(huán)

客戶端這個地方重寫一下,

while(true) {

temp=br.readLine();

if(temp.equals("over")){

break;

}

bw.write(temp);

bw.newLine();//如果沒有,使用readLine則會造成莫名等待

bw.flush();

}

不一定改全了,你先試試這些改動,如有問題再找

【轉(zhuǎn)】如何保護(hù)Java代碼

以下從技術(shù)角度就常見的保護(hù)措施 和常用工具來看看如何有效保護(hù)java代碼:1. 將java包裝成exe 特點:將jar包裝成可執(zhí)行文件,便于使用,但對java程序沒有任何保護(hù)。不要以為生成了exe就和普通可執(zhí)行文件效果一樣了。這些包裝成exe的程序運行時都會將jar文件釋放到臨時目錄,很容易獲取。常用的工具有exe4j、jsmooth、NativeJ等等。jsmooth生成的exe運行時臨時目錄在exe所在目錄中或是用戶臨時目錄 中;exe4j生成的exe運行時臨時目錄在用戶臨時目錄中;NativeJ生成的exe直接用winrar打開,然后用zip格式修復(fù)成一個jar文件,就得到了原文件。如果只是為了使用和發(fā)布方便,不需要保護(hù)java代碼,使用這些工具是很好的選擇。2. java混淆器特點:使用一種或多種處理方式將class文件、java源代碼進(jìn)行混淆處理后生成新的class,使混淆后的代碼不易被反編譯,而反編譯后的代碼難以閱 讀和理解。這類混淆器工具很多,而且也很有成效。缺點:雖然混淆的代碼反編譯后不易讀懂,但對于有經(jīng)驗的人或是多花些時間,還是能找到或計算出你代碼中隱藏的敏感內(nèi)容,而且在很多應(yīng)用中不是全部代碼都能混淆的,往往一些關(guān)鍵的庫、類名、方法名、變量名等因使用要求的限制反而還不能混淆。3. 隔離java程序到服務(wù)端特點:把java程序放到服務(wù)端,讓用戶不能訪問到class文件和相關(guān)配套文件,客戶端只通過接口訪問。這種方式在客戶/服務(wù)模式的應(yīng)用中能較好地保護(hù)java代碼。缺點是:必須是客戶/服務(wù)模式,這種特點限制了此種方式的使用范圍;客戶端因為邏輯的暴露始終是較為薄弱的環(huán)節(jié),所以訪問接口時一般都需要安全性認(rèn)證。4. java加密保護(hù)特點:自定義ClassLoader,將class文件和相關(guān)文件加密,運行時由此ClassLoader解密相關(guān)文件并裝載類,要起到保護(hù)作用必須自定 義本地代碼執(zhí)行器將自定義ClassLoader和加密解密的相關(guān)類和配套文件也保護(hù)起來。此種方式能很有效地保護(hù)java代碼。缺點:可以通過替換JRE包中與類裝載相關(guān)的java類或虛擬機動態(tài)庫截獲java字節(jié)碼。 jar2exe屬于這類工具。5. 提前編譯技術(shù)(AOT) 特點:將java代碼靜態(tài)編譯成本地機器碼,脫離通用JRE。此種方式能夠非常有效地保護(hù)java代碼,且程序啟動比通用JVM快一點。具有代表性的是GNU的gcj,可以做到對java代碼完全提前編譯,但gcj存在諸多局限性,如:對JRE 5不能完整支持、不支持JRE 6及以后的版本。由于java平臺的復(fù)雜性,做到能及時支持最新java版本和JRE的完全提前編譯是非常困難的,所以這類工具往往采取靈活方式,該用即時編譯的地方還是 要用,成為提前編譯和即時編譯的混合體。缺點:由于與通用JRE的差異和java運用中的復(fù)雜性,并非java程序中的所有jar都能得到完全的保護(hù);只能使用此種工具提供的一個運行環(huán)境,如果工具更新滯后或你需要特定版本的JRE,有可能得不到此種工具的支持。 Excelsior JET屬于這類工具。6. 使用jni方式保護(hù)特點:將敏感的方法和數(shù)據(jù)通過jni方式處理。此種方式和“隔離java程序到服務(wù)端”有些類似,可以看作把需要保護(hù)的代碼和數(shù)據(jù)“隔離”到動態(tài)庫中,不同的是可以在單機程序中運用。缺點和上述“隔離java程序到服務(wù)端”類似。7. 不脫離JRE的綜合方式保護(hù)特點:非提前編譯,不脫離JRE,采用多種軟保護(hù)方式,從多方面防止java程序被竊取。此種方式由于采取了多種保護(hù)措施,比如自定義執(zhí)行器和裝載器、加密、JNI、安全性檢測、生成可執(zhí)行文件等等,使保護(hù)力度大大增強,同樣能夠非常有效地保護(hù)java代碼。缺點:由于jar文件存在方式的改變和java運用中的復(fù)雜性,并非java程序中的所有jar都能得到完全的保護(hù);很有可能并不支持所有的JRE版本。 JXMaker屬于此類工具。8. 用加密鎖硬件保護(hù)特點:使用與硬件相關(guān)的專用程序?qū)ava虛擬機啟動程序加殼,將虛擬機配套文件和java程序加密,啟動的是加殼程序,由加殼程序建立一個與硬件相關(guān)的 受保護(hù)的運行環(huán)境,為了加強安全性可以和加密鎖內(nèi)植入的程序互動。此種方式與以上“不脫離JRE的綜合方式保護(hù)”相似,只是使用了專用硬件設(shè)備,也能很好地保護(hù)java代碼。缺點:有人認(rèn)為加密鎖用戶使用上不太方便,且每個安裝需要附帶一個。從以上描述中我們可以看出:1. 各種保護(hù)方式都有其優(yōu)缺點,應(yīng)根據(jù)實際選用2. 要更好地保護(hù)java代碼應(yīng)該使用綜合的保護(hù)措施3. 單機環(huán)境中要真正有效保護(hù)java代碼,必須要有本地代碼程序配合當(dāng)然,安全都是相對的,一方面看你的保護(hù)措施和使用的工具能達(dá)到的程度,一方面看黑客的意愿和能力,不能只從技術(shù)上保護(hù)知識產(chǎn)權(quán)??傊趈ava 代碼保護(hù)方面可以采取各種可能的方式,不可拘泥于那些條條框框。

jaVa中多對多關(guān)系的代碼問題

你在Hobby和Person之間徘徊,造成一個死循環(huán)了,我覺你不應(yīng)該是這樣映射,這樣會好麻煩的

package association;

import java.util.*;

public class Hobby {

/* Hobby類的屬性hobbyname,一個vector型的persons */

private String hobbyname;

private Vector persons = new Vector();

/* 構(gòu)造函數(shù) */

public Hobby(String hobbyname, Person person) {

this.hobbyname = hobbyname;

persons.add(person);

/**

* 一個業(yè)余愛好可以對應(yīng)多個人,但只對應(yīng)一次

*/

if (!persons.contains(person))

person.addHobby(hobbyname);

}

/* 得到hobbyname */

public String getHobbyname() {

return hobbyname;

}

/* 一個hobby可以有多個person,添加person的方法 */

public void addPerson(String personname, int age) {

persons.add(new Person(personname, age));

}

/* 輸出hobbyname,并將有hobbyname的人名全部輸出 */

public String toString() {

String s = "hobbyname:" + hobbyname + "\n";

s += " persons:";

Object[] o = persons.toArray();

Person[] p = new Person[o.length];

for (int i = 0; i p.length; i++) {

p[i] = (Person) o[i];

s += p[i].getPersonname() + " " + p[i].getAge() + "; ";

}

return s;

}

/* 用于測試的主函數(shù) */

public static void main(String arg[]) throws Exception {

Person p1 = new Person("mary", 20);

p1.addHobby("Biking");

Hobby h2 = new Hobby("Swimming", p1);

String s = p1.toString() + "\n";

s += h2.toString() + "\n";

System.out.print(s);

}

}

class Person {

/* person類的屬性personname,age和一個vector型的hobbies */

private String personname;

private int age;

private Vector hobbies = new Vector();

/* 構(gòu)造函數(shù) */

public Person(String personname, int age) {

this.age = age;

this.personname = personname;

}

/* 得到personname */

public String getPersonname() {

return personname;

}

/* 得到age */

public int getAge() {

return age;

}

/* 添加hobby的方法 */

public void addHobby(String hobbyname) {

hobbies.add(new Hobby(hobbyname, this));

}

/* 輸出person,并將其愛好全部輸出 */

public String toString() {

String s = "personname:" + personname + "\n";

s += " hobbies:";

Object[] o = hobbies.toArray();

Hobby[] h = new Hobby[o.length];

for (int i = 0; i h.length; i++) {

h[i] = (Hobby) o[i];

s += h[i].getHobbyname() + " ";

}

return s;

}

}


網(wǎng)站名稱:互信息java代碼的簡單介紹
URL地址:http://weahome.cn/article/hjhhhj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部