JAVA学习第十六天

客户端与客户端之间的通信 可显示时间 发送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();
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值