Java网络编程,通过TCP,Socket实现多对一的局域网聊天室

来源:互联网 发布:ubuntu 进入根目录 编辑:程序博客网 时间:2024/05/16 07:30

学习Java的同学注意了!!! 
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:183993990  我们一起学Java!


java网络编程,通过TCP,Socket实现多对一的局域网聊天室

可以实现多个客户端连接服务器,服务器接收到信息就会把信息广播到所有的客户端

 

这是服务器端的代码

复制代码
import java.awt.BorderLayout;import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.net.Socket;import java.util.List;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;/*这个类是服务器端的UI*/public class ServerUI extends JFrame {    public static void main(String[] args) {        ServerUI serverUI = new ServerUI();    }    public JButton btStart;//启动服务器    public JButton btSend;//发送信息按钮    public JTextField tfSend;//需要发送的文本信息    public JTextArea taShow;//信息展示    public Server server;//用来监听客户端连接    static List<Socket> clients;//保存连接到服务器的客户端    public ServerUI() {        super("服务器端");        btStart = new JButton("启动服务");        btSend = new JButton("发送信息");        tfSend = new JTextField(10);        taShow = new JTextArea();        btStart.addActionListener(new ActionListener() {            public void actionPerformed(ActionEvent e) {                server = new Server(ServerUI.this);            }        });        btSend.addActionListener(new ActionListener() {            public void actionPerformed(ActionEvent e) {                server.sendMsg(tfSend.getText());                tfSend.setText("");            }        });        this.addWindowListener(new WindowAdapter() {            public void windowClosing(WindowEvent e) {                int a = JOptionPane.showConfirmDialog(null, "确定关闭吗?", "温馨提示",                        JOptionPane.YES_NO_OPTION);                if (a == 1) {                    server.closeServer();                    System.exit(0); // 关闭                }            }        });        JPanel top = new JPanel(new FlowLayout());        top.add(tfSend);        top.add(btSend);        top.add(btStart);        this.add(top, BorderLayout.SOUTH);        final JScrollPane sp = new JScrollPane();        sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);        sp.setViewportView(this.taShow);        this.taShow.setEditable(false);        this.add(sp, BorderLayout.CENTER);        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        this.setSize(400, 300);        this.setLocation(100, 200);        this.setVisible(true);    }}
复制代码
复制代码
import java.io.BufferedReader;import java.io.IOException;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;import java.util.ArrayList;/*这个类是服务器端的等待客户端连接*/public class Server extends Thread {    ServerUI ui;    ServerSocket ss;    BufferedReader reader;    PrintWriter writer;    public Server(ServerUI ui) {        this.ui = ui;        this.start();    }    public void run() {        try {            ss = new ServerSocket(1228);            ui.clients=new ArrayList<Socket>();            println("启动服务器成功:端口1228");                        while (true) {                println("等待客户端");                Socket client = ss.accept();                ui.clients.add(client);                println("连接成功" + client.toString());                new ListenerClient(ui, client);            }        } catch (IOException e) {            println("启动服务器失败:端口1228");            println(e.toString());            e.printStackTrace();        }    }    public synchronized void sendMsg(String msg) {        try {            for (int i = 0; i < ui.clients.size(); i++) {                Socket client = ui.clients.get(i);                writer = new PrintWriter(client.getOutputStream(), true);                writer.println(msg);            }        } catch (Exception e) {            println(e.toString());        }    }    public void println(String s) {        if (s != null) {            this.ui.taShow.setText(this.ui.taShow.getText() + s + "\n");            System.out.println(s + "\n");        }    }    public void closeServer() {        try {            if (ss != null)                ss.close();            if (reader != null)                reader.close();            if (writer != null)                writer.close();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}
复制代码
复制代码
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;/*这个类是服务器端的等待客户端发送信息*/public class ListenerClient extends Thread {    BufferedReader reader;    PrintWriter writer;    ServerUI ui;    Socket client;    public ListenerClient(ServerUI ui, Socket client) {        this.ui = ui;        this.client=client;        this.start();    }    //为每一个客户端创建线程等待接收信息,然后把信息广播出去    public void run() {        String msg = "";        while (true) {            try {                reader = new BufferedReader(new InputStreamReader(                        client.getInputStream()));                writer = new PrintWriter(client.getOutputStream(), true);                msg = reader.readLine();                sendMsg(msg);                            } catch (IOException e) {                println(e.toString());                // e.printStackTrace();                break;            }            if (msg != null && msg.trim() != "") {                println(">>" + msg);            }        }    }    //把信息广播到所有用户    public synchronized void sendMsg(String msg) {        try {            for (int i = 0; i < ui.clients.size(); i++) {                Socket client = ui.clients.get(i);                writer = new PrintWriter(client.getOutputStream(), true);                writer.println(msg);            }        } catch (Exception e) {            println(e.toString());        }    }        public void println(String s) {        if (s != null) {            this.ui.taShow.setText(this.ui.taShow.getText() + s + "\n");            System.out.println(s + "\n");        }    }}
复制代码

 

客户端代码

复制代码
import java.awt.BorderLayout;import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;public class ClientUI extends JFrame {    public static void main(String[] args) {        ClientUI client = new ClientUI();    }    public ClientUI() {        super("客户端");        btStart = new JButton("启动连接");        btSend = new JButton("发送信息");        tfSend = new JTextField(10);        tfIP = new JTextField(10);        tfPost = new JTextField(5);        taShow = new JTextArea();        btStart.addActionListener(new ActionListener() {            public void actionPerformed(ActionEvent e) {                server = new ClientThread(ClientUI.this);            }        });        btSend.addActionListener(new ActionListener() {            public void actionPerformed(ActionEvent e) {                server.sendMsg(tfSend.getText());                tfSend.setText("");            }        });        this.addWindowListener(new WindowAdapter() {            public void windowClosing(WindowEvent e) {                int a = JOptionPane.showConfirmDialog(null, "确定关闭吗?", "温馨提示",                        JOptionPane.YES_NO_OPTION);                if (a == 1) {                    System.exit(0); // 关闭                }            }        });        JPanel top = new JPanel(new FlowLayout());        top.add(tfSend);        top.add(btSend);        top.add(btStart);        this.add(top, BorderLayout.SOUTH);        final JScrollPane sp = new JScrollPane();        sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);        sp.setViewportView(this.taShow);        this.taShow.setEditable(false);        this.add(sp, BorderLayout.CENTER);        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        this.setSize(400, 300);        this.setLocation(600, 200);        this.setVisible(true);    }    public     JButton btStart;    public     JButton btSend;    public     JTextField tfSend;    public     JTextField tfIP;    public     JTextField tfPost;        public     JTextArea taShow;    public     ClientThread server;    }
复制代码
复制代码
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;public class ClientThread extends Thread {    ClientUI ui;    Socket client;    BufferedReader reader;    PrintWriter writer;    public ClientThread(ClientUI ui) {        this.ui = ui;        try {            client = new Socket("127.0.0.1", 1228);//这里设置连接服务器端的IP的端口            println("连接服务器成功:端口1228");            reader = new BufferedReader(new InputStreamReader(                    client.getInputStream()));            writer = new PrintWriter(client.getOutputStream(), true);            // 如果为 true,则 println、printf 或 format 方法将刷新输出缓冲区        } catch (IOException e) {            println("连接服务器失败:端口1228");            println(e.toString());            e.printStackTrace();        }        this.start();    }    public void run() {        String msg = "";        while (true) {            try {                msg = reader.readLine();            } catch (IOException e) {                println("服务器断开连接");                break;            }            if (msg != null && msg.trim() != "") {                println(">>" + msg);            }        }    }    public void sendMsg(String msg) {        try {            writer.println(msg);        } catch (Exception e) {            println(e.toString());        }    }    public void println(String s) {        if (s != null) {            this.ui.taShow.setText(this.ui.taShow.getText() + s + "\n");            System.out.println(s + "\n");        }    }    }
复制代码

学习Java的同学注意了!!! 
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:183993990  我们一起学Java!

1 0
原创粉丝点击