第十五天 简单聊天

来源:互联网 发布:套利程序化交易软件 编辑:程序博客网 时间:2024/05/16 12:18

服务器与单客户端聊天

package com.java.test1;import java.awt.EventQueue;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.border.EmptyBorder;import com.java.test.MyServerRead;import javax.swing.DefaultListModel;import javax.swing.JButton;import java.awt.event.ActionListener;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.awt.event.ActionEvent;import javax.swing.JTextArea;import javax.swing.JList;public class Server extends JFrame {    private JPanel contentPane;    private JTextArea textArea;    private JList list;    private DefaultListModel<String> model;    private ArrayList<Socket> sockets;    public boolean isRunning=true;    private JButton button;    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 {                    Server frame = new Server();                    frame.setVisible(true);                } catch (Exception e) {                    e.printStackTrace();                }            }        });    }    /**     * Create the frame.     */    public Server() {        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) {                model.addElement(textArea.getText());                write();            }        });        btnNewButton.setBounds(283, 189, 127, 52);        contentPane.add(btnNewButton);        textArea = new JTextArea();        textArea.setBounds(10, 189, 250, 52);        contentPane.add(textArea);        button = new JButton("启动服务器");        button.addActionListener(new ActionListener() {            public void actionPerformed(ActionEvent e) {                isRunning=true;                new Thread(new Runnable(){                    public void run(){                        try {                            ServerSocket server = new ServerSocket(8080);                            System.out.println("服务器启动");                            sockets=new ArrayList<>();                            while(isRunning){                                Socket socket = server.accept();                                sockets.add(socket);                                Thread t=new Thread(new ServerRead(Server.this,socket));                                t.start();                                System.out.println("有客户端连接");                            }                        } catch (IOException e1) {                            e1.printStackTrace();                        }                    }                }).start();            }        });        button.setBounds(283, 32, 127, 33);        contentPane.add(button);        list = new JList();        model=new DefaultListModel<>();        list.setModel(model);        list.setBounds(10, 10, 250, 162);        contentPane.add(list);    }    public void read(Socket socket) {        if(socket.isConnected()){            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) {                e.printStackTrace();            }        }else{            sockets.remove(socket);        }    }    public void write(){        try {            for(Socket socket:sockets){                OutputStream os=socket.getOutputStream();                BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os));                String words=textArea.getText();                System.out.println("服务器发送信息");                bw.write("服务器说:  "+words+"\n");                bw.flush();            }            textArea.setText("");        } catch (IOException e) {            e.printStackTrace();        }    }}
package com.java.test1;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.Socket;import java.net.UnknownHostException;import javax.swing.DefaultListModel;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.border.EmptyBorder;import javax.swing.JButton;import java.awt.event.ActionListener;import java.awt.event.ActionEvent;import javax.swing.JTextArea;import javax.swing.JList;public class Client extends JFrame {    private JPanel contentPane;    private Socket socket;    private JTextArea textArea;    private JList list;    DefaultListModel<String> model;    /**     * Launch the application.     */    public static void main(String[] args) {        EventQueue.invokeLater(new Runnable() {            public void run() {                try {                    Client frame = new Client();                    frame.setVisible(true);                } catch (Exception e) {                    e.printStackTrace();                }            }        });    }    /**     * Create the frame.     */    public Client() {        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) {                write();            }        });        btnNewButton.setBounds(305, 200, 99, 36);        contentPane.add(btnNewButton);        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.85",8080);                    System.out.println("服务器连接成功");                    Thread t=new Thread(new ClientRead(Client.this));                    t.start();                } catch (UnknownHostException e1) {                    e1.printStackTrace();                } catch (IOException e1) {                    e1.printStackTrace();                }                       }        });        btnNewButton_1.setBounds(264, 68, 160, 60);        contentPane.add(btnNewButton_1);        textArea = new JTextArea();        textArea.setBounds(10, 207, 228, 45);        contentPane.add(textArea);        list = new JList();        list.setBounds(10, 22, 228, 173);        model=new DefaultListModel<>();        list.setModel(model);        contentPane.add(list);    }    public void read() {        try {            InputStream is = socket.getInputStream();            BufferedReader br = new BufferedReader(new InputStreamReader(is));            String line = br.readLine();            model.addElement(line);            System.out.println(line);        } catch (IOException e) {            e.printStackTrace();        }    }    public void write(){        try {            OutputStream os=socket.getOutputStream();            BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os));            String words=textArea.getText();            bw.write(words+"\n");            model.addElement("客户端说:   "+words);            textArea.setText("");            bw.flush();        } catch (IOException e) {            e.printStackTrace();        }    }}
package com.java.test1;public class ClientRead implements Runnable {    private Client client;    public ClientRead(Client client){        this.client=client;    }    @Override    public void run() {        while(true){            client.read();        }    }}
package com.java.test1;import java.net.Socket;public class ServerRead implements Runnable{    private Server server;    private Socket socket;    public ServerRead(Server server,Socket socket){        this.server=server;        this.socket=socket;    }     @Override    public void run() {        while(server.isRunning){            server.read(socket);        }    }}

这里写图片描述

一客户端通过服务器与指定客户端聊天

package com.java.test;import java.awt.EventQueue;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.border.EmptyBorder;import com.java.test.MyServerRead;import net.sf.json.JSONObject;import javax.swing.DefaultListModel;import javax.swing.JButton;import java.awt.event.ActionListener;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 java.awt.event.ActionEvent;import javax.swing.JTextArea;import javax.swing.JList;public class StartServer extends JFrame {    private JPanel contentPane;    private JTextArea textArea;    private JList list;    private DefaultListModel<String> model;    private HashMap<String,Socket> sockets;    private Socket socket;    public boolean isRunning=true;    private JButton button;    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 {                    StartServer frame = new StartServer();                    frame.setVisible(true);                } catch (Exception e) {                    e.printStackTrace();                }            }        });    }    /**     * Create the frame.     */    public StartServer() {        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) {                model.addElement(textArea.getText());            }        });        btnNewButton.setBounds(283, 189, 127, 52);        contentPane.add(btnNewButton);        textArea = new JTextArea();        textArea.setBounds(10, 189, 250, 52);        contentPane.add(textArea);        button = new JButton("启动服务器");        button.addActionListener(new ActionListener() {            public void actionPerformed(ActionEvent e) {                isRunning=true;                new Thread(new Runnable(){                    public void run(){                        try {                            ServerSocket server = new ServerSocket(8080);                            sockets=new HashMap<>();                            System.out.println("服务器启动");                            while(isRunning){                                socket = server.accept();                                sockets.put(socket.getInetAddress().getHostAddress(),socket);                                Thread t=new Thread(new MyServerRead(StartServer.this,socket));                                t.start();                                System.out.println("有客户端连接");                            }                        } catch (IOException e1) {                            e1.printStackTrace();                        }                    }                }).start();            }        });        button.setBounds(283, 32, 127, 33);        contentPane.add(button);        list = new JList();        model=new DefaultListModel<>();        list.setModel(model);        list.setBounds(10, 10, 250, 162);        contentPane.add(list);    }    public void readLine(String line){        JSONObject obj=JSONObject.fromObject(line);        String type=obj.getString("type");        if(type.equals(("toSingle"))){            String time=obj.getString("time");            String to=obj.getString("to");            String from=obj.getString("from");            String msg=obj.getString("message");            Socket toSocket=sockets.get(to);            System.out.println(toSocket.getInetAddress().getHostAddress());            try {                OutputStream os = toSocket.getOutputStream();                BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os));                bw.write(msg+"\n");                bw.flush();            } catch (IOException e) {                e.printStackTrace();            }        }        model.addElement(line);    }    public void read(Socket socket) {        if(socket.isConnected()){            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) {                e.printStackTrace();            }        }else{            sockets.remove(socket);        }    }    public void write(String msg){        try {            Set<String> keys=sockets.keySet();            Iterator<String> it=keys.iterator();            while(it.hasNext()){                socket=sockets.get(it.next());                OutputStream os=socket.getOutputStream();                BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os));                System.out.println("服务器发送信息");                bw.write(msg+"\n");                bw.flush();            }            textArea.setText("");        } catch (IOException e) {            e.printStackTrace();        }    }}
package com.java.test;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.Socket;import java.net.UnknownHostException;import java.util.Date;import javax.swing.DefaultListModel;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.border.EmptyBorder;import net.sf.json.JSONObject;import javax.swing.JButton;import java.awt.event.ActionListener;import java.awt.event.ActionEvent;import javax.swing.JTextArea;import javax.swing.JList;import javax.swing.JTextField;public class MyClient extends JFrame {    private JPanel contentPane;    private Socket socket;    private JTextArea textArea;    private JList list;    DefaultListModel<String> model;    private JTextField textField;    private JTextField textField_1;    /**     * 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=creatJSON();                write(msg);            }        });        btnNewButton.setBounds(305, 200, 99, 36);        contentPane.add(btnNewButton);        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.85",8080);                    System.out.println("服务器连接成功");                    Thread t=new Thread(new MyClientRead(MyClient.this));                    t.start();                } catch (UnknownHostException e1) {                    e1.printStackTrace();                } catch (IOException e1) {                    e1.printStackTrace();                }            }        });        btnNewButton_1.setBounds(264, 68, 160, 60);        contentPane.add(btnNewButton_1);        textArea = new JTextArea();        textArea.setBounds(10, 207, 228, 45);        contentPane.add(textArea);        list = new JList();        list.setBounds(10, 22, 228, 173);        model=new DefaultListModel<>();        list.setModel(model);        contentPane.add(list);        textField_1 = new JTextField();        textField_1.setBounds(248, 138, 176, 36);        contentPane.add(textField_1);        textField_1.setColumns(10);    }    public String creatJSON(){        String msg=textArea.getText();        JSONObject obj=new JSONObject();        obj.put("type", "toSingle");        obj.put("message",msg);        Date date=new Date();        obj.put("time", date.getTime());        obj.put("from", socket.getInetAddress().getHostAddress());        obj.put("to", "192.168.0.85");        System.out.println(obj.toString());        return obj.toString() ;    }    public void read() {        try {            InputStream is = socket.getInputStream();            BufferedReader br = new BufferedReader(new InputStreamReader(is));            String line = br.readLine();            model.addElement(line);            System.out.println(line);        } catch (IOException e) {            e.printStackTrace();        }    }    public void write(String msg){        try {            OutputStream os=socket.getOutputStream();            BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os));            bw.write(msg+"\n");            model.addElement("客户端说:   "+msg);            textArea.setText("");            bw.flush();        } catch (IOException e) {            e.printStackTrace();        }    }}
package com.java.test;public class MyClientRead implements Runnable {        private MyClient client;        public MyClientRead(MyClient client){            this.client=client;        }        @Override        public void run() {            while(true){                client.read();            }        }    }
package com.java.test;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.Socket;public class MyServerRead implements Runnable{    private StartServer startServer;    private Socket socket;    public MyServerRead(StartServer startServer,Socket socket){        this.startServer=startServer;        this.socket=socket;    }     @Override    public void run() {        try {            InputStream  is = socket.getInputStream();            BufferedReader br=new BufferedReader(new InputStreamReader(is));            while(true){                String line=br.readLine();                startServer.readLine(line);                System.out.println();            }        } catch (IOException e) {            e.printStackTrace();        }    }}

这里写图片描述

0 0