通过服务器实现客户端的相互通话。(需要导入jar包)论保存的重要性
来源:互联网 发布:python适合初学者的书 编辑:程序博客网 时间:2024/06/06 20:32
- MyClient程序
- MyClientRead
- MyServer
- MyServer
- MyServerRead
难点,重点为以Json样式去发送数据,服务器接收到后对其进行解析,判断其样式,然后分类向其他客户端发送
MyClient程序
import java.awt.BorderLayout;import java.awt.Component;import java.awt.EventQueue;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.border.EmptyBorder;import net.sf.json.JSONObject;import javax.swing.DefaultListModel;import javax.swing.JButton;import javax.swing.JTextArea;import javax.swing.JList;import javax.swing.JLabel;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.net.Socket;import java.net.UnknownHostException;import java.util.Calendar;import java.util.Date;import java.awt.event.ActionEvent;import javax.swing.JScrollBar;import javax.swing.JScrollPane;public class MyClient extends JFrame { /** * 将变量设定为全局变量,方便在各处的调用 */ private JPanel contentPane; private Socket socket; private DefaultListModel<String> modle; private JTextArea textArea; private JList list; private boolean isRunning = true; public boolean isRunning() { return isRunning; } /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { MyClient frame = new MyClient(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public MyClient() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 597, 477); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); JButton btnNewButton = new JButton("连接服务器"); btnNewButton.setBounds(461, 59, 93, 48); btnNewButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("连接服务器"); try { // 客户端连接服务器程序 socket = new Socket("192.168.0.31", 8080); System.out.println("连接服务器成功"); // 调用线程进行接收 Thread t = new Thread(new MyClientRead(MyClient.this)); // 开始线程 t.start(); } catch (UnknownHostException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } }); contentPane.setLayout(null); contentPane.add(btnNewButton); JButton btnNewButton_1 = new JButton("发送"); btnNewButton_1.setBounds(461, 324, 93, 23); btnNewButton_1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { // 按钮点击事件,点击后将写入内容传出 write(""); // JsonObie } }); contentPane.add(btnNewButton_1); textArea = new JTextArea(); textArea.setBounds(10, 293, 442, 105); textArea.addKeyListener(new KeyListener() { @Override public void keyPressed(KeyEvent e) { // 按键被按下时被触发 // 获得描述keyCode的标签 String keyText = KeyEvent.getKeyText(e.getKeyCode()); if (e.isActionKey()) { // 判断按下的是否为动作键 System.out.println(keyText + " "); System.out.println("您按下的是动作键“" + keyText + "”"); } else { System.out.print("您按下的是非动作键“" + keyText + "”"); // 获得与此事件中的键相关联的字符 int keyCode = e.getKeyCode(); switch (keyCode) { case KeyEvent.VK_ENTER: // 判断按下的是否为Ctrl键 write(""); break; case KeyEvent.VK_ALT: // 判断按下的是否为Alt键 System.out.print(",Alt键被按下"); break; case KeyEvent.VK_SHIFT: // 判断按下的是否为Shift键 System.out.print(",Shift键被按下"); break; } System.out.println(); } } public void keyTyped(KeyEvent e) { // 发生击键事件时被触发 // 获得输入的字符 System.out.println("此次输入的是“" + e.getKeyChar() + "”"); } public void keyReleased(KeyEvent e) { // 按键被释放时被触发 // 获得描述keyCode的标签 String keyText = KeyEvent.getKeyText(e.getKeyCode()); System.out.println("您释放的是“" + keyText + "”键"); System.out.println(); } }); // JScrollPane scrollPane = new JScrollPane(myList); contentPane.add(textArea); list = new JList(); list.setBounds(1, 1, 439, 230); modle = new DefaultListModel<>(); list.setModel(modle); contentPane.add(list); // 用list创建滚动条 JScrollPane scp = new JScrollPane(list); scp.setBounds(10, 21, 441, 232); contentPane.add(scp); JLabel lblNewLabel = new JLabel("聊天记录"); lblNewLabel.setBounds(407, 263, 93, 15); contentPane.add(lblNewLabel); JButton btnNewButton_2 = new JButton("New button1"); btnNewButton_2.setBounds(461, 147, 93, 32); btnNewButton_2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { } }); contentPane.add(btnNewButton_2); JButton btnNton = new JButton("停止接收"); btnNton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { isRunning = false; } }); btnNton.setBounds(461, 219, 93, 23); contentPane.add(btnNton); } public void read() { try { InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line = br.readLine(); System.out.println(); // 创建JSON对象,传入json数据 System.out.println("123"+line); JSONObject obj = JSONObject.fromObject(line); // 得到key为"city"的对象的值 String type = obj.getString("type"); System.out.println("12345666544545"); if (type.equals("toClient")) { String time = obj.getString("time"); String from = obj.getString("from"); String to = obj.getString("to"); String mesg = obj.getString("mesg"); String ip = obj.getString("ip"); // json 解析 // 加入所有内容, modle.addElement(from + "to" + to + ":" + mesg); System.out.println(line); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 发送到服务器 */ public void write(String words) { try { //创建输出流 OutputStream os = socket.getOutputStream(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os)); // 得到文本区的内容 words = textArea.getText().trim(); //将要发送的内容,打包成json文件发送 JSONObject jsonObject = new JSONObject(); Calendar rightNow = Calendar.getInstance(); long time = rightNow.getTimeInMillis(); jsonObject.put("type", "toClient"); jsonObject.put("to", "192.168.0.31"); jsonObject.put("from", "小白"); jsonObject.put("time", "" + time); jsonObject.put("mesg", words); //得到本机的地址,并将其发送出去 jsonObject.put("ip", socket.getInetAddress().getHostAddress()); // 将内容发送出去 bw.write(jsonObject + "\n"); // 在list添加内容 modle.addElement(words); // 发送完后将文本区清空 textArea.setText(""); // write时封装 // 刷新缓冲区 bw.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
MyClientRead
public class MyClientRead implements Runnable { //用其他类创建新的对象,便于使用其他类中的方法,多线程时 //常用,便于传递方法。 private MyClient myClient; //创建新的构造器,方便将值传入 public MyClientRead(MyClient myClient) { this.myClient = myClient; } @Override public void run() { //线程一直在等待接收 while(myClient.isRunning()){ myClient.read(); } }}
MyServer
import java.awt.BorderLayout;import java.awt.EventQueue;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.border.EmptyBorder;import net.sf.json.JSONObject;import javax.swing.DefaultListModel;import javax.swing.JButton;import javax.swing.JTextArea;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.net.ServerSocket;import java.net.Socket;import java.util.ArrayList;import java.util.Calendar;import java.util.Date;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;import java.awt.event.ActionEvent;import javax.swing.JList;public class MyServer extends JFrame { // 将变量定义为全局变量,便于参数的传递 private JPanel contentPane; private JTextArea textArea; private boolean isRunning = true; private JButton btnNewButton_2; private DefaultListModel<String> modle; private JButton button; private HashMap<String, Socket> sockets; private JList list; public boolean isRunning() { return isRunning; } // public boolean isSeRunning() { // return isSeRunning; // } /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { MyServer frame = new MyServer(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public MyServer() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 610, 481); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); JButton btnNewButton = new JButton("开启服务器"); btnNewButton.setBounds(449, 21, 135, 55); btnNewButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { // button的点击事件 isRunning = true; new Thread(new Runnable() { @Override public void run() { try { // 创建服务器 ServerSocket server = new ServerSocket(8080); System.out.println("服务器已经启动"); // 使服务器接收客户端的连入 sockets = new HashMap(); while (isRunning) { //将连入的socket存入hashMap表 Socket socket = server.accept(); sockets.put(socket.getInetAddress().getHostAddress(), socket); // 创建新的线程 Thread t = new Thread(new MyServerRead(MyServer.this, socket)); t.start(); System.out.println("有客户端连接"); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start(); } }); contentPane.setLayout(null); contentPane.add(btnNewButton); textArea = new JTextArea(); textArea.setBounds(10, 258, 446, 155); textArea.addKeyListener(new KeyListener() { @Override public void keyPressed(KeyEvent e) { // 按键被按下时被触发 // 获得描述keyCode的标签 String keyText = KeyEvent.getKeyText(e.getKeyCode()); if (e.isActionKey()) { // 判断按下的是否为动作键 // System.out.println("您按下的是动作键“" + keyText + "”"); } else { // System.out.print("您按下的是非动作键“" + keyText + "”"); // 获得与此事件中的键相关联的字符 int keyCode = e.getKeyCode(); switch (keyCode) { case KeyEvent.VK_ENTER: // 判断按下的是否为Ctrl键 write(); break; case KeyEvent.VK_ALT: // 判断按下的是否为Alt键 System.out.print(",Alt键被按下"); break; case KeyEvent.VK_SHIFT: // 判断按下的是否为Shift键 System.out.print(",Shift键被按下"); break; } System.out.println(); } } public void keyTyped(KeyEvent e) { // 发生击键事件时被触发 // 获得输入的字符 // System.out.println("此次输入的是“" + e.getKeyChar() + "”"); } public void keyReleased(KeyEvent e) { // 按键被释放时被触发 // 获得描述keyCode的标签 String keyText = KeyEvent.getKeyText(e.getKeyCode()); // System.out.println("您释放的是“" + keyText + "”键"); System.out.println(); } }); contentPane.add(textArea); //发送按钮 btnNewButton_2 = new JButton("发送"); btnNewButton_2.setBounds(480, 336, 93, 23); btnNewButton_2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { write(); } }); contentPane.add(btnNewButton_2); button = new JButton("\u505C\u6B62\u63A5\u6536"); button.setBounds(480, 111, 93, 23); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { isRunning = false; } }); contentPane.add(button); list = new JList(); list.setBounds(10, 21, 440, 218); modle = new DefaultListModel<>(); list.setModel(modle); contentPane.add(list); JScrollPane scp = new JScrollPane(list); scp.setBounds(10, 21, 441, 232); contentPane.add(scp); } public void read(Socket socket) { if (socket.isConnected()) { try { InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); // 获取传递过来的值,以每行读取 String str = br.readLine(); JSONObject obj = JSONObject.fromObject(str); // 得到key为"type"的对象的值 String time = obj.getString("time"); String type = obj.getString("type"); // json 解析 // 加入所有内容, if (type.equals("toClient")) { String from = obj.getString("from"); String to = obj.getString("to"); String mesg = obj.getString("mesg"); String ip = obj.getString("ip"); String time1 = obj.getString("time"); Socket sock = sockets.get(to); /** * 对line进行解析,得到要发送的人 */ //modle.addElement(from + "to" + to + ":" + mesg); System.out.println("服务器接收到信息:" + str); new Thread(new Runnable() { @Override public void run() { try { OutputStream os = sock.getOutputStream(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os)); System.out.println("服务器发送信息:" + str); // JSONObject jsonObject = new JSONObject(); // Calendar rightNow = Calendar.getInstance(); // long time = rightNow.getTimeInMillis(); // // jsonObject.put("type", "toClient"); // jsonObject.put("to", to); // jsonObject.put("from", from); // jsonObject.put("time", time1); // jsonObject.put("mesg", mesg); // jsonObject.put("ip", ip); // 因为读入是以每行的形式,所以后面要加换行符 //将信息写出 bw.write(str + "\n"); bw.flush(); System.out.println("shuchuchenggong"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { sockets.remove(socket); } // else remo } public void write() { try { //用set集合得到,HashMap的key Set<String> map = sockets.keySet(); //用迭代器遍历set表 Iterator<String> it = map.iterator(); while (it.hasNext()) { String key = it.next(); Socket socket = sockets.get(key); OutputStream os = socket.getOutputStream(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os)); // 得到文本区的内容 String str = textArea.getText().trim(); System.out.println("服务器发送信息:" + str); //也是以json的形式发出数据 JSONObject jsonObject = new JSONObject(); Calendar rightNow = Calendar.getInstance(); long time = rightNow.getTimeInMillis(); jsonObject.put("type", "toAll"); jsonObject.put("to", socket.getInetAddress().getHostAddress()); jsonObject.put("from", "小白"); jsonObject.put("time", "" + time); jsonObject.put("mesg", str); jsonObject.put("ip", socket.getInetAddress().getHostAddress()); // 因为读入是以每行的形式,所以后面要加换行符,将Json发送出去。 bw.write(jsonObject.toString() + "\n"); //将内容加到历史记录区 modle.addElement(str); bw.flush(); } // 发送后将文本区清空 textArea.setText(""); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
MyServer
import java.awt.BorderLayout;import java.awt.EventQueue;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.border.EmptyBorder;import net.sf.json.JSONObject;import javax.swing.DefaultListModel;import javax.swing.JButton;import javax.swing.JTextArea;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.net.ServerSocket;import java.net.Socket;import java.util.ArrayList;import java.util.Calendar;import java.util.Date;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;import java.awt.event.ActionEvent;import javax.swing.JList;public class MyServer extends JFrame { // 将变量定义为全局变量,便于参数的传递 private JPanel contentPane; private JTextArea textArea; private boolean isRunning = true; private JButton btnNewButton_2; private DefaultListModel<String> modle; private JButton button; private HashMap<String, Socket> sockets; private JList list; public boolean isRunning() { return isRunning; } // public boolean isSeRunning() { // return isSeRunning; // } /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { MyServer frame = new MyServer(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public MyServer() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 610, 481); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); JButton btnNewButton = new JButton("开启服务器"); btnNewButton.setBounds(449, 21, 135, 55); btnNewButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { // button的点击事件 isRunning = true; new Thread(new Runnable() { @Override public void run() { try { // 创建服务器 ServerSocket server = new ServerSocket(8080); System.out.println("服务器已经启动"); // 使服务器接收客户端的连入 sockets = new HashMap(); while (isRunning) { Socket socket = server.accept(); sockets.put(socket.getInetAddress().getHostAddress(), socket); // 创建新的线程 Thread t = new Thread(new MyServerRead(MyServer.this, socket)); t.start(); System.out.println("有客户端连接"); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start(); } }); contentPane.setLayout(null); contentPane.add(btnNewButton); textArea = new JTextArea(); textArea.setBounds(10, 258, 446, 155); textArea.addKeyListener(new KeyListener() { @Override public void keyPressed(KeyEvent e) { // 按键被按下时被触发 // 获得描述keyCode的标签 String keyText = KeyEvent.getKeyText(e.getKeyCode()); if (e.isActionKey()) { // 判断按下的是否为动作键 // System.out.println("您按下的是动作键“" + keyText + "”"); } else { // System.out.print("您按下的是非动作键“" + keyText + "”"); // 获得与此事件中的键相关联的字符 int keyCode = e.getKeyCode(); switch (keyCode) { case KeyEvent.VK_ENTER: // 判断按下的是否为Ctrl键 write(); break; case KeyEvent.VK_ALT: // 判断按下的是否为Alt键 System.out.print(",Alt键被按下"); break; case KeyEvent.VK_SHIFT: // 判断按下的是否为Shift键 System.out.print(",Shift键被按下"); break; } System.out.println(); } } public void keyTyped(KeyEvent e) { // 发生击键事件时被触发 // 获得输入的字符 // System.out.println("此次输入的是“" + e.getKeyChar() + "”"); } public void keyReleased(KeyEvent e) { // 按键被释放时被触发 // 获得描述keyCode的标签 String keyText = KeyEvent.getKeyText(e.getKeyCode()); // System.out.println("您释放的是“" + keyText + "”键"); System.out.println(); } }); contentPane.add(textArea); btnNewButton_2 = new JButton("发送"); btnNewButton_2.setBounds(480, 336, 93, 23); btnNewButton_2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { write(); } }); contentPane.add(btnNewButton_2); button = new JButton("\u505C\u6B62\u63A5\u6536"); button.setBounds(480, 111, 93, 23); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { isRunning = false; } }); contentPane.add(button); list = new JList(); list.setBounds(10, 21, 440, 218); modle = new DefaultListModel<>(); list.setModel(modle); contentPane.add(list); JScrollPane scp = new JScrollPane(list); scp.setBounds(10, 21, 441, 232); contentPane.add(scp); } public void read(Socket socket) { if (socket.isConnected()) { try { InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); // 获取传递过来的值,以每行读取 String str = br.readLine(); JSONObject obj = JSONObject.fromObject(str); // 得到key为"type"的对象的值 String time = obj.getString("time"); String type = obj.getString("type"); // json 解析 // 加入所有内容, if (type.equals("toClient")) { String from = obj.getString("from"); String to = obj.getString("to"); String mesg = obj.getString("mesg"); String ip = obj.getString("ip"); String time1 = obj.getString("time"); Socket sock = sockets.get(to); /** * 对line进行解析,得到要发送的人 */ //modle.addElement(from + "to" + to + ":" + mesg); System.out.println("服务器接收到信息:" + str); new Thread(new Runnable() { @Override public void run() { try { OutputStream os = sock.getOutputStream(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os)); System.out.println("服务器发送信息:" + str); // JSONObject jsonObject = new JSONObject(); // Calendar rightNow = Calendar.getInstance(); // long time = rightNow.getTimeInMillis(); // // jsonObject.put("type", "toClient"); // jsonObject.put("to", to); // jsonObject.put("from", from); // jsonObject.put("time", time1); // jsonObject.put("mesg", mesg); // jsonObject.put("ip", ip); // 因为读入是以每行的形式,所以后面要加换行符 bw.write(str + "\n"); bw.flush(); System.out.println("shuchuchenggong"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { sockets.remove(socket); } // else remo } public void write() { try { Set<String> map = sockets.keySet(); Iterator<String> it = map.iterator(); while (it.hasNext()) { String key = it.next(); Socket socket = sockets.get(key); OutputStream os = socket.getOutputStream(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os)); // 得到文本区的内容 String str = textArea.getText().trim(); System.out.println("服务器发送信息:" + str); //创json,将数据按一定格式传出 JSONObject jsonObject = new JSONObject(); Calendar rightNow = Calendar.getInstance(); long time = rightNow.getTimeInMillis(); jsonObject.put("type", "toAll"); jsonObject.put("to", socket.getInetAddress().getHostAddress()); jsonObject.put("from", "小白"); jsonObject.put("time", "" + time); jsonObject.put("mesg", str); jsonObject.put("ip", socket.getInetAddress().getHostAddress()); // 因为读入是以每行的形式,所以后面要加换行符 bw.write(jsonObject.toString() + "\n"); modle.addElement(str); bw.flush(); } // 发送后将文本区清空 textArea.setText(""); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
MyServerRead
import java.net.Socket;public class MyServerRead implements Runnable {private MyServer myServer;private Socket socket; public MyServerRead(MyServer myServer, Socket socket) { this.myServer=myServer; this.socket=socket; } @Override public void run() { //判断什么时候线程开始接收 while(myServer.isRunning()){ myServer.read(socket); } }}
通过服务器实现客户端的相互通话。(需要导入jar包)论保存的重要性
在接口上使用匿名内部类
interface Person {
public void eat();
}
public class Demo {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println(“eat something”);
}
};
p.eat();
}
}
由上面的例子可以看出,只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现
最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口
0 0
- 通过服务器实现客户端的相互通话。(需要导入jar包)论保存的重要性
- axis2客户端需要使用的jar包
- Hibernate4需要导入的jar包
- HibernateDaoSupport类需要导入的jar包
- HttpServlet需要导入的Jar包
- 导入导出需要的jar包
- 第一次struts2的配置需要导入的jar包
- axis2客户端需要使用的最少jar包
- axis2客户端需要使用的最少jar包
- axis2客户端需要使用的最少jar包
- axis2客户端需要使用的最少jar包
- Axis2 1.5 客户端需要的最小jar包集合
- Jar包的导入
- 使用Hibernate需要导入的一些jar包
- 使用Hibernate需要导入的一些jar包
- 使用JSON时需要导入的jar包
- 【转】使用Hibernate需要导入的一些jar包
- [转]使用Hibernate需要导入的一些JAR包
- Symmetric Tree
- Python伪装浏览器请求爬虫豆瓣小组
- Prim算法
- C++中的组合模式
- Linux - Shell变量的配置守则
- 通过服务器实现客户端的相互通话。(需要导入jar包)论保存的重要性
- nginx 只允许指定IP访问
- Office2007完全卸载
- NYOJ71独木舟上的旅行(贪心)
- mysql 高可用 4
- Java汉字转换为拼音
- Android基础入门教程——4.1.2 Activity初窥门径
- 黑马程序员——单例设计模式
- Ubuntu15 安装VMtools 出错问题解决