java实现多人聊天室可视化

编写一个 Java 应用程序,实现图形界面多人聊天室(多线程实现),要求聊天室窗口标题是 “欢迎使用 XXX 聊天室应用”,其中 XXX 是自己的班级姓名学号,如“软件 171 张三 1234”。

客户端

import java.awt.BorderLayout;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import java.io.*;
class Login extends JFrame implements ActionListener{
    //用户名
    JPanel jp1=new JPanel();
    JLabel jl1=new JLabel("用户名");
    public JTextField jtf1=new JTextField(15);
    //密码
    JPanel jp2=new JPanel();
    JLabel jl2=new JLabel("密码");
    JPasswordField jpf2 = new JPasswordField(15);
    //登入取消按钮
    JPanel jp3=new JPanel();
    JButton jbt1=new JButton("登入");
    JButton jbt2=new JButton("取消");
    
    public Login() {
        // TODO 自动生成的构造函数存根
        this.setTitle("客服端登入窗口");
        Container con =this.getContentPane();
        con.setLayout(new FlowLayout());
        //用户名
        jp1.add(jl1);
        jp1.add(jtf1);
        jtf1.addActionListener(this);
        //密码
        jpf2.setEchoChar('*');  //用*显示密码框输入的数据
        jp2.add(jl2);
        jp2.add(jpf2);
        jpf2.addActionListener(this);
        //登入取消按钮
        jp3.add(jbt1);
        jp3.add(jbt2);
        //添加到当前窗口容器
        con.add(jp1);
        con.add(jp2);
        con.add(jp3);
        this.setSize(500, 300);    //设置窗体大小
        setLocationRelativeTo(null); //设置窗口居中
        this.setResizable(false);  //窗体大小设置为不可改
        this.setVisible(true);  //窗体设置为可见
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        //光标聚焦在用户框中
        jtf1.requestFocus(); 
        //为登入按钮添加监听器
        jbt1.addActionListener(new ActionListener() { 
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO 自动生成的方法存根
                String name=jtf1.getText();
                String password=new String(jpf2.getPassword()); //获取密码框中的密码
                try {
                    if(password.equals("123")) {
                        setVisible(false);
                        new Client(jtf1.getText());
                    }
                    else {
                        JOptionPane.showConfirmDialog(null, "用户名或密码错误!",
                                "提示",JOptionPane.DEFAULT_OPTION);
                    }
                } catch (Exception e2) {
                    // TODO: handle exception
                    e2.printStackTrace();
                }
            }
        });
        jbt2.addActionListener(new ActionListener() { //为取消按钮添加监听器
            
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO 自动生成的方法存根
                try {
                    setVisible(false);
                } catch (Exception e2) {
                    // TODO: handle exception
                }
            }
        });
    }
    //移动光标聚集
    public void actionPerformed(ActionEvent e) {
        Object o=e.getSource();
        if(o==jtf1) {
            jpf2.requestFocus();
        }
    }
}

public class Client extends JFrame  {
    public DataOutputStream dos=null;
    public DataInputStream dis=null;
    public Socket s=null;
    public ServerSocket sc=null;
    //
    public JTextArea jta=new JTextArea(10,20);
    public JTextField jtf=new JTextField(20);
    public JScrollPane jsp = new JScrollPane(jta);
    static final String CONNSTR="127.0.0.1";
    public String ClientName="";

    //构造函数初始化
    Client(String tClientName) throws IOException{
        ClientName=tClientName;
        this.setTitle("客服端:"+ClientName);
        jta.setEditable(false); //文本显示框不可编辑
        this.add(jtf,BorderLayout.SOUTH);
        this.add(jsp,BorderLayout.CENTER);
        //默认的设置是超过文本框才会显示滚动条,以下设置让滚动条一直显示
        jsp.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        //连接服务器
        
        try {
            s=new Socket(CONNSTR,9995);
            new ThreadClient(s,this).start();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            JOptionPane.showConfirmDialog(null, "用户连接服务器失败",
                    "提示",JOptionPane.DEFAULT_OPTION);
        }
        //发送登入信息到服务器
        String firstStr="\""+ClientName+"\":"+"登入成功";
        DataOutputStream firstdataOutputStream = new DataOutputStream(s.getOutputStream());
        //发送用户名到服务端
        firstdataOutputStream.writeUTF(firstStr);
        firstdataOutputStream.flush();
        //
        this.setBounds(300,300,300,400);        
        //this.setSize(500, 300);    //设置窗体大小
        setLocationRelativeTo(null); //设置窗口居中
        this.setVisible(true);  //窗体设置为可见
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        jtf.requestFocus();
        //
        
        jtf.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO 自动生成的方法存根
                String str=jtf.getText();
                try {
                    if(str.length()>0) {
                        str="\""+ClientName+"\":"+str;
                        sendMessage(str, s);
                        jtf.setText("");
                    }
                } catch (Exception e2) {
                    // TODO: handle exception
                    e2.printStackTrace();
                    str="\""+ClientName+"\":"+"已退出";
                    sendMessage(str,s);
                }
                
            }
        });
    }
    //客服端发送信息到服务器
    protected void sendMessage(String message, Socket s) {
        try {
            DataOutputStream dos = new DataOutputStream(s.getOutputStream());
            dos.writeUTF(message);
            dos.flush();    
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        new Login();
    }
}
//定义线程类,读取服务器发送的信息
class ThreadClient extends Thread {
    private Socket s;
    private Client clientChat;

    ThreadClient(Socket socket, Client clientChat) {
        this.s = socket;
        this.clientChat = clientChat;
    }
    @Override
    public void run() {
        String message;
        try {
            while (true) {
                    DataInputStream DataInputStream = new DataInputStream(s.getInputStream());
                    message = DataInputStream.readUTF();
                    clientChat.jtf.setText("");
                    clientChat.jta.append(message+"\n");
                }
        }
        catch (IOException e) {
            // TODO Auto-generated catch block
                e.printStackTrace();
                message="\""+clientChat.ClientName+"\":"+"已退出";
                clientChat.sendMessage(message,s);
        }
    }
}

服务端

import java.awt.BorderLayout;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

import javax.naming.ldap.LdapName;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Server extends JFrame {
    //static List<Socket>ls=new ArrayList<Socket>();
    //static List<String>lname=new ArrayList<String>();
    public static Map<Socket,String> socketsMaps 
    = Collections.synchronizedMap(new HashMap<Socket,String>());
    //
    ServerSocket sc=null;
    Socket s=null;
    public JTextArea jta=new JTextArea(10,20);
    public JScrollPane jsp=new JScrollPane(jta);
    public String ServerName="服务器";
    static int number=1;
    Server() throws IOException{
        super();
        setTitle("服务器");
        jta.setEditable(false); //文本显示框不可编辑
        this.add(jsp,BorderLayout.CENTER);
          //默认的设置是超过文本框才会显示滚动条,以下设置让滚动条一直显示
        jsp.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        //this.add(jta,BorderLayout.CENTER);  //不需要重复添加
        this.setBounds(300,300,300,400);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //
    }
    public void init() {
        int count = 0; // 记录登录到该服务器的客户端个数
            try {
                sc = new ServerSocket(9995); // 创建一个ServerSocket对象,端口号为1906
                jta.append("服务器已启动"+'\n');
                while (true) {
                    Socket socket=sc.accept();
                    new ThreadServer(socket,this).start();
                }
            }
            catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
            
    }
    
    public static void main(String[] args) throws IOException{
        new Server().init();
    }
}

class ThreadServer extends Thread {
    private Socket ts;
    private Server tsr;
    ThreadServer(){};
    ThreadServer(Socket s,Server sr)
    {
        this.ts = s;
        this.tsr=sr;
    }
    public void run() {
        
        try {
            while(true)
            {
                DataInputStream dis = new DataInputStream(ts.getInputStream());
                String message=dis.readUTF();
                if(message.endsWith(":登入成功")) {
                    message.replaceAll(":登入成功", "");
                    tsr.socketsMaps.put(ts,message);
                }
                tsr.jta.append(message+'\n');
                Set<Socket> sockets = tsr.socketsMaps.keySet();
                for(Socket tts : sockets) {
                    DataOutputStream dos = new DataOutputStream(tts.getOutputStream());
                    dos.writeUTF(message);
                    dos.flush();
                }
            }
        }
        catch (IOException e2) {
            // TODO: handle exception
            e2.printStackTrace();
        }
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 使用java基于pushlet和bootstrap实现的简单聊天室

    这是一个简单的不能再简单的聊天室,本代码包含以下功能 1.用户注册. 2.用户登录. 3.当然还可以聊天. DBUtil.java 复制代码 代码如下: package com.hongyuan.core;   import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statemen

  • Java Socket聊天室编程(二)之利用socket实现单聊聊天室

    在上篇文章Java Socket聊天室编程(一)之利用socket实现聊天之消息推送中我们讲到如何使用socket让服务器和客户端之间传递消息,达到推送消息的目的,接下来我将写出如何让服务器建立客户端与客户端之间的通讯. 其实就是建立一个一对一的聊天通讯. 与上一篇实现消息推送的代码有些不同,在它上面加以修改的. 如果没有提到的方法或者类则和上一篇一模一样. 1,修改实体类(服务器端和客户端的实体类是一样的) 1,UserInfoBean 用户信息表 public class UserInfoB

  • Java Socket聊天室编程(一)之利用socket实现聊天之消息推送

    相关阅读:Java Socket聊天室编程(二)之利用socket实现单聊聊天室 网上已经有很多利用socket实现聊天的例子了,但是我看过很多,多多少有一些问题存在. 这里我将实现一个比较完整的聊天例子,并解释其中的逻辑. 由于socket这一块比较大,所以我将分出几篇来写一个比较完整的socket例子. 这里我们先来实现一个最简单的,服务器与客户端通讯,实现消息推送的功能. 目的:服务器与客户端建立连接,客户端可以向服务器发送消息,服务器可以向客户端推送消息. 1,使用java建立socke

  • java socket实现聊天室 java实现多人聊天功能

    用java socket做一个聊天室,实现多人聊天的功能.看了极客学院的视频后跟着敲的.(1DAY) 服务端: 1. 先写服务端的类MyServerSocket,里面放一个监听线程,一启动就好 2. 实现服务端监听类ServerListener.java,用accept来监听,一旦有客户端连上,生成新的socket,就新建个线程实例ChatSocket.启动线程后就把线程交给ChatManager管理 3. 在ChatSocket中实现从客户端读取内容,把读取到的内容发给集合内所有的客户端 4.

  • java实现一个简单TCPSocket聊天室功能分享

    本文实例为大家分享了java实现TCPSocket聊天室功能的相关代码,供大家参考,具体内容如下 1.TCPserver.java import java.net.*; import java.io.*; import java.util.*; import java.util.concurrent.*; public class TCPserver{ private static final int SERVERPORT = 8888; private ServerSocket MyServe

  • Java基于UDP协议实现简单的聊天室程序

    最近比较闲,一直在抽空回顾一些Java方面的技术应用. 今天没什么事做,基于UDP协议,写了一个非常简单的聊天室程序. 现在的工作,很少用到socket,也算是对Java网络编程方面的一个简单回忆. 先看一下效果: 实现的效果可以说是非常非常简单,但还是可以简单的看到一个实现原理.  "聊天室001"的用户,小红和小绿相互聊了两句,"聊天室002"的小黑无人理会,在一旁寂寞着. 看一下代码实现: 1.首先是消息服务器的实现,功能很简单: •将客户端的信息(进入了哪一

  • 使用Java和WebSocket实现网页聊天室实例代码

    在没介绍正文之前,先给大家介绍下websocket的背景和原理: 背景 在浏览器中通过http仅能实现单向的通信,comet可以一定程度上模拟双向通信,但效率较低,并需要服务器有较好的支持; flash中的socket和xmlsocket可以实现真正的双向通信,通过 flex ajax bridge,可以在javascript中使用这两项功能. 可以预见,如果websocket一旦在浏览器中得到实现,将会替代上面两项技术,得到广泛的使用.面对这种状况,HTML5定义了WebSocket协议,能更

  • java聊天室的实现代码

    本文实例为大家分享了java实现聊天室的具体代码,供大家参考,具体内容如下 聊天室界面: 源码: public class ClientFrame extends Frame { private TextField textFieldContent = new TextField(); private TextArea textAreaContent = new TextArea(); private Socket socket = null; private OutputStream out

  • 基于java编写局域网多人聊天室

    由于需要制作网络计算机网络课程设计,并且不想搞网络布线或者局域网路由器配置等等这种完全搞不懂的东西,最后决定使用socket基于java编写一个局域网聊天室: 关于socket以及网络编程的相关知识详见我另一篇文章:Java基于socket编程 程序基于C/S结构,即客户端服务器模式. 服务器: 默认ip为本机ip 需要双方确定一个端口号 可设置最大连接人数 可启动与关闭 界面显示在线用户人以及姓名(本机不在此显示) 客户端: 需要手动设置服务器ip地址(局域网) 手动设置端口号 输入姓名 可连

  • Java基于socket实现简易聊天室实例

    本文实例讲述了Java基于socket实现简易聊天室的方法.分享给大家供大家参考.具体实现方法如下: chatroomdemo.java package com.socket.demo; import java.io.IOException; import java.net.DatagramSocket; public class ChatRoomDemo { /** * @param args * @throws IOException */ public static void main(S

随机推荐