博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA入门到精通-第86讲-半双工/全双工
阅读量:6160 次
发布时间:2019-06-21

本文共 19675 字,大约阅读时间需要 65 分钟。

1167156-20181201003222842-529624410.png
1167156-20181201003223472-488860186.png
--服务器端
// 先接收客户端发来的信息
 Reader
 BufferedReader
--------------------------
InputStreamReader isr=
new InputStreamReader(s.getInputStream());
BufferedReader  br=new BufferedReader(isr);
-------------------------
br 用来读取socket连接;读的流;
pw 用来向socket连接写东西;写的流;
1167156-20181201003224026-2143309887.png
----------------------------
1167156-20181201003224651-1629111379.png
1167156-20181201003225175-755654685.png
服务器从客户端br2读好以后,通过pw写给客户端
--------------------------------------
加个:先监听
服务器正在监听......
1167156-20181201003225753-2069897253.png
--客户端
1167156-20181201003226176-16660972.png
网络往往和IO流紧密结合在一起的;
1167156-20181201003226886-396871130.png
靠PrinWriter来输入对服务器说的话;
从控制台输入信息借助PW把信息写给服务器;
从控制台来接收的system.in;
1167156-20181201003227483-311880997.png
------------------------------
1167156-20181201003227858-804608037.png
isr / br  -------pw.println( )把接收到的信息发给服务器
------------------------
isr2/br2 ------ 接收从服务器发来的信息
1167156-20181201003228595-894989848.png
1167156-20181201003229214-1075231657.png
1167156-20181201003229726-593738615.png
一回车,相当于控制台的信息输入到客户端,被传到服务器上
---------------------------
1167156-20181201003230277-1714682324.png
1167156-20181201003231088-1149617714.png
 服务器和客户端之间的信息交互;
-----------------------------------
MyClient:
1167156-20181201003232232-525369878.png
接收从服务器端发来的信息byebye,关闭退出;
MyServer:
1167156-20181201003232937-1483068806.png
接收从客户端发来的信息byebye,关闭退出,对话结束;
--------------------------
半双工通信,必须要先接收再发送;
其实就是,你一句,我一句,顺序严格;
------------------------------
--全双工通信
1167156-20181201003233271-717871376.png
public class MyServer3
1167156-20181201003233462-642589958.png
1167156-20181201003233740-471167447.png
-客户端/服务器端界面:
1167156-20181201003234067-943037643.png
InputStreamReader
服务器端通过br.readLine()读取信息;
读到的信息显示在jta里面;
1167156-20181201003234461-1193382159.png
对按钮做一个监听;
如果用户按下发送信息按钮
1167156-20181201003234880-1238114844.png
PrintWriter 发送流
pw.println(info)
1167156-20181201003235084-1689691559.png
jtf.setText("");           清空内容
--------------------------------------------
--客户端
首先,不停的读;
1167156-20181201003235354-869767158.png
服务器不发信息过来,阻塞,也不浪费CPU;
--对按钮监听
1167156-20181201003235861-187298373.png
1167156-20181201003236289-226092910.png
监听按钮,jtf 输入信息,通过 pw发送给客户端;
1167156-20181201003236989-1774074771.png
把客户端发送的信息显示到jta
jta.append(info);       //append追加
Enteripse  
Workbench 6.5
1167156-20181201003237523-412853939.png
1167156-20181201003237812-1835521213.png
追加append的方式放进去;
1167156-20181201003238045-1197934417.png
1167156-20181201003238225-1100173473.png
--------------------
--按回车键,把内容发过去
监听Enter键
对jtf做个监听;
-----------------------
1167156-20181201003238778-1842183727.png
不是真正意义上的QQ,服务器、客户端之间
只能在一个局域网里面互发信息;类似于对讲机;
-----------------------
1167156-20181201003238933-252231359.png
数据通过 服务器做个中转;
只要有公网、服务器就能聊天;y真正意义上的QQ

半双工,客户端与服务端进行控制台输入交流

[MyServer2.java]服务端源代码

/** * 功能:是一个服务器端,在9999端口上监听 * 可以通过控制台,输入回送给客户端的信息 */ package com.net.server2; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.*; public class MyServer2 { InputStreamReader isr,isr2; BufferedReader br,br2; PrintWriter pw; public static void main(String[] args) { new MyServer2(); } //构造函数 public MyServer2(){ try { //在9999号端口上监听 ServerSocket ss=new ServerSocket(9999); //等待客户端连接,该函数会返回一个Socket连接 Socket s=ss.accept(); //要读取s中传递的数据 isr=new InputStreamReader(s.getInputStream()); br=new BufferedReader(isr); pw=new PrintWriter(s.getOutputStream(),true); //接收从控制台输入的信息 isr2=new InputStreamReader(System.in); br2=new BufferedReader(isr2); while(true){ //接收客户端信息 String infoFromClient=br.readLine(); System.out.println("服务器接收到:\t"+infoFromClient); //接收从控制台输入的信息 System.out.println("请输入要发送到客户端的信息:"); String response=br2.readLine(); //服务器从控制台上接收bye服务器端退出 if(response.equals("bye")){ System.out.println("退出对话"); s.close(); break; } //把从控制台输入的信息,回送给客户端 pw.println(response); } } catch (IOException e) { e.printStackTrace(); }finally{ try { if(br2!=null) br2.close(); if(isr2!=null) isr2.close(); if(pw!=null) pw.close(); if(br!=null) br.close(); if(isr!=null) isr.close(); } catch (IOException e) { e.printStackTrace(); } } } }
x
68
68
68
 
1
/**
2
* 功能:是一个服务器端,在9999端口上监听
3
* 可以通过控制台,输入回送给客户端的信息
4
*/
5
package com.net.server2;
6
import java.io.BufferedReader;
7
import java.io.IOException;
8
import java.io.InputStream;
9
import java.io.InputStreamReader;
10
import java.io.PrintWriter;
11
import java.net.*;
12
 
13
public class MyServer2 {
14
   InputStreamReader isr,isr2;
15
   BufferedReader br,br2;
16
   PrintWriter pw;
17
 
18
   public static void main(String[] args) {
19
       new MyServer2();
20
   }
21
 
22
   //构造函数
23
   public MyServer2(){
24
       try {
25
           //在9999号端口上监听
26
           ServerSocket ss=new ServerSocket(9999);
27
           //等待客户端连接,该函数会返回一个Socket连接
28
           Socket s=ss.accept();
29
           //要读取s中传递的数据
30
           isr=new InputStreamReader(s.getInputStream());
31
           br=new BufferedReader(isr);
32
         
33
           pw=new PrintWriter(s.getOutputStream(),true);
34
         
35
           //接收从控制台输入的信息
36
           isr2=new InputStreamReader(System.in);
37
           br2=new BufferedReader(isr2);
38
           while(true){
39
               //接收客户端信息
40
               String infoFromClient=br.readLine();
41
               System.out.println("服务器接收到:\t"+infoFromClient);
42
               //接收从控制台输入的信息
43
               System.out.println("请输入要发送到客户端的信息:");
44
               String response=br2.readLine();
45
               //服务器从控制台上接收bye服务器端退出
46
               if(response.equals("bye")){
47
                   System.out.println("退出对话");
48
                   s.close();
49
                   break;
50
               }
51
               //把从控制台输入的信息,回送给客户端
52
               pw.println(response);
53
           }
54
       } catch (IOException e) {
55
           e.printStackTrace();
56
       }finally{
57
           try {
58
               if(br2!=null) br2.close();
59
               if(isr2!=null) isr2.close();
60
               if(pw!=null) pw.close();
61
               if(br!=null) br.close();
62
               if(isr!=null) isr.close();
63
           } catch (IOException e) {
64
               e.printStackTrace();
65
           }
66
       }
67
   }
68
}

 

*******************************************************************************

[MyClient2.java]客户端源代码

/** * 这是一个客户端程序,可以连接服务器端口9999 */ package com.net.client2; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.*; public class MyClient2 { InputStreamReader isr,isr2; BufferedReader br,br2; PrintWriter pw; public static void main(String[] args) { new MyClient2(); } public MyClient2(){ try { //连接服务器端 Socket s=new Socket("127.0.0.1",9999); pw=new PrintWriter(s.getOutputStream(),true); //控制台接收信息 isr=new InputStreamReader(System.in); br=new BufferedReader(isr); //从服务器接收信息 isr2=new InputStreamReader(s.getInputStream()); br2=new BufferedReader(isr2); while(true){ //客户端先从控制台接收 String info=br.readLine(); //然后发送给服务器 pw.println(info); //客户端从控制台上输入byebye信息,客户端退出 if(info.equals("byebye")){ System.out.println("客户端退出对话"); s.close(); break; } //接收从服务器发来的信息 String res=br2.readLine(); System.out.println("客户端接收到的信息:"+res); //客户端接收服务端发送来的byebye信息,客户端退出 if(res.equals("byebye")){ System.out.println("服务器端强制客户端退出对话"); s.close(); break; } } } catch (Exception e) { e.printStackTrace(); }finally{ try { if(br2!=null) br2.close(); if(isr2!=null) isr2.close(); if(pw!=null) pw.close(); if(br!=null) br.close(); if(isr!=null) isr.close(); } catch (IOException e) { e.printStackTrace(); } } } }
1
75
 
1
/**
2
* 这是一个客户端程序,可以连接服务器端口9999
3
*/
4
package com.net.client2;
5
 
6
import java.io.BufferedReader;
7
import java.io.IOException;
8
import java.io.InputStreamReader;
9
import java.io.PrintWriter;
10
import java.net.*;
11
 
12
public class MyClient2 {
13
   InputStreamReader isr,isr2;
14
   BufferedReader br,br2;
15
   PrintWriter pw;
16
 
17
   public static void main(String[] args) {
18
       new MyClient2();
19
   }
20
 
21
   public MyClient2(){
22
       try {
23
           //连接服务器端
24
           Socket s=new Socket("127.0.0.1",9999);
25
         
26
           pw=new PrintWriter(s.getOutputStream(),true);
27
           //控制台接收信息
28
           isr=new InputStreamReader(System.in);
29
           br=new BufferedReader(isr);
30
         
31
           //从服务器接收信息
32
           isr2=new InputStreamReader(s.getInputStream());
33
           br2=new BufferedReader(isr2);
34
         
35
           while(true){
36
               //客户端先从控制台接收
37
               String info=br.readLine();
38
               //然后发送给服务器
39
               pw.println(info);
40
               //客户端从控制台上输入byebye信息,客户端退出
41
               if(info.equals("byebye")){
42
                   System.out.println("客户端退出对话");
43
                   s.close();
44
                   break;
45
               }
46
             
47
               //接收从服务器发来的信息
48
               String res=br2.readLine();
49
               System.out.println("客户端接收到的信息:"+res);
50
               //客户端接收服务端发送来的byebye信息,客户端退出
51
               if(res.equals("byebye")){
52
                   System.out.println("服务器端强制客户端退出对话");
53
                   s.close();
54
                   break;
55
               }
56
           }
57
       } catch (Exception e) {
58
           e.printStackTrace();
59
       }finally{
60
           try {
61
               if(br2!=null) br2.close();
62
               if(isr2!=null) isr2.close();
63
               if(pw!=null) pw.close();
64
               if(br!=null) br.close();
65
               if(isr!=null) isr.close();
66
           } catch (IOException e) {
67
               e.printStackTrace();
68
           }
69
       }
70
   }
71
}
72
 
===============================

全双工客户端与服务器进行简易界面聊天

[MyServer3.java]服务器端源代码

/**

 * 全双工服务器端,让它在9999端口监听

 * 可以接收客户端发来的数据

 */

package com.net.server3; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.*; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.KeyStroke; public class MyServer3 extends JFrame implements ActionListener{ JTextArea jta; JTextField jtf; JButton jb; JPanel jp1; JScrollPane jsp; InputStreamReader isr; BufferedReader br; PrintWriter pw; public static void main(String[] args) { new MyServer3(); } //构造函数 public MyServer3(){ jta=new JTextArea(); jtf=new JTextField(20); jb=new JButton("发送"); jb.addActionListener(this); //给jb发送按钮添加快捷键(回车)事件 jb.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "fasong"); jb.getActionMap().put("fasong", new AbstractAction() { public void actionPerformed(ActionEvent e) { String info=jtf.getText(); jta.append("客户端 对 服务端说:"+info+"\r\n"); pw.println(info); jtf.setText(""); } }); jp1=new JPanel(); jp1.add(jtf); jp1.add(jb); jsp=new JScrollPane(jta); this.add(jsp,"Center"); this.add(jp1,"South"); this.setTitle("qq简易聊天--服务端"); this.setSize(350, 250); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); try { //在9999号端口上监听 ServerSocket ss=new ServerSocket(9999); //等待客户端连接 Socket s=ss.accept(); //读取从客户端发来的信息 isr=new InputStreamReader(s.getInputStream()); br=new BufferedReader(isr); pw=new PrintWriter(s.getOutputStream(),true); while(true){ //读取从客户端发来的信息 String info=br.readLine(); jta.append("客户端 对 服务端说:"+info+"\r\n"); } } catch (IOException e) { e.printStackTrace(); }finally{ try { if(pw!=null) pw.close(); if(br!=null) br.close(); if(isr!=null) isr.close(); } catch (Exception e2) { e2.printStackTrace(); } } } @Override public void actionPerformed(ActionEvent e) { //如果用户按下发送信息的按钮 if(e.getSource()==jb){ //把服务器在jtf写的 内容发送给客户端 String info=jtf.getText(); //向jta中不断追加内容 jta.append("服务端 对 客户端说:"+info+"\r\n"); pw.println(info); //清空jtf内容 jtf.setText(""); } } }
1
104
 
1
package com.net.server3;
2
import java.awt.event.ActionEvent;
3
import java.awt.event.ActionListener;
4
import java.awt.event.KeyEvent;
5
import java.io.BufferedReader;
6
import java.io.IOException;
7
import java.io.InputStream;
8
import java.io.InputStreamReader;
9
import java.io.PrintWriter;
10
import java.net.*;
11
import javax.swing.AbstractAction;
12
import javax.swing.JButton;
13
import javax.swing.JComponent;
14
import javax.swing.JFrame;
15
import javax.swing.JPanel;
16
import javax.swing.JScrollPane;
17
import javax.swing.JTextArea;
18
import javax.swing.JTextField;
19
import javax.swing.KeyStroke;
20
 
21
public class MyServer3 extends JFrame implements ActionListener{
22
   JTextArea jta;
23
   JTextField jtf;
24
   JButton jb;
25
   JPanel jp1;
26
   JScrollPane jsp;
27
 
28
   InputStreamReader isr;
29
   BufferedReader br;
30
   PrintWriter pw;
31
 
32
   public static void main(String[] args) {
33
       new MyServer3();
34
   }
35
 
36
   //构造函数
37
   public MyServer3(){
38
       jta=new JTextArea();
39
       jtf=new JTextField(20);
40
       jb=new JButton("发送");
41
       jb.addActionListener(this);
42
       //给jb发送按钮添加快捷键(回车)事件
43
       jb.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "fasong");
44
       jb.getActionMap().put("fasong", new AbstractAction() {
45
           public void actionPerformed(ActionEvent e) {
46
               String info=jtf.getText();
47
               jta.append("客户端 对 服务端说:"+info+"\r\n");
48
               pw.println(info);
49
               jtf.setText("");
50
           }
51
       });
52
     
53
       jp1=new JPanel();
54
       jp1.add(jtf);
55
       jp1.add(jb);
56
       jsp=new JScrollPane(jta);
57
       this.add(jsp,"Center");
58
       this.add(jp1,"South");
59
       this.setTitle("qq简易聊天--服务端");
60
       this.setSize(350, 250);
61
       this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
62
       this.setVisible(true);
63
     
64
       try {
65
           //在9999号端口上监听
66
           ServerSocket ss=new ServerSocket(9999);
67
           //等待客户端连接
68
           Socket s=ss.accept();
69
           //读取从客户端发来的信息
70
           isr=new InputStreamReader(s.getInputStream());
71
           br=new BufferedReader(isr);
72
           pw=new PrintWriter(s.getOutputStream(),true);
73
           while(true){
74
               //读取从客户端发来的信息
75
               String info=br.readLine();
76
               jta.append("客户端 对 服务端说:"+info+"\r\n");
77
           }
78
       } catch (IOException e) {
79
           e.printStackTrace();
80
       }finally{
81
           try {
82
               if(pw!=null) pw.close();
83
               if(br!=null) br.close();
84
               if(isr!=null) isr.close();
85
           } catch (Exception e2) {
86
               e2.printStackTrace();
87
           }
88
       }
89
   }
90
 
91
   @Override
92
   public void actionPerformed(ActionEvent e) {
93
       //如果用户按下发送信息的按钮
94
       if(e.getSource()==jb){
95
           //把服务器在jtf写的 内容发送给客户端
96
           String info=jtf.getText();
97
           //向jta中不断追加内容
98
           jta.append("服务端 对 客户端说:"+info+"\r\n");
99
           pw.println(info);
100
           //清空jtf内容
101
           jtf.setText("");
102
       }
103
   }
104
}

*******************************************************************************

[MyClient3.java]客户端源代码

/**

 * 这是一个客户端程序,可以连接服务器端口9999

 */

package com.net.client3; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.*; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.KeyStroke; public class MyClient3 extends JFrame implements ActionListener{ JTextArea jta; JTextField jtf; JButton jb; JPanel jp1; JScrollPane jsp; InputStreamReader isr; BufferedReader br; PrintWriter pw; public static void main(String[] args) { new MyClient3(); } public MyClient3(){ jta=new JTextArea(); jtf=new JTextField(20); jtf.setFocusable(true); jb=new JButton("发送"); jb.addActionListener(this); //给jb发送按钮添加快捷键(回车)事件 jb.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "fasong"); jb.getActionMap().put("fasong", new AbstractAction() { public void actionPerformed(ActionEvent e) { String info=jtf.getText(); jta.append("客户端 对 服务端说:"+info+"\r\n"); pw.println(info); jtf.setText(""); } }); jp1=new JPanel(); jp1.add(jtf); jp1.add(jb); jsp=new JScrollPane(jta); this.add(jsp,"Center"); this.add(jp1,"South"); this.setTitle("qq简易聊天--客户端"); this.setSize(350, 250); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); try { //Socket()就是去连接某个服务器端 127.0.0.1表示服务器的ip Socket s=new Socket("127.0.0.1",9999); InputStreamReader isr=new InputStreamReader(s.getInputStream()); BufferedReader br=new BufferedReader(isr); pw=new PrintWriter(s.getOutputStream(),true); while(true){ //读取服务器端发来的信息 String info=br.readLine(); jta.append("服务端 对 客户端说:"+info+"\r\n"); } } catch (Exception e) { e.printStackTrace(); }finally{ try { if(pw!=null) pw.close(); if(br!=null) br.close(); if(isr!=null) isr.close(); } catch (Exception e2) { e2.printStackTrace(); } } } @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==jb){ String info=jtf.getText(); jta.append("客户端 对 服务端说:"+info+"\r\n"); pw.println(info); jtf.setText(""); } } }
1
106
 
1
package com.net.client3;
2
 
3
import java.awt.event.ActionEvent;
4
import java.awt.event.ActionListener;
5
import java.awt.event.KeyEvent;
6
import java.io.BufferedReader;
7
import java.io.IOException;
8
import java.io.InputStreamReader;
9
import java.io.PrintWriter;
10
import java.net.*;
11
import javax.swing.AbstractAction;
12
import javax.swing.JButton;
13
import javax.swing.JComponent;
14
import javax.swing.JFrame;
15
import javax.swing.JPanel;
16
import javax.swing.JScrollPane;
17
import javax.swing.JTextArea;
18
import javax.swing.JTextField;
19
import javax.swing.KeyStroke;
20
 
21
public class MyClient3 extends JFrame implements ActionListener{
22
   JTextArea jta;
23
   JTextField jtf;
24
   JButton jb;
25
   JPanel jp1;
26
   JScrollPane jsp;
27
 
28
   InputStreamReader isr;
29
   BufferedReader br;
30
   PrintWriter pw;
31
 
32
   public static void main(String[] args) {
33
       new MyClient3();
34
   }
35
 
36
   public MyClient3(){
37
       jta=new JTextArea();
38
       jtf=new JTextField(20);
39
       jtf.setFocusable(true);
40
       jb=new JButton("发送");
41
       jb.addActionListener(this);
42
       //给jb发送按钮添加快捷键(回车)事件
43
   jb.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "fasong");
44
       jb.getActionMap().put("fasong", new AbstractAction() {
45
           public void actionPerformed(ActionEvent e) {
46
               String info=jtf.getText();
47
               jta.append("客户端 对 服务端说:"+info+"\r\n");
48
               pw.println(info);
49
               jtf.setText("");
50
           }
51
       });
52
     
53
       jp1=new JPanel();
54
       jp1.add(jtf);
55
       jp1.add(jb);
56
       jsp=new JScrollPane(jta);
57
       this.add(jsp,"Center");
58
       this.add(jp1,"South");
59
     
60
       this.setTitle("qq简易聊天--客户端");
61
       this.setSize(350, 250);
62
       this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
63
       this.setVisible(true);
64
     
65
       try {
66
           //Socket()就是去连接某个服务器端 127.0.0.1表示服务器的ip
67
           Socket s=new Socket("127.0.0.1",9999);
68
 
69
           InputStreamReader isr=new InputStreamReader(s.getInputStream());
70
           BufferedReader br=new BufferedReader(isr);
71
           pw=new PrintWriter(s.getOutputStream(),true);
72
           while(true){
73
               //读取服务器端发来的信息
74
               String info=br.readLine();
75
               jta.append("服务端 对 客户端说:"+info+"\r\n");
76
           }
77
       } catch (Exception e) {
78
           e.printStackTrace();
79
       }finally{
80
           try {
81
               if(pw!=null) pw.close();
82
               if(br!=null) br.close();
83
               if(isr!=null) isr.close();
84
           } catch (Exception e2) {
85
               e2.printStackTrace();
86
           }
87
       }
88
   }
89
 
90
   @Override
91
   public void actionPerformed(ActionEvent e) {
92
       if(e.getSource()==jb){
93
           String info=jtf.getText();
94
           jta.append("客户端 对 服务端说:"+info+"\r\n");
95
           pw.println(info);
96
           jtf.setText("");
97
       }
98
   }
99
}
100
 

转载于:https://www.cnblogs.com/xuxaut-558/p/10047893.html

你可能感兴趣的文章
爬虫豆瓣top250项目-开发文档
查看>>
有趣的数学书籍
查看>>
teamviewer 卸载干净
查看>>
eclipse的maven、Scala环境搭建
查看>>
架构师之路(一)- 什么是软件架构
查看>>
USACO 土地购买
查看>>
【原创】远景能源面试--一面
查看>>
B1010.一元多项式求导(25)
查看>>
10、程序员和编译器之间的关系
查看>>
配置 RAILS FOR JRUBY1.7.4
查看>>
修改GRUB2背景图片
查看>>
Ajax异步
查看>>
好记性不如烂笔杆-android学习笔记<十六> switcher和gallery
查看>>
JAVA GC
查看>>
3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)
查看>>
图解SSH原理及两种登录方法
查看>>
查询个人站点的文章、分类和标签查询
查看>>
基础知识:数字、字符串、列表 的类型及内置方法
查看>>
JSP的隐式对象
查看>>
JS图片跟着鼠标跑效果
查看>>