p301随手画面板例程
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.Graphics;
import java.awt.Point;
import java.util.Vector;
import javax.swing.JPanel;
public class J_Panel extends JPanel
{private Vector<Vector<Point>> m_vectorSet= new Vector<Vector<Point>>( );public J_Panel( ){addMouseListener( new MouseAdapter( ){public void mousePressed(MouseEvent e){Point p= new Point(e.getX( ), e.getY( ));Vector<Point> v= new Vector<Point>( ); // 新的笔划v.add(p); // 添加笔划的起点m_vectorSet.add(v);} // 方法mousePressed结束} // 实现抽象类MouseAdapter的内部子类结束); // addMouseListener方法调用结束addMouseMotionListener( new MouseMotionAdapter( ){public void mouseDragged(MouseEvent e) {Point p= new Point(e.getX( ), e.getY( ));int n= m_vectorSet.size( )-1;Vector<Point> v= m_vectorSet.get(n);v.add(p); // 添加笔划的中间点或终点repaint( );} // 方法mouseDragged结束} // 实现抽象类MouseMotionAdapter的内部子类结束); // addMouseMotionListener方法调用结束} // J_Panel构造方法结束protected void paintComponent(Graphics g){g.clearRect(0 , 0, getWidth( ), getHeight( )); // 清除背景Vector<Point> v;Point s, t;int i, j, m;int n = m_vectorSet.size( );for (i=0; i<n; i++){v = m_vectorSet.get(i);m = v.size( )-1;for (j=0; j<m; j++){s = (Point)v.get(j);t = (Point)v.get(j+1);g.drawLine(s.x, s.y, t.x, t.y);} // 内部for循环结束} // 外部for循环结束} // 方法paintComponent结束public Dimension getPreferredSize( ){return new Dimension( 250, 120 );} // 方法getPreferredSize结束
} // 类J_Panel结束
p306键盘事件处理例程
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class J_Keyboard extends JFrame
{public J_Keyboard( ){super( "键盘事件处理例程" );Container c = getContentPane( );JTextField tf = new JTextField("", 15);tf.addFocusListener( new FocusListener( ){public void focusGained(FocusEvent e){System.out.println("获得焦点");} // 方法focusGained结束public void focusLost(FocusEvent e){System.out.println("失去焦点");} // 方法focusLost结束} // 实现接口FocusListener的内部类结束); // addFocusListener方法调用结束tf.addKeyListener( new KeyAdapter( ){public void keyTyped(KeyEvent e){System.out.println("键盘事件: " + e.getKeyChar( ));} // 方法keyTyped结束} // 实现抽象类KeyAdapter的内部子类结束); // addKeyListener方法调用结束c.add( tf, BorderLayout.CENTER );} // J_Keyboard构造方法结束public static void main(String args[ ]){J_Keyboard app = new J_Keyboard( );app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);app.setSize( 350, 80 );app.setVisible( true );} // 方法main结束
} // 类J_Keyboard结束
p309常规菜单例程
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class J_Menu extends JFrame
{public J_Menu( ){super("常规菜单应用示例");JMenuBar mBar = new JMenuBar( );setJMenuBar(mBar); // 设置菜单栏JMenu [ ] m = { new JMenu("文件(F)"), new JMenu("编辑(E)") };char [ ][ ] mC = {{'F', 'E'}, {'O', 'S'}, {'C', 'V'}};JMenuItem [ ] [ ] mI ={{new JMenuItem("打开(O)"), new JMenuItem("保存(S)")},{new JMenuItem("拷贝(C)"), new JMenuItem("粘帖(V)")}};int i, j;for (i=0; i < m.length; i++){mBar.add(m[i]); // 添加下拉式菜单m[i].setMnemonic(mC[0][i]); // 设置助记符for (j=0; j < mI[i].length; j++){m[i].add(mI[i][j]); // 添加命令式菜单项mI[i][j].setMnemonic(mC[i+1][j]); // 设置助记符mI[i][j].setAccelerator( // 设置快捷键KeyStroke.getKeyStroke("ctrl " + mC[i+1][j]));mI[i][j].addActionListener( new ActionListener( ){public void actionPerformed(ActionEvent e){JMenuItem mItem = (JMenuItem)e.getSource( );System.out.println("运行菜单项: "+ mItem.getText( ));} // 方法actionPerformed结束} // 实现接口ActionListener的内部类结束); // 方法addActionListener调用结束} // 内部for循环结束} // 外部for循环结束m[0].insertSeparator(1); } // J_Menu构造方法结束public static void main(String args[ ]){JFrame app = new J_Menu( );app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);app.setSize(250, 120);app.setVisible(true);} // 方法main结束
} // 类J_Menu结束
p315弹出式菜单例程
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
public class J_PopupMenu extends JFrame
{private JPopupMenu m_popupMenu;public J_PopupMenu( ){super("弹出式菜单应用示例");m_popupMenu= new JPopupMenu( );JMenu [ ] m = { new JMenu("文件(F)"), new JMenu("编辑(E)") };char [ ][ ] mC = {{'F', 'E'}, {'O', 'S'}, {'C', 'V'}};JMenuItem [ ] [ ] mI ={{new JMenuItem("打开(O)"), new JMenuItem("保存(S)")},{new JMenuItem("拷贝(C)"), new JMenuItem("粘帖(V)")}};int i, j;for (i=0; i < m.length; i++){m_popupMenu.add(m[i]); // 添加下拉式菜单m[i].setMnemonic(mC[0][i]); // 设置助记符for (j=0; j < mI[i].length; j++){m[i].add(mI[i][j]); // 添加命令式菜单项mI[i][j].setMnemonic(mC[i+1][j]); // 设置助记符mI[i][j].setAccelerator( // 设置快捷键KeyStroke.getKeyStroke("ctrl " + mC[i+1][j]));mI[i][j].addActionListener( new ActionListener( ){public void actionPerformed(ActionEvent e){JMenuItem mItem= (JMenuItem)e.getSource( );System.out.println("运行菜单项: "+ mItem.getText( ));} // 方法actionPerformed结束} // 实现接口ActionListener的内部类结束); // 方法addActionListener调用结束} // 内部for循环结束} // 外部for循环结束m[0].insertSeparator(1);addMouseListener( new MouseAdapter( ){public void mousePressed( MouseEvent e ){if ( e.isPopupTrigger( ) ) m_popupMenu.show(e.getComponent( ),e.getX( ), e.getY( ) );} // 方法mousePressed结束public void mouseReleased( MouseEvent e ){mousePressed(e);} // 方法mouseReleased结束} // 父类型为类MouseAdapter的匿名内部类结束); // 方法addMouseListener调用结束} // J_PopupMenu构造方法结束public static void main(String args[ ]){JFrame app = new J_PopupMenu( );app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);app.setSize(250, 120);app.setVisible(true);} // 方法main结束
} // 类J_PopupMenu结束
p318表格例程
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.table.*;
import java.util.Vector;
public class J_Table extends JFrame
{DefaultTableModel m_data;JTable m_view;public J_Table( ){super("表格应用示例");Container c = getContentPane( );c.setLayout( new FlowLayout( ) );int i;// 添加四个按钮JButton [ ] b = {new JButton("添加行"), new JButton("添加列"),new JButton("删除行"), new JButton("删除列")};for (i=0; i<4; i++)c.add(b[i]);m_data = new DefaultTableModel( ); // 创建一个空的数据表格m_view = new JTable(m_data);m_view.setPreferredScrollableViewportSize(new Dimension(300, 150)); // 设置表格的显示区域大小m_view.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);JScrollPane sPane = new JScrollPane(m_view);c.add(sPane);b[0].addActionListener( new ActionListener( ){public void actionPerformed(ActionEvent e){mb_addRow( );System.out.println("添加一行");} // 方法actionPerformed结束} // 实现接口ActionListener的内部类结束); // 方法addActionListener调用结束b[1].addActionListener( new ActionListener( ){public void actionPerformed(ActionEvent e){mb_addColumn( );System.out.println("添加一列");} // 方法actionPerformed结束} // 实现接口ActionListener的内部类结束); // 方法addActionListener调用结束b[2].addActionListener( new ActionListener( ){public void actionPerformed(ActionEvent e){mb_deleteRow( );System.out.println("删除当前行");} // 方法actionPerformed结束} // 实现接口ActionListener的内部类结束); // 方法addActionListener调用结束b[3].addActionListener( new ActionListener( ){public void actionPerformed(ActionEvent e){mb_deleteColumn( );System.out.println("删除当前列");} // 方法actionPerformed结束} // 实现接口ActionListener的内部类结束); // 方法addActionListener调用结束} // J_Table构造方法结束public void mb_addColumn( ) // 添加一列{int cNum = m_data.getColumnCount( );int rNum = m_data.getRowCount( );String s = "列" + (cNum+1);int c = m_view.getSelectedColumn( );System.out.println( "当前列号为:" + c);if (cNum==0 || rNum==0 || c<0){m_data.addColumn( s );return;} // if结构结束c++;Vector<String> vs = mb_getColumnNames( ); // 表头的处理vs.add(c, s);Vector data = m_data.getDataVector( );for (int i=0; i<data.size( ); i++){Vector e = (Vector) data.get(i);e.add(c, new String(""));} // for循环结束m_data.setDataVector(data, vs);} // 方法mb_addColumn结束public void mb_addRow( ) // 添加一行{int cNum = m_data.getColumnCount( );if (cNum==0)mb_addColumn( );int rNum = m_data.getRowCount( );int r = mb_getRowCurrent( );System.out.println( "当前行号为:" + r);m_data.insertRow( r, (Vector)null );} // 方法mb_addRow结束public void mb_deleteColumn( ) // 删除一列{int cNum = m_data.getColumnCount( );if (cNum==0)return;int c = m_view.getSelectedColumn( );if (c<0)c = 0;System.out.println( "当前列号为:" + c);Vector<String> vs = mb_getColumnNames( ); // 表头的处理vs.remove(c);Vector data = m_data.getDataVector( );for (int i=0; i<data.size( ); i++){Vector e = (Vector) data.get(i);e.remove(c);} // for循环结束m_data.setDataVector(data, vs);} // 方法mb_deleteColumn结束public void mb_deleteRow( ) // 删除一行{int rNum = m_data.getRowCount( );if (rNum > 0){int rEdit = mb_getRowCurrent( );m_data.removeRow( rEdit );}} // 方法mb_deleteRow结束public Vector<String> mb_getColumnNames( ) // 取得列名称{Vector<String> vs = new Vector<String>( );int cNum = m_data.getColumnCount( );for (int i=0; i<cNum; i++)vs.add(m_data.getColumnName(i));return(vs);} // 方法mb_getColumnNames结束public int mb_getRowCurrent( ) // 取得当前行的行号{int r=m_view.getSelectedRow( );if (r<0)r = 0;return(r);} // 方法mb_getRowCurrent结束public static void main(String args[ ]){JFrame app = new J_Table( );app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);app.setSize(350, 250);app.setVisible(true);} // 方法main结束
} // 类J_Table结束
p327随手画多文档例程
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JDesktopPane;
import javax.swing.JInternalFrame;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
public class J_MDI extends JFrame
{private JDesktopPane m_desktop= new JDesktopPane( );private int m_count = 0;public J_MDI( ){super("MDI Example");JMenuBar theMenuBar = new JMenuBar( );JMenu theMenuFile = new JMenu("File");JMenuItem theMenuItem = new JMenuItem("New");setJMenuBar(theMenuBar);theMenuBar.add(theMenuFile);theMenuFile.add(theMenuItem);theMenuFile.setMnemonic('F');theMenuItem.setMnemonic('N');Container theContainer= getContentPane( );theContainer.add(m_desktop);theMenuItem.addActionListener( new ActionListener( ){public void actionPerformed(ActionEvent e){String s= "Document " + m_count;m_count++;JInternalFrame theInternalFrame=new JInternalFrame(s, true, true, true, true);J_Panel thePanel = new J_Panel( );Container c = theInternalFrame.getContentPane( );c.setLayout(new BorderLayout( ));c.add( thePanel, BorderLayout.CENTER );theInternalFrame.pack( );m_desktop.add( theInternalFrame );theInternalFrame.setVisible( true );} // 方法actionPerformed结束} // 实现接口ActionListener的内部类结束); // ActionListener方法调用结束} // J_MDI构造方法结束public static void main(String args[ ]){JFrame app = new J_MDI( );Container cp = app.getContentPane( );app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);app.setSize(400, 250);app.setVisible(true);} // 方法main结束
} // 类J_MDI结束
p330AWT图形用户界面例程
public class J_AWT
{public static void main(String args[ ]){java.awt.Frame app = new java.awt.Frame( );app.setTitle("AWT框架");app.add(new java.awt.Button("AWT按钮"),java.awt.BorderLayout.CENTER);app.addWindowListener( new java.awt.event.WindowAdapter( ){public void windowClosing(java.awt.event.WindowEvent e){System.exit(0);} // 方法windowClosing结束} // 实现抽象类WindowAdapter的内部子类结束); // addWindowListener方法调用结束app.setSize(250, 100);app.setVisible(true);} // 方法main结束
} // 类J_AWT结束
p335小应用程序生命周期的验证例程
import java.awt.Graphics;
import javax.swing.JApplet;
public class J_PrintState extends JApplet
{public void init( ){System.out.println("init: 初始化");} // 方法init结束public void start( ){ System.out.println("start: 启动");} // 方法start结束public void paint(Graphics g){g.clearRect(0, 0, getWidth( ), getHeight( )); // 绘制背景g.drawString("验证小应用程序的生命周期", 20, 40);System.out.println("paint: 绘制");} // 方法paint结束public void stop( ){ System.out.println("stop: 停止");} // 方法stop结束public void destroy( ){ System.out.println("destroy: 关闭");} // 方法destroy结束
} // 类J_PrintState结束
p338小应用程序图形用户界面例程——输入数字
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JTextField;
public class J_Digit extends JApplet implements ActionListener
{private JTextField m_textField= new JTextField( );public void init( ){Container c = getContentPane( );JButton b;String [ ] s= {BorderLayout.SOUTH, BorderLayout.EAST,BorderLayout.NORTH, BorderLayout.WEST};for (int i=0; i<4; i++){b= new JButton(""+i);c.add(b, s[i]);b.addActionListener(this);} // for循环结束c.add(m_textField, BorderLayout.CENTER);} // 方法init结束public void actionPerformed(ActionEvent e){String s= m_textField.getText( )+e.getActionCommand( );m_textField.setText(s);} // 方法actionPerformed结束
} // 类J_Digit结束
p340绘制正弦曲线的小应用程序图形用户界面例程
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Graphics;
import javax.swing.JApplet;
import javax.swing.JPanel;
class J_Panel extends JPanel
{protected void paintComponent(Graphics g){double d, tx;int x, y, x0, y0;d= Math.PI/100; // 将曲线分成为约200段x0=y0=0;for (tx=0, x=20; tx <= 2*Math.PI; tx+=d, x++){ // 曲线绘制y= 120-(int)(Math.sin(tx)*50+60); // 缩放、平移、对称if (x>20)g.drawLine(x0, y0, x, y); // 将曲线分成为线段,然后逐段绘制x0= x;y0= y;} // for循环结束g.drawString("y=sin(x)", 10, 70);} // 方法paintComponent结束
} // 类J_Panel结束
public class J_DrawSin extends JApplet
{public void init( ){Container c = getContentPane( );c.add(new J_Panel( ), BorderLayout.CENTER);} // 方法init结束
} // 类J_DrawSin结束
p343系统属性信息显示小应用程序例程
import java.awt.Graphics;
import javax.swing.JApplet;
public class J_SystemApplet extends JApplet
{public void paint(Graphics g){String s[ ] = {"file.separator", "java.class.version","java.specification.name", "java.specification.vendor","java.specification.version", "java.vendor","java.vendor.url", "java.version", "java.vm.name","java.vm.specification.name","java.vm.specification.vendor","java.vm.specification.version","java.vm.vendor", "java.vm.version", "line.separator","os.arch", "os.name", "os.version", "path.separator","java.class.path", "java.compiler", "java.ext.dirs","java.home", "java.io.tmpdir", "java.library.path","user.dir", "user.home", "user.name"};String r;g.clearRect(0, 0, getWidth( ), getHeight( )); // 清除背景for (int i=0; i<s.length; i++){try{r = System.getProperty(s[i]);}catch (Exception e){r = "出现异常" + e;} // try-catch结构结束g.drawString(s[i] + ": " + r, 20, i*15+20);} // for循环结束} // 方法paint结束
} // 类J_SystemApplet结束
p345系统属性信息显示例程
public class J_System
{public static void main(String args[ ]){String s[ ] = {"file.separator", "java.class.path","java.class.version", "java.compiler", "java.ext.dirs","java.home", "java.io.tmpdir", "java.library.path","java.specification.name", "java.specification.vendor","java.specification.version", "java.vendor","java.vendor.url", "java.version", "java.vm.name","java.vm.specification.name","java.vm.specification.vendor","java.vm.specification.version","java.vm.vendor", "java.vm.version", "line.separator","os.arch", "os.name", "os.version", "path.separator","user.dir", "user.home", "user.name"};String r;for (int i=0; i<s.length; i++){try{r = System.getProperty(s[i]);}catch (Exception e){r = "出现异常" + e;} // try-catch结构结束System.out.println(s[i] + ": " + r);} // for循环结束} // 方法main结束
} // 类J_System结束
p353小应用程序例程——图像显示
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Image;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JApplet;
import javax.swing.JLabel;
import javax.swing.JList;
public class J_List extends JApplet
{private String m_items[ ] = { "snow.gif", "flag.gif" , "rain.gif"};private JList m_list = new JList( m_items );private JLabel m_label = new JLabel( );private Icon m_icons[ ] = new ImageIcon[3];public void init( ){Image theImage[ ] = {getImage(getCodeBase( ), m_items[0]), getImage(getCodeBase( ), m_items[1]),getImage(getCodeBase( ), m_items[2]) };for (int i=0; i< 3; i++)m_icons[i] = new ImageIcon(theImage[i]);Container c = getContentPane( );c.add( m_list, BorderLayout.WEST );m_list.setSelectedIndex(0);m_list.addListSelectionListener(new ListSelectionListener( ){public void valueChanged(ListSelectionEvent e ){int s = m_list.getAnchorSelectionIndex( );m_label.setIcon( m_icons[ s ] );} // 方法valueChanged结束} // 实现接口ListSelectionListener的内部类结束); // addListSelectionListener方法调用结束c.add( m_label, BorderLayout.EAST );m_label.setIcon( m_icons[ 0 ] );} // 方法init结束
} // 类J_List结束
p356小应用程序参数例程
import java.awt.Graphics;
import javax.swing.JApplet;
public class J_Applet extends JApplet
{public void paint(Graphics g){g.clearRect(0, 0, getWidth( ), getHeight( )); // 清除背景String s= getParameter("示例名");g.drawString("示例名的值为" + s, 10, 20);} // 方法paint结束
} // 类J_Applet结束
p358同时是应用程序与小应用程序的简单例程
import java.awt.Graphics;
import javax.swing.JApplet;
public class J_Hello extends JApplet
{public void paint(Graphics g){ g.clearRect(0, 0, getWidth( ), getHeight( )); // 清除背景g.drawString("您好!", 10, 20);} // 方法paint结束public static void main(String args[ ]){System.out.println("您好!");} // 方法main结束
} // 类J_Hello结束
p359同时是应用程序与小应用程序的图像显示例程
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Image;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JApplet;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
public class J_List extends JApplet
{private String m_items[ ] = { "snow.gif", "flag.gif" , "rain.gif"};private JList m_list = new JList( m_items );private JLabel m_label = new JLabel( );private Icon m_icons[ ] = new ImageIcon[3];private Image m_image[ ] = null;Container m_container = null;public void init( ){int i;if (m_image == null){m_image = new Image[3];for (i=0; i< 3; i++)m_image[i] = getImage(getCodeBase( ), m_items[i]);} // if结构结束for (i=0; i< 3; i++)m_icons[i] = new ImageIcon(m_image[i]);if (m_container == null)m_container = getContentPane( );m_container.setLayout(new BorderLayout( ));m_container.add( m_list, BorderLayout.WEST );m_list.setSelectedIndex(0);m_list.addListSelectionListener(new ListSelectionListener( ){public void valueChanged(ListSelectionEvent e ){int s = m_list.getAnchorSelectionIndex( );m_label.setIcon( m_icons[ s ] );} // 方法valueChanged结束} // 实现接口ListSelectionListener的内部类结束); // addListSelectionListener方法调用结束m_container.add( m_label, BorderLayout.EAST );m_label.setIcon( m_icons[ 0 ] );} // 方法init结束public static void main( String args[ ] ){ JFrame f = new JFrame("应用程序");J_List app = new J_List( );app.m_container= f.getContentPane( );app.m_image = new Image[3];try{for (int i=0; i< 3; i++)app.m_image[i] = ImageIO.read( new File(app.m_items[i]) );}catch (Exception e){System.err.println("发生异常:" + e);e.printStackTrace( );} // try-catch结构结束app.init( );f.setSize(200, 110);f.setVisible( true );f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);} // 方法main结束
} // 类J_List结束
p378计时器例程
package cn.edu.tsinghua.example;
import java.util.Date;
/*** 计时器。* <p>* 计时器可以记录开始的时间和终止的时间,* 并能计算出所花费的时间。** @author 雍俊海* @version 2.0* @since J2SE 1.6*/
public class J_Timer
{/** * 起始时间。 */private Date m_start;/** * 终止时间。 */private Date m_end;/** * 设置起始时间。 */public void mb_setStart( ){m_start = new Date( );} // 方法mb_setStart结束/** * 设置终止时间。 */public void mb_setEnd( ){m_end = new Date( );} // 方法mb_setEnd结束/** * 计算花费的时间。 * <p>* 花费的时间 = 终止时间 - 起始时间。* @return 花费的时间。*/public long mb_getTime( ){return(m_end.getTime( ) - m_start.getTime( ) );} // 方法mb_getTime结束
} // 类J_Timer结束
p380加法与乘法计算器例程
package cn.edu.tsinghua.example;
/*** 计算器。* <p>* 计算器加法与乘法。** @author 雍俊海* @version 2.0* @since J2SE 1.6*/
public class J_Calculator
{/** * 计算n次乘法。 * @param n 乘法的次数。* @return 最后一次乘法的结果。*/public static int mb_multiply(int n){int i, m;m = 1;for (i=1; i<=n; i++)m = i * n;return m;} // 方法mb_multiply结束/** * 计算n次加法。 * @param n 加法的次数。* @return 最后一次加法的结果。*/public static int mb_add(int n){int i, s;s = 0;for (i=1; i<=n; i++)s = i + n;return s;} // 方法mb_add结束
} // 类J_Calculator结束
p381加法与乘法运算效率比较例程
package cn.edu.tsinghua.example;
/*** 比较加法与乘法运算效率。** @author 雍俊海* @version 2.0* @since J2SE 1.6*/
public class J_Example
{/** * 比较加法与乘法运算效率。 * @param args 程序的参数,这里没有实际的含义。*/public static void main(String args[ ]){int n=100000000; // 运算次数J_Timer t = new J_Timer( ); // 计算加法的时间代价t.mb_setStart( );J_Calculator.mb_add( n );t.mb_setEnd( );long t1 = t.mb_getTime( );t.mb_setStart( ); // 计算乘法的时间代价J_Calculator.mb_multiply( n );t.mb_setEnd( );long t2 = t.mb_getTime( );// 输出比较结果System.out.println("计算" + n + "次加法需要" + t1 +"毫秒");System.out.println("计算" + n + "次乘法需要" + t2 +"毫秒");if (t1 < t2)System.out.println("结论: 加法快");else if (t1 > t2)System.out.println("结论: 乘法快");elseSystem.out.println("结论: 加法与乘法一样快");} // 方法main结束
} // 类J_Example结束
p384assert语句的应用例程
public class J_Assert
{public static void main(String args[ ]){assert (args.length > 0);if (args.length > 0)System.out.println(args[0]);} // 方法main结束
} // 类J_Assert结束
p386assert语句的应用例程
public class J_AssertString
{public static void main(String args[ ]){assert (args.length > 0) : "程序不含参数";if (args.length > 0)System.out.println(args[0]);} // 方法main结束
} // 类J_AssertString结束
p386判别assert语句的功能是否打开的例程
public class J_AssertEnable
{public static void main(String args[ ]){boolean assertionsAreEnabled = false;assert (assertionsAreEnabled = true);if (assertionsAreEnabled)System.out.println( "assert语句的功能已经打开" );elseSystem.out.println( "assert语句的功能已经关闭" );} // 方法main结束
} // 类J_AssertEnable结束
p390通过构造类Thread的子类创建线程的例程
public class J_Thread extends Thread
{private int m_threadID;public J_Thread(int i){m_threadID = i;System.out.println("创建线程: " + i);} // J_Thread构造方法结束public void run( ){for(int i=0; i<3; i++){System.out.println("运行线程: " + m_threadID);try{Thread.sleep((int)(Math.random( ) * 1000));}catch( InterruptedException e ){System.err.println("异常InterruptedException: " + e);e.printStackTrace( );} // try-catch结构结束} // for循环结束} // 方法run结束public static void main( String args[ ] ){ new J_Thread(1).start( );new J_Thread(2).start( );System.out.println("方法main结束");} // 方法main结束
} // 类J_Thread结束
p393通过接口Runnable构造线程的例程
public class J_ThreadRunnable implements Runnable
{private int m_threadID;public J_ThreadRunnable(int i){m_threadID=i;System.out.println("创建线程: " + i );} // J_ThreadRunnable构造方法结束public void run( ){for(int i=0; i<3; i++){System.out.println("运行线程: " + m_threadID);try{Thread.sleep((int)(Math.random( ) * 1000));}catch ( InterruptedException e ){System.err.println("异常InterruptedException: " + e);e.printStackTrace( );} // try-catch结构结束} // for循环结束} // 方法run结束public static void main( String args[ ] ){Thread t1= new Thread(new J_ThreadRunnable(1));t1.start( );Thread t2= new Thread(new J_ThreadRunnable(2));t2.start( );System.out.println("方法main结束");} // 方法main结束
} // 类J_ThreadRunnable结束
p395后台线程例程
public class J_ThreadDaemon extends Thread
{public void run( ){for(int i=0; true; i++){System.out.println("线程在运行: " + i);try{sleep((int)(Math.random( ) * 1000));}catch( InterruptedException e ){System.err.println(e);} // try-catch结构结束} // for循环结束} // 方法run结束public static void main(String args[ ]){J_ThreadDaemon t = new J_ThreadDaemon( );t.setDaemon(true);t.start( );if (t.isDaemon( ))System.out.println("创建一个后台线程");elseSystem.out.println("创建一个用户线程");System.out.println("主方法运行结束");} // 方法main结束
} // 类J_ThreadDaemon结束
p396用户线程例程(为了与后台线程比较运行的机制)`
public class J_ThreadUser extends Thread
{public void run( ){for(int i=0; true; i++){System.out.println("线程在运行: " + i);try{sleep((int)(Math.random( ) * 1000));}catch( InterruptedException e ){System.err.println(e);} // try-catch结构结束} // for循环结束} // 方法run结束public static void main(String args[ ]){J_ThreadUser t = new J_ThreadUser( );t.start( );if (t.isDaemon( ))System.out.println("创建一个后台线程");elseSystem.out.println("创建一个用户线程");System.out.println("主方法运行结束");} // 方法main结束
} // 类J_ThreadUser结束
p398获取当前正在运行的线程个数及其名称的例程
public class J_ThreadGroup
{ public static void main(String args[ ]){System.out.print("方法main所在的线程组含有");System.out.println(Thread.activeCount( ) + "个线程");Thread t= Thread.currentThread( );ThreadGroup tg=t.getThreadGroup( );for(; tg!=null; tg=tg.getParent( )){System.out.print("线程组" + tg.getName( ));System.out.print("含有");System.out.println(tg.activeCount( ) + "个线程");int n=tg.activeCount( );Thread[ ] tList=new Thread[n];int m=tg.enumerate(tList);for (int i=0; i<m; i++)System.out.println(" 其中第" + (i+1) + "个线程名为" + tList[i].getName( ));} // for循环结束} // 方法main结束
} // 类J_ThreadGroup结束
p404在实验室中进行数据更新与分析的例程,用于说明多线程并发问题
class J_Experiment // 实验
{private int m_temperature, m_pressure; // 温度与气压public void mb_update(int t, int p) // 数据更新{m_temperature = t;m_pressure = p;} // 方法mb_update结束public void mb_analyze( ) // 数据分析{int t= m_temperature;int p= m_pressure;for (int i=0; i<1000; i++) // 进行延时,使得并发问题更容易出现;if (t!=m_temperature) // 分析温度数据{System.out.print("实验数据出现情况: ");System.out.println("t(" + t + ") != (" + m_temperature + ")");System.exit(0);} // if结构结束if (p!= m_pressure) // 分析气压数据{System.out.print("实验数据出现情况: ");System.out.println("p(" + p + ") != (" + m_pressure + ")");System.exit(0);} // if结构结束} // 方法mb_analyze结束
} // 类J_Experiment结束
class J_Assistant extends Thread // 实验室的助理人员
{J_Experiment m_data;public J_Assistant(J_Experiment d){m_data= d;} // 构造方法J_Assistant结束public void run( ){int i, j;for(; true; ){i= (int)(Math.random( ) * 1000);j= (int)(Math.random( ) * 1000);m_data.mb_update(i, j);} // for循环结束} // 方法run结束
} // 类J_Assistant结束
class J_Analyst extends Thread // 实验室的分析人员
{J_Experiment m_data;public J_Analyst(J_Experiment d){m_data= d;} // 构造方法J_Analyst结束public void run( ){for(; true; )m_data.mb_analyze( );} // 方法run结束
} // 类J_Analyst结束
public class J_Synchronization
{public static void main( String args[ ] ){ J_Experiment data= new J_Experiment( );J_Assistant threadA = new J_Assistant(data);J_Analyst threadB = new J_Analyst(data);threadA.start( );threadB.start( );} // 方法main结束
} // 类J_Synchronization结束
p406由于多线程共享内存引发问题的例程——加减法失败
public class J_ThreadSum extends Thread
{public static int m_data=0;public static int m_times=10000;public int m_ID;public boolean m_done;J_ThreadSum(int id){m_ID=id;} // J_ThreadSum构造方法结束public void run( ){m_done=false;int d= ((m_ID % 2==0) ? 1 : -1);System.out.println("运行线程: " + m_ID + "(增量为: " + d + ")");for(int i=0; i<m_times; i++)for(int j=0; j<m_times; j++)m_data+=d;m_done=true;System.out.println("结束线程: " + m_ID);} // 方法run结束public static void main(String args[ ]){J_ThreadSum t1 = new J_ThreadSum(1);J_ThreadSum t2 = new J_ThreadSum(2);t1.m_done=false;t2.m_done=false;t1.start( );t2.start( );while ( !t1.m_done || !t2.m_done ) // 等待两个线程运行结束;System.out.println("结果: m_data=" + m_data);} // 方法main结束
} // 类J_ThreadSum结束
p410线程同步例程: 说明静态的和非静态的同步方法
class J_Experiment
{public static void mb_sleep(long millis){try{Thread.sleep(millis);}catch (InterruptedException e){System.err.println("异常InterruptedException: " + e);e.printStackTrace( );} // try-catch结构结束} // 方法mb_sleep结束public static synchronized void m_methodStatic(int id){System.out.println("线程" + id + "进入静态同步方法");mb_sleep(1000);System.out.println("线程" + id + "离开静态同步方法");} // 方法m_methodStatic结束public synchronized void m_methodSynchronized(int id){System.out.println("线程" + id + "进入非静态同步方法");mb_sleep(1000);System.out.println("线程" + id + "离开非静态同步方法");} // 方法m_methodSynchronized结束public void m_method(int id){System.out.println("线程" + id + "进入非静态非同步方法");mb_sleep(1000);System.out.println("线程" + id + "离开非静态非同步方法");} // 方法m_method结束
} // 类J_Experiment结束
public class J_SynchronizedStatic extends Thread
{public int m_ID;public J_Experiment m_data;J_SynchronizedStatic(int id){m_ID=id;} // J_SynchronizedStatic构造方法结束public void run( ){System.out.println("运行线程: " + m_ID);m_data.m_methodSynchronized(m_ID);m_data.m_methodStatic(m_ID);m_data.m_method(m_ID);System.out.println("结束线程: " + m_ID);} // 方法run结束public static void main(String args[ ]){int n=2;J_SynchronizedStatic [ ] t = new J_SynchronizedStatic[n];J_Experiment d = new J_Experiment( );for(int i=0; i< n; i++){t[i] = new J_SynchronizedStatic(i);t[i].m_data = d;t[i].start( );} // for循环结束System.out.println("方法main结束");} // 方法main结束
} // 类J_SynchronizedStatic结束
p414线程同步例程: 说明在同一个对象中的多个同步方法的运行机制
class J_Experiment
{public static void mb_sleep(long millis){try{Thread.sleep(millis);}catch (InterruptedException e){System.err.println("异常InterruptedException: " + e);e.printStackTrace( );} // try-catch结构结束} // 方法mb_sleep结束public synchronized void m_method1(int id){System.out.println("线程" + id + "进入方法1");mb_sleep(1000);System.out.println("线程" + id + "离开方法1");} // 方法m_method1结束public synchronized void m_method2(int id){System.out.println("线程" + id + "进入方法2");mb_sleep(1000);System.out.println("线程" + id + "离开方法2");} // 方法m_method2结束
} // 类J_Experiment结束
public class J_SynchronizedMethod extends Thread
{public int m_ID;public J_Experiment m_data;J_SynchronizedMethod(int id){m_ID=id;} // J_SynchronizedMethod构造方法结束public void run( ){System.out.println("运行线程: " + m_ID);m_data.m_method1(m_ID);m_data.m_method2(m_ID);System.out.println("结束线程: " + m_ID);} // 方法run结束public static void main(String args[ ]){int n=2;J_SynchronizedMethod [ ] t = new J_SynchronizedMethod[n];J_Experiment d = new J_Experiment( );for(int i=0; i< n; i++){t[i] = new J_SynchronizedMethod(i);t[i].m_data = d;t[i].start( );} // for循环结束System.out.println("方法main结束");} // 方法main结束
} // 类J_SynchronizedMethod结束
p417通过基于类对象的同步语块进行线程同步的例程
public class J_BlockClass extends Thread
{public static int m_data=0;public static int m_times=1000;public int m_ID;public boolean m_done;J_BlockClass(int id){m_ID=id;} // J_BlockClass构造方法结束public void run( ){m_done=false;int d= ((m_ID % 2==0) ? 1 : -1);System.out.println("运行线程: " + m_ID + "(增量为: " + d + ")");try{synchronized(Class.forName("J_BlockClass")){System.out.println("线程: " + m_ID+ "进入同步语句块, m_data=" + m_data);for(int i=0; i<m_times; i++)for(int j=0; j<m_times; j++)m_data+=d;System.out.println("线程: " + m_ID+ "离开同步语句块, m_data=" + m_data);} // 同步语句块结束}catch(ClassNotFoundException e){e.printStackTrace( );System.err.println(e);} // try-catch结构结束m_done=true;System.out.println("结束线程: " + m_ID);} // 方法run结束public static void main(String args[ ]){J_BlockClass t1 = new J_BlockClass(1);J_BlockClass t2 = new J_BlockClass(2);t1.m_done=false;t2.m_done=false;t1.start( );t2.start( );while ( !t1.m_done || !t2.m_done ) // 等待两个线程运行结束;System.out.println("结果: m_data=" + m_data);} // 方法main结束
} // 类J_BlockClass结束
p420线程同步例程: 说明类的实例对象与静态成员域之间的关系
public class J_BlockThis extends Thread
{public static int m_data=0;public static int m_times=10000;public int m_ID;public boolean m_done;J_BlockThis(int id){m_ID=id;} // J_BlockThis构造方法结束public void run( ){m_done=false;int d= ((m_ID % 2==0) ? 1 : -1);System.out.println("运行线程: " + m_ID + "(增量为: " + d + ")");synchronized(this){System.out.println("线程: " + m_ID+ "进入同步语句块, m_data=" + m_data);for(int i=0; i<m_times; i++)for(int j=0; j<m_times; j++)m_data+=d;System.out.println("线程: " + m_ID+ "离开同步语句块, m_data=" + m_data);} // 同步语句块结束m_done=true;System.out.println("结束线程: " + m_ID);} // 方法run结束public static void main(String args[ ]){J_BlockThis t1 = new J_BlockThis(1);J_BlockThis t2 = new J_BlockThis(2);t1.m_done=false;t2.m_done=false;t1.start( );t2.start( );while ( !t1.m_done || !t2.m_done ) // 等待两个线程运行结束;System.out.println("结果: m_data=" + m_data);} // 方法main结束
} // 类J_BlockThis结束
p422通过实例对象进行线程同步的例程
class J_Experiment
{public static void mb_sleep(long millis){try{Thread.sleep(millis);}catch (InterruptedException e){System.err.println("异常InterruptedException: " + e);e.printStackTrace( );} // try-catch结构结束} // 方法mb_sleep结束public void m_method1(int id){System.out.println("线程" + id + "进入方法1");mb_sleep(1000);System.out.println("线程" + id + "离开方法1");} // 方法m_method1结束public void m_method2(int id){System.out.println("线程" + id + "进入方法2");mb_sleep(1000);System.out.println("线程" + id + "离开方法2");} // 方法m_method2结束
} // 类J_Experiment结束
public class J_BlockData extends Thread
{public int m_ID;public J_Experiment m_data;J_BlockData(int id){m_ID=id;} // J_BlockData构造方法结束public void run( ){System.out.println("运行线程: " + m_ID);synchronized(m_data){System.out.println("进入同步语句块的是线程: " + m_ID);m_data.m_method1(m_ID);m_data.m_method2(m_ID);System.out.println("离开同步语句块的是线程: " + m_ID);}System.out.println("结束线程: " + m_ID);} // 方法run结束public static void main(String args[ ]){int n=2;J_BlockData [ ] t = new J_BlockData[n];J_Experiment d = new J_Experiment( );for(int i=0; i< n; i++){t[i] = new J_BlockData(i);t[i].m_data = d;t[i].start( );} // for循环结束System.out.println("方法main结束");} // 方法main结束
} // 类J_BlockData结束
p425利用wait和notify成员方法进行线程同步的例程
class J_Experiment
{private int m_temperature, m_pressure;private boolean m_ready=false;public synchronized void mb_update(int t, int p){System.out.println("进入更新方法内部:");if (m_ready) // 前面更新的数据还没有被处理{System.out.println(" 等待数据分析完成...");try{wait( ); // 等待数据分析}catch(Exception e){e.printStackTrace( );System.err.println(e);} // try-catch结构结束System.out.println(" 继续更新数据...");} // if语句结束m_temperature = t;m_pressure = p;System.out.println("更新完成: 温度值为" + t + ", 气压值为" + p);m_ready=true;notify( );} // 同步方法mb_update结束public synchronized void mb_analyze( ){System.out.println("进入数据分析方法内部:");if (!m_ready) // 数据还没有更新{System.out.println(" 等待数据更新完成...");try{wait( ); // 等待数据更新}catch(Exception e){e.printStackTrace( );System.err.println(e);} // try-catch结构结束System.out.println(" 继续分析数据...");} // if语句结束int t= m_temperature;int p= m_pressure;System.out.println("分析完成: 温度值为" + t + ", 气压值为" + p);m_ready=false;notify( );} // 同步方法mb_analyze结束
} // 类J_Experiment结束
class J_Assistant extends Thread
{J_Experiment m_data;public J_Assistant(J_Experiment d){m_data= d;} // 构造方法J_Assistant结束public void run( ){System.out.println("助理线程开始工作");int i, j, k;for(k=0; k<3; k++){i= (int)(Math.random( ) * 1000);j= (int)(Math.random( ) * 1000);m_data.mb_update(i, j);} // for循环结束System.out.println("助理线程结束工作");} // 方法run结束
} // 类J_Assistant结束
class J_Analyst extends Thread
{J_Experiment m_data;public J_Analyst(J_Experiment d){m_data= d;} // 构造方法J_Analyst结束public void run( ){System.out.println("分析员线程开始工作");for(int k=0; k<3; k++)m_data.mb_analyze( );System.out.println("分析员线程结束工作");} // 方法run结束
} // 类J_Analyst结束
public class J_WaitNotify
{public static void main( String args[ ] ){ J_Experiment data= new J_Experiment( );J_Assistant threadA = new J_Assistant(data);J_Analyst threadB = new J_Analyst(data);threadA.start( );threadB.start( );System.out.println("方法main结束");} // 方法main结束
} // 类J_WaitNotify结束
p430线程死锁例程
public class J_Lock extends Thread
{public static Object m_objectA= new Object( );public static Object m_objectB= new Object( );J_Lock(String s){super(s);} // J_Lock构造方法结束public static void mb_sleep( ){try{Thread.sleep((long)(Math.random( ) * 1000));}catch (InterruptedException e){System.err.println("异常InterruptedException: " + e);e.printStackTrace( );} // try-catch结构结束} // 方法mb_sleep结束public void run( ){boolean t=true;System.out.println(getName( ) + "开始运行");for( ; true; t=!t){synchronized(t ? m_objectA : m_objectB){System.out.println(getName( ) + ": " +(t ? "对象A" : "对象B") + "被锁住");mb_sleep( );synchronized(t ? m_objectB : m_objectA){System.out.println(getName( ) + ": " +(t ? "对象B" : "对象A") + "被锁住");mb_sleep( );System.out.println(getName( ) + ": " +(t ? "对象B" : "对象A") + "的锁打开");} // 内层同步语句块结束System.out.println(getName( ) + ": " +(t ? "对象A" : "对象B") + "的锁打开");} // 外层同步语句块结束} // for循环结束} // 方法run结束public static void main(String args[ ]){J_Lock t1 = new J_Lock("线程1");J_Lock t2 = new J_Lock("线程2");t1.start( );t2.start( );} // 方法main结束
} // 类J_Lock结束
p433通过实例对象且具有最小同步粒度的线程同步例程
public class J_BlockGranularity extends Thread
{public static int m_data=0;public static int m_times=1000;public int m_ID;public boolean m_done;J_BlockGranularity(int id){m_ID=id;} // J_BlockGranularity构造方法结束public void run( ){m_done=false;int d= ((m_ID % 2==0) ? 1 : -1);System.out.println("运行线程: " + m_ID + "(增量为: " + d + ")");try{for(int i=0; i<m_times; i++)for(int j=0; j<m_times; j++)synchronized(Class.forName("J_BlockGranularity")){m_data+=d;} // 同步语句块结束}catch(ClassNotFoundException e){e.printStackTrace( );System.err.println(e);} // try-catch结构结束m_done=true;System.out.println("结束线程: " + m_ID);} // 方法run结束public static void main(String args[ ]){J_BlockGranularity t1 = new J_BlockGranularity(1);J_BlockGranularity t2 = new J_BlockGranularity(2);t1.m_done=false;t2.m_done=false;t1.start( );t2.start( );while ( !t1.m_done || !t2.m_done ) // 等待两个线程运行结束;System.out.println("结果: m_data=" + m_data);} // 方法main结束
} // 类J_BlockGranularity结束
p438网络地址例程
import java.net.InetAddress;
import java.net.UnknownHostException;
public class J_InetAddress
{public static void main(String args[ ]){String s = "www.tsinghua.edu.cn";InetAddress ts= null;try{ ts = InetAddress.getByName(s);}catch (UnknownHostException e){ System.err.println("发生异常:" + e);e.printStackTrace( );} // try-catch结构结束if (ts!=null){System.out.println("清华大学的网络地址是: "+ ts.getHostAddress( ));System.out.println("清华大学网站的主机名是: " + ts.getHostName( ));}else System.out.println("无法访问网络地址: " + s);} // 方法main结束
} // 类J_InetAddress结束
p441网络统一资源定位地址(URL)例程
import java.net.URL;
import java.net.MalformedURLException;
public class J_Url
{public static void main(String args[ ]){try{URL u = new URL("http://www.tsinghua.edu.cn/chn/index.htm"); System.out.println("在URL(" + u + ")当中:"); System.out.println("协议是" + u.getProtocol( )); System.out.println("主机名是" + u.getHost( )); System.out.println("文件名是" + u.getFile( )); System.out.println("端口号是" + u.getPort( )); System.out.println("引用是" + u.getRef( )); }catch (MalformedURLException e){ System.err.println("发生异常:" + e);e.printStackTrace( );} // try-catch结构结束 } // 方法main结束
} // 类J_Url结束
p443通过统一资源定位地址(URL)获取网络资源的例程
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
public class J_UrlReadData
{public static void main(String args[ ]){try{URL u = new URL("http://www.tsinghua.edu.cn/chn/index.htm");BufferedReader r = new BufferedReader(new InputStreamReader(u.openStream( )));String s;while ((s = r.readLine( )) != null) // 获取网络资源信息System.out.println(s); // 输出网络资源信息r.close( );}catch (Exception e){ System.err.println("发生异常:" + e);e.printStackTrace( );} // try-catch结构结束 } // 方法main结束
} // 类J_UrlReadData结束
p445基于TCP通讯例程的服务器端程序
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class J_Server
{public static void main(String args[ ]){try{ServerSocket server = null;server = new ServerSocket(5000);while (true){Socket s = server.accept( );System.out.println("服务器端接收到来自客户端的连接"); DataOutputStream dataOut= new DataOutputStream(s.getOutputStream( ));dataOut.writeUTF("服务器端向客户端问好");dataOut.close( );s.close( );} // while循环结束}catch (Exception e){ System.err.println("发生异常:" + e);e.printStackTrace( );} // try-catch结构结束 } // 方法main结束
} // 类J_Server结束
p446基于TCP通讯例程的客户端程序
import java.io.DataInputStream;
import java.net.Socket;
public class J_Client
{public static void main(String args[ ]){try{Socket s = new Socket("localhost", 5000);DataInputStream dataIn= new DataInputStream(s.getInputStream( ));System.out.println("客户端接收到: " + dataIn.readUTF( ));dataIn.close( );s.close( );}catch (Exception e){ System.err.println("发生异常:" + e);e.printStackTrace( );} // try-catch结构结束 } // 方法main结束
} // 类J_Client结束
p449基于TCP的聊天例程——服务器端程序部分
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JScrollPane;
public class J_ChatServer extends JFrame
{private ObjectInputStream m_input; // 输入流private ObjectOutputStream m_output; // 输出流private JTextField m_enter; // 输入区域private JTextArea m_display; // 显示区域private int m_clientNumber = 0; // 连接的客户数public J_ChatServer( ) // 在图形界面中添加组件{super("聊天程序服务器端");Container c = getContentPane( );m_enter = new JTextField( );m_enter.setEnabled( false );m_enter.addActionListener(new ActionListener( ){ public void actionPerformed( ActionEvent event ){ // 向客户端发送数据try{String s = event.getActionCommand( );m_output.writeObject( s );m_output.flush( );mb_displayAppend( "服务器端: " + s );m_enter.setText( "" ); // 清除输入区域的原有内容}catch (Exception e){System.err.println("发生异常:" + e);e.printStackTrace( );} // try-catch结构结束} // 方法actionPerformed结束} // 实现接口ActionListener的内部类结束); // addActionListener方法调用结束c.add( m_enter, BorderLayout.NORTH );m_display = new JTextArea( );c.add( new JScrollPane( m_display ), BorderLayout.CENTER );} // J_ChatServer构造方法结束public void mb_displayAppend( String s ){m_display.append( s + "n" );m_display.setCaretPosition( m_display.getText( ).length( ) );m_enter.requestFocusInWindow( ); // 转移输入焦点到输入区域} // 方法mb_displayAppend结束public boolean mb_isEndSession( String m ){if (m.equalsIgnoreCase("q"))return(true);if (m.equalsIgnoreCase("quit"))return(true);if (m.equalsIgnoreCase("exit"))return(true);if (m.equalsIgnoreCase("end"))return(true);if (m.equalsIgnoreCase("结束"))return(true);return(false);} // 方法mb_isEndSession结束public void mb_run( ){try{ServerSocket server = new ServerSocket(5000);String m; // 来自客户端的消息while (true){m_clientNumber++;mb_displayAppend("等待连接[" + m_clientNumber + "]");Socket s = server.accept( );mb_displayAppend("接收到客户端连接[" + m_clientNumber + "]");m_output = new ObjectOutputStream( s.getOutputStream( ) );m_input = new ObjectInputStream( s.getInputStream( ) );m_output.writeObject("连接成功");m_output.flush( );m_enter.setEnabled( true );do{m = (String) m_input.readObject( );mb_displayAppend("客户端: " + m);} while(!mb_isEndSession( m ));// do-while循环结束 m_output.writeObject("q"); // 通知客户端退出程序m_output.flush( );m_enter.setEnabled( false );m_output.close( );m_input.close( );s.close( );mb_displayAppend("连接[" + m_clientNumber + "]结束");} // while循环结束}catch (Exception e){ System.err.println("发生异常:" + e);e.printStackTrace( );mb_displayAppend("连接[" + m_clientNumber + "]发生异常");} // try-catch结构结束 } // 方法mb_run结束public static void main(String args[ ]){J_ChatServer app = new J_ChatServer( );app.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);app.setSize(350, 150);app.setVisible(true);app.mb_run( );} // 方法main结束
} // 类J_ChatServer结束
p452基于TCP的聊天例程——客户端程序部分
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.net.Socket;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JScrollPane;
public class J_ChatClient extends JFrame
{private ObjectInputStream m_input; // 输入流private ObjectOutputStream m_output; // 输出流private JTextField m_enter; // 输入区域private JTextArea m_display; // 显示区域public J_ChatClient( ) // 在图形界面中添加组件{super("聊天程序客户端");Container c = getContentPane( );m_enter = new JTextField( );m_enter.setEnabled( false );m_enter.addActionListener(new ActionListener( ){ public void actionPerformed( ActionEvent event ){ // 向服务器端发送数据try{String s = event.getActionCommand( );m_output.writeObject( s );m_output.flush( );mb_displayAppend( "客户端: " + s );m_enter.setText( "" ); // 清除输入区域的原有内容}catch (Exception e){System.err.println("发生异常:" + e);e.printStackTrace( );} // try-catch结构结束} // 方法actionPerformed结束} // 实现接口ActionListener的内部类结束); // addActionListener方法调用结束c.add( m_enter, BorderLayout.NORTH );m_display = new JTextArea( );c.add( new JScrollPane( m_display ), BorderLayout.CENTER );} // J_ChatClient构造方法结束public void mb_displayAppend( String s ){m_display.append( s + "n" );m_display.setCaretPosition( m_display.getText( ).length( ) );m_enter.requestFocusInWindow( ); // 转移输入焦点到输入区域} // 方法mb_displayAppend结束public boolean mb_isEndSession( String m ){if (m.equalsIgnoreCase("q"))return(true);if (m.equalsIgnoreCase("quit"))return(true);if (m.equalsIgnoreCase("exit"))return(true);if (m.equalsIgnoreCase("end"))return(true);if (m.equalsIgnoreCase("结束"))return(true);return(false);} // 方法mb_isEndSession结束public void mb_run( String host, int port){try{mb_displayAppend("尝试连接");Socket s = new Socket(host, port);String m; // 来自服务器端的消息m_output = new ObjectOutputStream( s.getOutputStream( ) );m_input = new ObjectInputStream( s.getInputStream( ) );m_enter.setEnabled( true );do{m = (String) m_input.readObject( );mb_displayAppend("服务器端: " + m);} while(!mb_isEndSession( m ));// do-while循环结束m_output.writeObject("q"); // 通知服务器端退出程序m_output.flush( );m_output.close( );m_input.close( );s.close( );System.exit( 0 );}catch (Exception e){ System.err.println("发生异常:" + e);e.printStackTrace( );mb_displayAppend("发生异常");} // try-catch结构结束 } // 方法mb_run结束public static void main(String args[ ]){J_ChatClient app = new J_ChatClient( );app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);app.setSize(350, 150);app.setVisible(true);if ( args.length == 0 )app.mb_run("localhost", 5000);else app.mb_run(args[0], 5000);} // 方法main结束
} // 类J_ChatClient结束
p459基于UDP通讯例程的服务器端程序
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Date;
public class J_UdpServer
{public static void main(String args[ ]){DatagramSocket dSocket;DatagramPacket inPacket;DatagramPacket outPacket;InetAddress cAddr;int cPort;byte[ ] inBuffer= new byte[100];byte[ ] outBuffer;String s;try{dSocket = new DatagramSocket(8000);while (true){inPacket = new DatagramPacket(inBuffer, inBuffer.length);dSocket.receive(inPacket); // 接收数据报cAddr = inPacket.getAddress( );cPort = inPacket.getPort( );s= new String(inPacket.getData( ), 0, inPacket.getLength( ));System.out.println("接收到客户端信息: " + s);System.out.println("客户端主机名为: " + cAddr.getHostName( ));System.out.println("客户端端口为: " + cPort);Date d = new Date( );outBuffer = d.toString( ).getBytes( );outPacket = new DatagramPacket(outBuffer, outBuffer.length,cAddr, cPort);dSocket.send(outPacket); // 发送数据报} // while循环结束}catch (Exception e){ System.err.println("发生异常:" + e);e.printStackTrace( );} // try-catch结构结束 } // 方法main结束
} // 类J_UdpServer结束
p461基于UDP通讯例程的客户端程序
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class J_UdpClient
{public static void main(String args[ ]){DatagramPacket inPacket;InetAddress sAddr;byte[ ] inBuffer= new byte[100];try{DatagramSocket dSocket = new DatagramSocket( );if ( args.length == 0 )sAddr = InetAddress.getByName("127.0.0.1");else sAddr = InetAddress.getByName(args[0]);String s = "请求连接";byte[ ] outBuffer= s.getBytes( );DatagramPacket outPacket= new DatagramPacket(outBuffer, outBuffer.length, sAddr, 8000);dSocket.send(outPacket); // 发送数据报inPacket= new DatagramPacket(inBuffer, inBuffer.length);dSocket.receive(inPacket); // 接收数据报s= new String (inPacket.getData( ), 0, inPacket.getLength( ));System.out.println("接收到服务器端信息: " + s);dSocket.close( );}catch (Exception e){ System.err.println("发生异常:" + e);e.printStackTrace( );} // try-catch结构结束 } // 方法main结束
} // 类J_UdpClient结束
p465获取操作系统当前用户主目录的例程
public class J_UserHome
{public static void main(String args[ ]){System.out.println(System.getProperty("user.home"));} // 方法main结束
} // 类J_UserHome结束
p469显示在指定密钥库中的各个密钥项私钥信息的例程
import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.util.Enumeration;
import java.math.BigInteger;
public class J_ShowKeystore
{public static void main(String args[ ]){String ks_name;if (args.length<1){// 获取系统默认密钥库的路径及其名称ks_name = System.getProperty("user.home") + "\.keystore";}else ks_name = args[0];System.out.println("密钥库" + ks_name + "的一些信息如下:");try{FileInputStream fis = new FileInputStream(ks_name);KeyStore ks = KeyStore.getInstance("JKS");String password = "ks123456"; // 密钥库的密码String epw = "key123456"; // 密钥项的密码String a; // 密钥项别名PrivateKey pk; // 密钥项私钥byte[ ] k;if (args.length>1)password = args[1]; // 由程序参数指定密钥库密码ks.load(fis, password.toCharArray( ));// 获取并显示在密钥库中的密钥项别名Enumeration<String> e = ks.aliases( ); // 获取各个密钥项别名while (e.hasMoreElements( )){a = e.nextElement( ); // 取出密钥项别名System.out.println("密钥项" + a + "的私钥是:");// 获取密钥项私钥pk = (PrivateKey) ks.getKey(a, epw.toCharArray( ));k = pk.getEncoded( );System.out.println((new BigInteger(k)).toString(16));} // while循环结束}catch(Exception e){System.err.println("注: main方法发生了异常。");System.err.println(e);e.printStackTrace( );} // try-catch结构结束} // 方法main结束
} // 类J_ShowKeystore结束
p474显示数字证书文件信息的例程
import java.security.cert.CertificateFactory;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import java.io.FileInputStream;
import java.io.BufferedInputStream;
import java.math.BigInteger;
public class J_ShowCertificate
{public static void main(String args[ ]){if (args.length<1){System.out.println("请给程序提供参数: 数字证书的文件名。");return;}try{FileInputStream fis = new FileInputStream(args[0]);BufferedInputStream bis = new BufferedInputStream(fis);CertificateFactory cf = CertificateFactory.getInstance("X.509");while (bis.available( ) > 0){Certificate cert = cf.generateCertificate(bis);X509Certificate xcert= (X509Certificate) cert;System.out.println("证书内容:");System.out.println("版本号: " + xcert.getVersion( ));System.out.println("序列号: " + xcert.getSerialNumber( ).toString(16));System.out.println("所有者: " + xcert.getSubjectX500Principal( ));System.out.println("发照者: " + xcert.getIssuerX500Principal( ));System.out.println("有效期起始时间: " + xcert.getNotBefore( ));System.out.println("有效期终止时间: " + xcert.getNotAfter( ));System.out.println("签名算法: " + xcert.getSigAlgName( ));byte[ ] sig = xcert.getSignature( );System.out.println("签名: "+ (new BigInteger(sig)).toString(16));byte[ ] k = xcert.getPublicKey( ).getEncoded( );System.out.println("公钥: " + (new BigInteger(k)).toString(16));} // while循环结束bis.close( );}catch(Exception e){System.err.println("注: main方法发生了异常。");System.err.println(e);e.printStackTrace( );} // try-catch结构结束} // 方法main结束
} // 类J_ShowCertificate结束
p479基于SSL的服务器端程序
import javax.net.ssl.SSLServerSocketFactory;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.InetAddress;
import java.io.PrintWriter;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class J_SSLServer
{public static void main(String args[ ]){// 指定密钥库及其密码System.setProperty("javax.net.ssl.keyStore", ".\new.keystore");System.setProperty("javax.net.ssl.keyStorePassword", "ks123456");// 获取服务器端套接字工厂的实例对象SSLServerSocketFactory ssf = (SSLServerSocketFactory)SSLServerSocketFactory.getDefault( );try{// 创建服务器端套接字ServerSocket ss = ssf.createServerSocket(5000);int i=0;while (true){System.out.println("[" + (++i)+ "]: 等待来自客户端的连接... ...");Socket s = ss.accept( ); // 监听并等待来自客户端的连接PrintWriter pw = new PrintWriter(s.getOutputStream( ));InetAddress sa = s.getInetAddress( );InetAddress ca = s.getLocalAddress( ); String str;System.out.println("服务器端向客户端发送信息:");str = "来自"+ ca.getHostAddress( ) + "(" + s.getLocalPort( ) + ")"+ "向"+ sa.getHostAddress( ) + "(" + s.getPort( ) + ")"+ "发出的问候。";System.out.println(str);pw.println(str);pw.flush( );System.out.println("服务器端接收客户端信息:");BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream( )));str=br.readLine( );System.out.println(str);br.close( );pw.close( );s.close( );} // while循环结束}catch(Exception e){System.err.println("注: main方法发生了异常。");System.err.println(e);e.printStackTrace( );} // try-catch结构结束} // 方法main结束
} // 类J_SSLServer结束
p483基于SSL的客户端程序
import javax.net.ssl.SSLSocketFactory;
import java.net.Socket;
import java.net.InetAddress;
import java.io.PrintWriter;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class J_SSLClient
{public static void main(String args[ ]){String host = (args.length>=1 ? args[0] : "localhost");int port;// 指定信任密钥库System.setProperty("javax.net.ssl.trustStore",".\client.trustStore");// 获取套接字工厂的实例对象SSLSocketFactory sf = (SSLSocketFactory)SSLSocketFactory.getDefault( );try{if (args.length>=2)port= Integer.parseInt(args[1]);else port= 5000;// 获取套接字,与服务器端建立连接Socket s = sf.createSocket(host, port);InetAddress sa = s.getInetAddress( );InetAddress ca = s.getLocalAddress( ); System.out.println("客户端接收服务器端信息:");BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream( )));String str;str=br.readLine( );System.out.println(str);System.out.println("客户端向服务器端发送信息:");PrintWriter pw = new PrintWriter(s.getOutputStream( ));str = "客户端"+ ca.getHostAddress( ) + "(" + s.getLocalPort( ) + ")"+ "应答服务器端"+ sa.getHostAddress( ) + "(" + s.getPort( ) + ")"+ "。";System.out.println(str);pw.println(str);pw.flush( );pw.close( );br.close( );s.close( );}catch(Exception e){System.err.println("注: main方法发生了异常。");System.err.println(e);e.printStackTrace( );} // try-catch结构结束} // 方法main结束
} // 类J_SSLClient结束
p487实现接口javax.net.ssl.X509KeyManager的密钥管理器类例程
import javax.net.ssl.X509KeyManager;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import java.security.KeyStore;
import java.security.Principal;
import java.security.PrivateKey;
import java.net.Socket;
public class J_SSLKeyManager implements X509KeyManager
{protected String m_alias; // 密钥项的别名protected KeyStore m_keystore; // 密钥库protected char[ ] m_storepass; // 密钥库的密码protected char[ ] m_keypass; // 密钥项的密码private String m_type; // m_alias密钥项的公钥的加密算法类型名称private String m_issuer; // m_alias密钥项的证书发照者public J_SSLKeyManager(KeyStore ks, String s, char[ ] storepass, char [ ] keypass){m_keystore = ks;m_alias = s;m_storepass = storepass;m_keypass = keypass;try{Certificate c = ks.getCertificate(s);m_type = c.getPublicKey( ).getAlgorithm( );m_issuer = ((X509Certificate) c).getIssuerX500Principal( ).getName( );}catch(Exception e){System.err.println("注: J_SSLKeyManager构造方法发生了异常。");System.err.println(e);e.printStackTrace( );} // try-catch结构结束} // 构造方法J_SSLKeyManager结束// 注: 下面方法没有用到参数s, 它可以为nullpublic String chooseClientAlias(String[ ] keyType,Principal[ ] issuers, Socket s){if (keyType==null)return null;int i;for (i=0; i < keyType.length; i++)if (m_type.equals(keyType[i])){i=-1;break;} // if和for结构结束if (i!=-1) // 说明加密算法类型不匹配return null;if (issuers==null) // 说明参数issuers可以不用考虑return m_alias;for (i=0; i < issuers.length; i++)if (m_issuer.equals(issuers[i].getName( )))return m_alias;return null;} // 方法chooseClientAlias结束// 注: 下面方法没有用到参数s, 它可以为nullpublic String chooseServerAlias(String keyType,Principal[ ] issuers, Socket s){String [ ] ks = {keyType};return(chooseClientAlias(ks, issuers, s));} // 方法chooseServerAlias结束// 获得别名alias对应的证书链public X509Certificate[ ] getCertificateChain(String alias){try{Certificate [ ] c = m_keystore.getCertificateChain(alias);if (c==null)return(null);if (c.length==0)return(null);X509Certificate [ ] xc = new X509Certificate[c.length];System.arraycopy(c, 0, xc, 0, c.length);return(xc);}catch(Exception e){System.err.println("注: 类J_SSLKeyManager的"+ "getCertificateChain方法发生了异常。");System.err.println(e);e.printStackTrace( );return null;} // try-catch结构结束} // 方法getCertificateChain结束public String[ ] getClientAliases(String keyType, Principal[ ] issuers){String [ ] s;String alias = chooseServerAlias(keyType, issuers, null);if (alias==null)return null;else{s = new String[1];s[0] = alias;} // if-else结构结束return s;} // 方法getClientAliases结束public PrivateKey getPrivateKey(String alias){try{return((PrivateKey)(m_keystore.getKey(alias, m_keypass)));}catch(Exception e){System.err.println("注: 类J_SSLKeyManager的"+ "getPrivateKey方法发生了异常。");System.err.println(e);e.printStackTrace( );} // try-catch结构结束return(null);} // 方法getPrivateKey结束public String[ ] getServerAliases(String keyType, Principal[ ] issuers){return(getClientAliases(keyType, issuers));} // 方法getServerAliases结束
} // 类J_SSLKeyManager结束
p492自定义密钥管理器工厂类
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactorySpi;
import javax.net.ssl.ManagerFactoryParameters;
import java.security.KeyStore;
public class J_SSLKeyManagerFactory extends KeyManagerFactorySpi
{public String m_alias; // 密钥项的别名public KeyStore m_keystore; // 密钥库public char[ ] m_storepass; // 密钥库的密码public char[ ] m_keypass; // 密钥项的密码public J_SSLKeyManagerFactory( ){m_alias = System.getProperty("Self.alias");m_keypass = System.getProperty("Self.keypass").toCharArray( );} // 构造方法J_SSLKeyManagerFactory结束public J_SSLKeyManagerFactory(String alias, char[ ] keypass){m_alias = alias;m_keypass = keypass;} // 构造方法J_SSLKeyManagerFactory结束protected KeyManager[ ] engineGetKeyManagers( ){J_SSLKeyManager [ ] skm = new J_SSLKeyManager[1];skm[0] = new J_SSLKeyManager(m_keystore, m_alias,m_storepass, m_keypass);return(skm);} // 方法engineGetKeyManagers结束protected void engineInit(KeyStore ks, char[ ] password){m_keystore = ks;m_storepass = password;} // 方法engineInit结束// 下面的方法没有实现protected void engineInit(ManagerFactoryParameters spec){} // 方法engineInit结束
} // 类J_SSLKeyManagerFactory结束
p494自定义安全提供程序
import java.security.Provider;
public class J_SelfProvider extends Provider
{public J_SelfProvider( ){super("Self", 1, "Self Provider 1.1");put("KeyManagerFactory.Self", "J_SSLKeyManagerFactory");} // 构造方法J_SelfProvider结束
} // 类J_SelfProvider结束
p495基于SSL的服务器端程序,允许指定密钥项别名和密钥项密码
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLServerSocket;
import java.security.KeyStore;
import java.security.Security;
import java.net.Socket;
import java.net.InetAddress;
import java.io.PrintWriter;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.FileInputStream;
public class J_SSLServerAlias
{public static void main(String args[ ]){// 指定密钥项别名及密钥项密码System.setProperty("Self.alias", "oldmark");System.setProperty("Self.keypass", "ks123456");try{Security.addProvider(new J_SelfProvider( ));SSLContext sc = SSLContext.getInstance("SSL");KeyStore ks = KeyStore.getInstance("JKS");char password [ ] = "ks123456".toCharArray( );// 加载密钥库ks.load(new FileInputStream("new.keystore"), password);// 获取服务器端套接字工厂的实例对象KeyManagerFactory kmf = KeyManagerFactory.getInstance("Self");kmf.init(ks, password);sc.init(kmf.getKeyManagers( ), null, null);SSLServerSocketFactory ssf = sc.getServerSocketFactory( );// 创建服务器端套接字SSLServerSocket ss =(SSLServerSocket)ssf.createServerSocket(5000);int i=0;while (true){System.out.println("[" + (++i)+ "]: 等待来自客户端的连接... ...");Socket s = ss.accept( );PrintWriter pw = new PrintWriter(s.getOutputStream( ));InetAddress sa = s.getInetAddress( );InetAddress ca = s.getLocalAddress( ); System.out.println("服务器端向客户端发送信息:");String str;str = "来自"+ ca.getHostAddress( ) + "(" + s.getLocalPort( ) + ")"+ "向"+ sa.getHostAddress( ) + "(" + s.getPort( ) + ")"+ "发出的问候。";System.out.println(str);pw.println(str);pw.flush( );System.out.println("服务器端接收客户端信息:");BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream( )));str=br.readLine( );System.out.println(str);br.close( );pw.close( );s.close( );} // while循环结束}catch(Exception e){System.err.println("注: main方法发生了例外。");System.err.println(e);e.printStackTrace( );} // try-catch结构结束} // 方法main结束
} // 类J_SSLServerAlias结束