JAVA学习第十六天
2015-08-06 22:26
429 查看
客户端与客户端之间的通信 可显示时间 发送ip 接收ip
package com.donghe.test; import java.awt.BorderLayout; import java.awt.EventQueue; 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.HashMap; import java.util.Iterator; import java.util.Set; 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.ActionEvent; import javax.swing.JList; import javax.swing.JLabel; import java.awt.Label; public class MyServer extends JFrame { private DefaultListModel<String> model; private JPanel contentPane; // private ArrayList<Socket> sockets;// socket数组 private HashMap<String, Socket> sockets; JTextArea textArea; private boolean isRunning = true; public boolean isRunning() { return isRunning; } public void setRunning(boolean isRunning) { this.isRunning = isRunning; } /** * 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, 450, 300); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JButton button = new JButton("启动服务器"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { isRunning = true; Runnable run = new Runnable() {// 匿名内部类 @Override public void run() { // TODO Auto-generated method stub try { System.out.println("服务器启动"); ServerSocket server = new ServerSocket(8080);// 等待客户端连接 sockets = new HashMap<>(); while (isRunning) {// 循环 Socket socket = server.accept(); // 有客户端连接进来 System.out.println("客户端连接" + socket.getInetAddress().getHostAddress()); // 每循环一次(如果有客户端连接的话)就会产生一个新的socket String ip = socket.getInetAddress().getHostAddress(); sockets.put(ip, socket); MyServerReadThread msr = new MyServerReadThread(socket, MyServer.this);// 需要另起一个线程与对应的client通信 Thread t = new Thread(msr); t.start(); } } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } }; Thread t = new Thread(run);// 括号里面填的是接口 Runnable t.start(); // new Thread(new Runnable() { // @Override // public void run() { // // TODO Auto-generated method stub // try { // ServerSocket server = new ServerSocket(8080); // System.out.println("服务器启动"); // sockets = new HashMap<>(); // while (isRunning) { // Socket socket = server.accept();// 有客户端连入 // sockets.put(socket.getInetAddress().getHostAddress(), // socket);// 添加 // System.out.println(socket.getInetAddress().getHostAddress() + // "客户端连入"); // Thread t = new Thread(new MyServerReadThread(MyServer.this, // socket)); // t.start(); // } // } catch (IOException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // // } // }).start(); } }); button.setBounds(312, 103, 99, 34); contentPane.add(button); textArea = new JTextArea(); textArea.setBounds(10, 228, 292, 24); contentPane.add(textArea); JButton button_1 = new JButton("发给客户端"); button_1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { } }); button_1.setBounds(312, 228, 99, 24); contentPane.add(button_1); JList list = new JList(); list.setBounds(10, 10, 292, 212); model = new DefaultListModel<>(); list.setModel(model); JScrollPane scroll = new JScrollPane(list);// list为组件 // 大小超过指定的视图大小就会显示水平和垂直滚动条 scroll.setBounds(10, 10, 292, 212);// 大小一样 滚动条 contentPane.add(scroll);// 添加滚动条就行 } public void readLine(String line) { System.out.println("开始解析" + line); JSONObject obj = JSONObject.fromObject(line); String type = obj.getString("type"); model.addElement(line); // 需要将socket中读到的信息显示在JList中 首先想到的是model.addElement(line) // 而line在MyServerReadThread中 不能被调用因为MyServerReadThread是一个线程 // 所以实现这个目的 只能从MyServerReadThread调用 这句话 而这句话放在一个方法里面 if (type.equals("toSingle")) { String to = obj.getString("to"); String msg = obj.getString("message"); String from = obj.getString("from"); String time = obj.getString("time"); Socket toSocket = sockets.get(to); // if (toSocket.isConnected()) { try { OutputStream os = toSocket.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(os); BufferedWriter bw = new BufferedWriter(osw); // bw.write(msg + "\n"); bw.write(line + "\n"); System.out.println("服务器推送出去信息");// 推送给toSocket bw.flush(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } // }else{ // sockets.remove(toSocket); // } } } } // public void read(Socket socket) { // if (socket.isConnected()) {// 如果socket连接 // try { // InputStream is = socket.getInputStream(); // BufferedReader br = new BufferedReader(new InputStreamReader(is)); // String line = br.readLine(); // model.addElement(socket.getInetAddress().getHostAddress() + "---------->" + // line); // // System.out.println("服务器收到的信息:--------------" + line); // } catch (IOException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // } else { // sockets.remove(socket); // } // // } /** * 服务器发送的信息 */ // public void write() { // try { // Set<String> keys = sockets.keySet();// socket对应的ip地址为iekey // Iterator<String> it = keys.iterator(); // while (it.hasNext()) { // Socket socket = sockets.get(it.next());// 通过key(ip地址)得到对应socket // OutputStream os = socket.getOutputStream(); // BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os)); // String words = textArea.getText(); // bw.write(words + "\n"); // bw.flush(); // } // model.addElement("Server-----------------" + textArea.getText()); // textArea.setText("");// 清空 // } catch (IOException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // // }
package com.donghe.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.Socket; public class MyServerReadThread implements Runnable{//线程 private Socket socket; private MyServer myserver; public MyServerReadThread(Socket socket,MyServer myserver){ this.socket=socket; this.myserver=myserver; } @Override public void run() { // TODO Auto-generated method stub while(true){ try { InputStream is=socket.getInputStream(); InputStreamReader isr=new InputStreamReader(is); BufferedReader br=new BufferedReader(isr); String line=br.readLine(); myserver.readLine(line);//调用的是MyServer中的方法 与上面的br.readLine()不一样 调用方法的同时将信息显示到了JList中 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
package com.donghe.test; 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 javax.swing.plaf.basic.DefaultMenuLayout; import net.sf.json.JSONObject; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JTextArea; import javax.swing.JList; 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.awt.event.ActionEvent; import javax.swing.JTextField; import javax.swing.JTable; import javax.swing.JLabel; public class MyClient extends JFrame { private JPanel contentPane; private Socket socket; private JTextArea textArea; private DefaultListModel<String> model; private JList list; private JTextField textField; /** * 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, 450, 300); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JButton btnNewButton = new JButton("发送"); btnNewButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String msg = createMessage(); write(msg); } }); btnNewButton.setBounds(314, 216, 93, 36); contentPane.add(btnNewButton); textArea = new JTextArea(); textArea.setBounds(10, 216, 283, 36); // contentPane.add(textArea); /** * 添加滚动条 */ JScrollPane scroll2 = new JScrollPane(textArea); scroll2.setBounds(10, 216, 283, 36); contentPane.add(scroll2); textArea.setSelectionEnd(textArea.getText().length()); /** * 回车发送功能 */ textArea.addKeyListener(new KeyListener() { @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub if (e.getKeyChar() == KeyEvent.VK_ENTER) { String msg = createMessage(); write(msg); } } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub } }); list = new JList(); list.setBounds(10, 10, 283, 196); model = new DefaultListModel<>(); list.setModel(model); // list.setSelectionEnd(list.);//输入的时候滚动条会跟随滚动 JScrollPane scroll = new JScrollPane(list); scroll.setBounds(32, 10, 261, 183); scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);// 竖直滚动条 scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);// 水平滚动条 contentPane.add(scroll); JButton btnNewButton_1 = new JButton("连接服务器"); btnNewButton_1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { System.out.println("连接服务器"); socket = new Socket("192.168.0.52", 8080); System.out.println("服务器连接成功"); Thread t = new Thread(new MyClientReadThread(MyClient.this, socket)); t.start(); } catch (UnknownHostException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } }); btnNewButton_1.setBounds(314, 26, 93, 44); contentPane.add(btnNewButton_1); textField = new JTextField(); textField.setBounds(320, 185, 87, 21); contentPane.add(textField); textField.setColumns(10); JLabel lblTo = new JLabel("to"); lblTo.setBounds(303, 188, 12, 15); contentPane.add(lblTo); } JSONObject obj = new JSONObject(); public String createMessage() { String msg = textArea.getText(); obj.put("message", msg); obj.put("type", "toSingle"); Calendar calendar = Calendar.getInstance(); long time = calendar.getTimeInMillis(); obj.put("time", "" + time);// 将long类型的时间转换成字符串 obj.put("from", socket.getInetAddress().getHostAddress());// 发送者的ip地址 obj.put("to", textField.getText());// 你希望发给谁的ip地址 手动输入 JTextField 输入一行 System.out.println(obj.toString()); return obj.toString();// 字符串形式 } public void readLine(String line) { JSONObject obj = JSONObject.fromObject(line); String time = obj.getString("time"); long time1 = Long.parseLong(time);// 字符串转换成long类型 String msg = obj.getString("message"); String from = obj.getString("from"); String to = obj.getString("to"); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(time1); model.addElement(calendar.get(Calendar.YEAR) + "/" + calendar.get(Calendar.MONTH) + "/" + calendar.get(Calendar.DAY_OF_MONTH) + " " + calendar.get(Calendar.HOUR_OF_DAY) + ":" + calendar.get(Calendar.MINUTE) + ":" + calendar.get(Calendar.SECOND) + " " + from + "对" + to + "说" + msg); // try { // InputStream is = socket.getInputStream(); // BufferedReader br = new BufferedReader(new InputStreamReader(is)); // String line1 = br.readLine(); // model.addElement(socket.getInetAddress().getHostAddress()+"->" + // line1);// 显示到JList // // System.out.println(line); // } catch (IOException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } } /** * 发送给服务器 */ public void write(String msg) { try { OutputStream os = socket.getOutputStream(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os)); // String words = textArea.getText(); bw.write(msg + "\n"); Calendar calendar = Calendar.getInstance(); model.addElement(calendar.get(Calendar.YEAR) + "/" + calendar.get(Calendar.MONTH) + "/" + calendar.get(Calendar.DAY_OF_MONTH) + " " + calendar.get(Calendar.HOUR_OF_DAY) + ":" + calendar.get(Calendar.MINUTE) + ":" + calendar.get(Calendar.SECOND) + " " +socket.getInetAddress().getHostAddress() + "☞☞☞☞☞说" + textArea.getText()); textArea.setText("");// 清空 bw.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
package com.donghe.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; public class MyClientReadThread implements Runnable{ private MyClient myclient; private Socket socket; public MyClientReadThread(MyClient myclient,Socket socket){ this.myclient=myclient; this.socket=socket; } @Override public void run() { // TODO Auto-generated method stub while(true){//一直在读 try { BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream())); String line=br.readLine(); myclient.readLine(line); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
相关文章推荐
- Java(08-6)
- JAVA中的几个排序算法
- Java ArrayList 初始化
- java正则表达式入门
- SpringBoot 之 Jersey 集成示例代码(来自官网)
- Spring MVC:DispatcherServlet详解
- Java抓取新浪微博首页数据
- Java心得8
- 黑马程序员——struts2学习笔记四(类型转换)
- 关于Java单例
- Puzzler: Nested computeIfAbsent -Java 8
- JAVA技术交流群
- Struts2知多少(2) Struts2 是什么
- Java机试题目_怎样截取字符串
- 关于eclipse生成web工程的时候没有web.xml文件的解决方案
- Java汉字转换为拼音
- Spring的Ioc(控制反转)和DI(依赖注入)
- 理解Java的IO流 2015年8月6日 21:30:38
- Java实现算法之--二分查找法
- Win7环境下用MyEclipse搭建Hbase开发环境