java多人聊天室系统代码实现步骤,java实现简易聊天室
编写一个爪哇应用程序,实现图形界面多人聊天室(多线程实现),要求聊天室窗口标题是"欢迎使用(青少年禁看的)X级片或内容聊天室应用",其中(青少年禁看的)X级片或内容是自己的班级姓名学号,如"软件171 张三1234"。
客户端
导入Java。awt。borderlayout导入Java。awt。容器;导入Java。awt。流程布局;导入Java。awt。事件。动作事件;导入Java。awt。事件。动作监听器;导入Java。网。服务器套接字;导入Java。网。插座;导入Java。网。unknownhostexception导入javax。挥棒。jbutton导入javax。挥棒。jframe导入javax。挥棒。jlabel导入javax。挥棒。joptionpane导入javax。挥棒。jpanel导入javax。挥棒。jpasswordfield导入javax。挥棒。jscrollpane导入javax。挥棒。jtextarea导入javax。挥棒。jtextfield导入Java。io。*;类登录扩展窗口实现ActionListener{ //用户名JPanel jp1=new JPanel();JLabel jl1=新JLabel(用户名);public JTextField jtf 1=new JTextField(15);//密码JPanel jp2=new JPanel();JLabel jl2=新JLabel(密码);JPasswordField jpf 2=new JPasswordField(15);//登入取消按钮JPanel jp3=new JPanel();JButton jbt1=新JButton(登入);JButton jbt2=新JButton(取消);公共登录(){ //TODO自动生成的构造函数存根this.setTitle(客服端登入窗口);集装箱con=这个。getcontentpane();con . set layout(new flow layout());//用户名jp1。添加(jl1);jp1。添加(JT f1);JT f1。addactionlistener(this);//密码jpf 2。setechochar( * );//用*显示密码框输入的数据jp2。添加(jl2);jp2。添加(jpf 2);jpf 2。addactionlistener(this);//登入取消按钮jp3。添加(jbt 1);jp3。添加(jbt 2);//添加到当前窗口容器con . add(jp1);con . add(jp2);con . add(jp3);this.setSize(500,300);//设置窗体大小setLocationRelativeTo(null);//设置窗口居中这个。setresizable(false);//窗体大小设置为不可改这个。设置可见(真);//窗体设置为可见这个。setdefaultcloseoperation(JFrame .EXIT _ ON _ CLOSE);//光标聚焦在用户框中JT f1。请求焦点();//为登入按钮添加监听器jbt 1。addactionlistener(new action listener(){ @ Override public void action performed(action event e){//TODO自动生成的方法存根字符串名称=JT f1。gettext();字符串密码=新字符串(jpf 2。get password());//获取密码框中的密码尝试{如果(pa
ssword.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(); } }}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持盛行IT。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。