java 多人聊天室_java实现多人在线聊天室

本文展示了一个使用Java Swing构建的客户端登录界面,通过Socket与服务器进行通信,实现了用户登录并连接到聊天室的功能。客户端包含了登陆界面、消息发送与接收的组件,服务器端则负责接收客户端连接并转发消息。
摘要由CSDN通过智能技术生成

先放效果图:

8e5aa825f1f46cbc2649dd0520a7e5cd.png

95b0802d0d5d546f010c6323cd8d0067.png

登陆:

/**在本类109行附近调用了ChatClient类

*

*/

import java.awt.BorderLayout;

import java.awt.FlowLayout;

import java.awt.Toolkit;

import java.io.File;

import java.io.IOException;

import java.net.Socket;

import java.net.UnknownHostException;

import java.awt.event.ActionListener;

import java.awt.event.ActionEvent;

import javax.swing.BorderFactory;

import javax.swing.Icon;

import javax.swing.ImageIcon;

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.JTextField;

import javax.swing.border.Border;

import javax.swing.border.EtchedBorder;

import javax.swing.border.TitledBorder;

public class ClientLogin extends JFrame {

private JTextField nametext ;

private JPasswordField passwordtetx ;

//private Object bPanel;

public ClientLogin() {

this.init() ; //init方法初始化

this.setDefaultCloseOperation(EXIT_ON_CLOSE);

this.setVisible(true);

}

public void init() {

this.setTitle("呆萌聊天室登陆");

this.setSize(330,230); //借用成熟美观尺寸

int y = (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight() ;

int x = (int)Toolkit.getDefaultToolkit().getScreenSize().getWidth() ;

/**以上的方法要是不借助Eclipse实在是很难记住,尼玛!

*

*/

this.setLocation( (x-this.getWidth() )/2, ( y-this.getHeight() )/2 );

this.setResizable(false); //不允许用户自行更改大小

Icon icon = new ImageIcon("d:"+File.separator+"login.jpg") ;

JLabel label = new JLabel(icon) ; //设置登陆界面上边框

this.add(label,BorderLayout.NORTH) ;

JPanel mainPanel = new JPanel() ;

Border border = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED) ;

mainPanel.setBorder(BorderFactory.createTitledBorder(border,"输入登陆信息",TitledBorder.CENTER,TitledBorder.TOP)) ;

this.add(mainPanel,BorderLayout.CENTER) ; //将主面板加入frame

mainPanel.setLayout(null) ;

JLabel namelabel = new JLabel("请输入昵称") ;

namelabel.setBounds(30,30,80,22) ;

mainPanel.add(namelabel) ;

nametext = new JTextField() ;

nametext.setBounds(115,30,120,22);

mainPanel.add(nametext) ;

JLabel passwordlabel = new JLabel("请输入密码") ;

passwordlabel.setBounds(30,60,80,22);

mainPanel.add(passwordlabel) ;

passwordtetx = new JPasswordField() ;

passwordtetx.setBounds(115,60,120,22) ;

mainPanel.add(passwordtetx) ;

//接下来按钮位置排放

JPanel bPanel = new JPanel() ;

bPanel.setLayout(new FlowLayout(FlowLayout.RIGHT)) ;

this.add(bPanel,BorderLayout.SOUTH) ;

JButton reset = new JButton("重置") ;

reset.addActionListener(new ActionListener() { //为“重置”按钮添加事件监听

public void actionPerformed(ActionEvent e) {

nametext.setText("");

passwordtetx.setText("");

}

});

bPanel.add(reset) ;

/**下面开始实现提交按钮

*

*/

JButton submit = new JButton("登陆") ;

submit.addActionListener(new LoginAction(this) ); //因为登陆相对复杂,重新为登陆写一个类

bPanel.add(submit) ;

}

/**下面开始写登陆类

*

*/

class LoginAction implements ActionListener {

private JFrame self ;

public LoginAction(JFrame self) {

this.self = self ;

}

public void actionPerformed(ActionEvent e) {

//System.out.println("用户名是:"+nametext.getText()+" 密码是:"+new String(passwordtext.getPassword())) ;

try {

//开始连接到服务器

Socket socket = new Socket("127.0.0.1",8888) ;

new ChatClient(socket,nametext.getText()) ;

//调用dispose方法关闭登陆框

self.dispose();

}catch(UnknownHostException e1) {

e1.printStackTrace();

JOptionPane.showConfirmDialog(self, "找不到指定服务器!~","连接失败",JOptionPane.OK_OPTION,JOptionPane.ERROR_MESSAGE) ;

}catch(IOException e1) {

e1.printStackTrace() ;

JOptionPane.showConfirmDialog(self, "连接服务器出错,请重试!","连接失败",JOptionPane.OK_OPTION,JOptionPane.ERROR_MESSAGE) ;

}

}

}

public static void main(String args[]) {

new ClientLogin() ;

}

}

客户端:

import java.awt.BorderLayout;

import java.awt.FlowLayout;

import java.awt.Toolkit;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.Socket;

import java.util.Date;

import java.text.SimpleDateFormat;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JSplitPane;

import javax.swing.JTextArea;

public class ChatClient extends JFrame {

private Socket socket ; //负责和服务器通信

private JTextArea sendArea ; //消息编辑区域

private JTextArea contentArea ; //群聊消息显示框

private String name ; //当前用户名称

public ChatClient(Socket socket,String name) {

this.socket = socket ;

this.name = name ;

this.init() ; //初始化聊天客户端

this.setDefaultCloseOperation(EXIT_ON_CLOSE);

this.setVisible(true);

/*接下来启动单独线程,专门从服务器中读取数据

*

*/

ClientThread thread = new ClientThread(socket,contentArea) ;

thread.start();

}

public void init( ) {

this.setTitle("我的聊天室");

this.setSize(300,400);

int x = (int)Toolkit.getDefaultToolkit().getScreenSize().getWidth() ;

int y = (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight() ;

this.setLocation( (x-this.getWidth() )/2, ( y-this.getHeight() )/2 );

this.setResizable(false); //不允许用户改变大小

contentArea = new JTextArea() ;

contentArea.setLineWrap(true); //换行方法

JScrollPane logPanel = new JScrollPane(contentArea,

JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,

JScrollPane.HORIZONTAL_SCROLLBAR_NEVER ) ;

sendArea = new JTextArea() ;

sendArea.setLineWrap(true); //控制每行显示长度最大不超过界面长度

JScrollPane sendPanel = new JScrollPane(sendArea,

JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,

JScrollPane.HORIZONTAL_SCROLLBAR_NEVER ) ;

//创建一个分隔窗格

JSplitPane splitpane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,logPanel,sendPanel) ;

splitpane.setDividerLocation(250);

this.add(splitpane,BorderLayout.CENTER) ;

//按钮面板

JPanel bPanel = new JPanel() ;

bPanel.setLayout(new FlowLayout(FlowLayout.RIGHT)) ;

this.add(bPanel,BorderLayout.SOUTH) ;

JLabel namelabel = new JLabel("昵称: "+this.name+" ") ;

bPanel.add(namelabel) ;

JButton closeButton = new JButton("关闭") ;

closeButton.addActionListener( new ActionListener( ) {

public void actionPerformed(ActionEvent e) {

}

});

bPanel.add(closeButton) ;

JButton sendButton = new JButton("发送") ;

sendButton.addActionListener(new ActionListener() {

//@Override

public void actionPerformed(ActionEvent arg0) {

// TODO Auto-generated method stub

String str = sendArea.getText() ;

SimpleDateFormat formater = new SimpleDateFormat("HH:mm:ss") ;

String time = formater.format(new Date() ) ;

String sendStr = name+" "+time+" 说: "+str ;

PrintWriter out = null ;

try {

out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream() ) ) ;

out.println(sendStr) ;

out.flush();

}catch(Exception e1) {

e1.printStackTrace();

}

sendArea.setText("");

}

});

bPanel.add(sendButton) ;

}

}

//客户端与服务器端通信的线程类

class ClientThread extends Thread {

private Socket socket ;

private JTextArea contentArea ;

public ClientThread(Socket socket, JTextArea conteArea) {

this.socket = socket ;

this.contentArea = conteArea ;

}

public void run() {

BufferedReader br = null ;

try {

br = new BufferedReader(new InputStreamReader( socket.getInputStream())) ;

String str = null ;

while( (str = br.readLine()) != null) {

System.out.println(str) ;

contentArea.append(str);

contentArea.append("\n");

}

} catch(IOException e) {

e.printStackTrace();

} finally {

if(br != null) {

try {

br.close () ;

}catch(IOException e) {

e.printStackTrace();

}

}

}

}}

服务器端:

import java.util.List;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.ArrayList;

public class ChatServer {

private List sockets = new ArrayList() ; //类集的应用

public ChatServer() throws IOException {

ServerSocket ss = new ServerSocket(8888) ;

System.out.println("服务器已在监听8888端口") ;

while(true) {

Socket socket = ss.accept() ;

sockets.add(socket) ;

String ip = socket.getInetAddress().getHostAddress() ;

System.out.println("新用户进入!ip是"+ip) ;

Thread thread = new Thread(new ServerRunner(sockets,socket)) ;

thread.start();

}

}

public static void main(String args[]) {

try {

new ChatServer() ;

} catch(Exception e) {

e.printStackTrace();

}

}

}

class ServerRunner implements Runnable {

private List sockets ;

private Socket currentSocket ; //当前socket

public ServerRunner (List sockets,Socket currentSocket) {

this.sockets = sockets ;

this.currentSocket = currentSocket ;

}

public void run() {

String ip = currentSocket.getInetAddress().getHostAddress() ;

BufferedReader br = null ;

try {

br = new BufferedReader(new InputStreamReader(currentSocket.getInputStream())) ;

String str = null ;

while((str = br.readLine()) != null) {

System.out.println(ip+"说"+str) ;

//往所有的客户端写入信息

for(Socket temp : sockets) {

PrintWriter pw = new PrintWriter(new OutputStreamWriter(temp.getOutputStream())) ;

pw.println(str) ;

pw.flush();

}

}

}catch(IOException e) {

e.printStackTrace();

}

}

}

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值