当前位置:主页 > 软件编程 > JAVA代码 >

Java基于Tcp/ip连接的多人交互聊天室

时间:2020-12-16 09:14:13 | 栏目:JAVA代码 | 点击:

本文实例为大家分享了Java  Socket编程实现多人交互聊天室的具体代码,供大家参考,具体内容如下

本项目由三个.java文件(Client.java、Server.java、UI.java)和一个.jpg图片文件组成UI.java是负责界面的构成文件。本聊天室的界面极其简单。主要分为两个界面:第一个是启动时需要登陆的界面如下:

输入名字进去以后就可以直接聊天

 
 

这个聊天室相当于群聊,每一个登陆进去的人发的信息,其他人都会收到。
使用指南:

1.运行Server.java文件,保证服务端的开启
2.运行UI.java文件,界面登陆。每运行一个UI文件并登陆进去,就代表一个客户进了群聊中,可进行对话。

程序简单易懂,非常适合初学者练习网络编程的知识。

Client.java

import java.net.*;
import java.io.*;
import java.util.*;

public class Client{

 String name;
 Socket s;
 UI ui;
 //构造方法 ,把UI对象传过来
 public Client(UI ui){
  this.ui = ui;
 }

 //从登陆界面获得名字并传去服务端
 public void getName(String name){
  try{
  s = new Socket("127.0.0.1",3000);
  Cli1 d = new Cli1(s,ui);
  d.start();
  this.name = name;
  DataOutputStream dos = new DataOutputStream(s.getOutputStream());
  dos.writeUTF(name);
  }catch(Exception e){
   e.printStackTrace();
  }
 }
 //从聊天界面获得要发送的内容并经服务器转发给各个客户端
 public void say(String content){
  try{
  DataOutputStream dos = new DataOutputStream(s.getOutputStream());
  dos.writeUTF(content);
  }catch(Exception e){
   e.printStackTrace();
  }
 }

}

//输入和输出
class Cli1 extends Thread {
 UI ui;
 Socket s ;
 public Cli1(Socket s,UI ui){
  this.s = s;
  this.ui=ui;
 }
 public void run(){
  try{
  while(true){

   DataInputStream dis = new DataInputStream(s.getInputStream());
   String content = dis.readUTF();
   if(!content.equals("")&&content!=null){
    System.out.println(content);
    ui.say(content);
   }

  }
  }catch(Exception e){
   e.printStackTrace();
  }
 }
}

Server.java

import java.net.*;
import java.io.*;
import java.util.*;

public class Server{
 static Socket s;
 static Socket[] soc;
 static String[] name;
 static int k = 5,i =0,j;
 public static void main(String[] args){

  Server ser = new Server();
  try{
   ServerSocket ss = new ServerSocket(3000);


   soc = new Socket[k]; 
   name = new String[k];
   while(true){
    s = ss.accept();
    soc[i]= s;
    j=i;
    i++;
    DataOutputStream dos = new DataOutputStream(s.getOutputStream()); 

    DataInputStream dis = new DataInputStream(s.getInputStream());
    name[j] = dis.readUTF();
    System.out.println(name[j]+"已进入群聊!");
    dos.writeUTF("欢迎你,"+name[j]);
    new Ser1().start();

   }
  }catch(ConnectException e){
   System.out.println("连接异常!!");

  }catch(IOException e){
   e.printStackTrace();
  }

 }


}

class Ser1 extends Thread{

 public int j;

 public void run(){
  try{
  DataInputStream read = new DataInputStream((Server.soc[Server.j]).getInputStream());
  j=Server.j;
  while(true){
   String con = read.readUTF();

   if(con!=null){


    System.out.println("该线程j为"+j);
    for(int i = 0;i<Server.soc.length;i++){
     if((i!=j)&&(Server.soc[i]!=null)){
      DataOutputStream dos = new DataOutputStream((Server.soc[i]).getOutputStream()); 
      dos.writeUTF(Server.name[Server.j]+"发送于 "+(new Date()));
      dos.writeUTF(con);
     }
    }


   }else{break;}
  }

 }catch(Exception e){
  e.printStackTrace();
 }
 }

}

UI.java

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class UI{

 //主方法
 public static void main(String[] args){

  UI ui = new UI();
  ui.cli = new Client(ui);
  ui.initFrame();
  ui.showLogin();
 }

 Ser1 ser1 = new Ser1();

 //初始化业务对象
 public Client cli = null;
 public void initCli(){

 }

 //初始化主窗口
 public int width = 720;
 public int height = 550;
 public JFrame jFrame = null; //界面窗口
 public JLayeredPane layeredPane = null; //层叠容器
 public JPanel backLayer = null; //背景层
 public JPanel frontLayer = null; //前景层
 public CardLayout cardLayout = null; //前景层布局器

 public void initFrame(){
  jFrame = new JFrame("老友聚乐部");
  layeredPane = new JLayeredPane();
  layeredPane.setPreferredSize(new Dimension(width, height));
  jFrame.add(layeredPane);
  jFrame.setResizable(false);
  jFrame.pack();
   jFrame.setVisible(true);
  jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  backLayer = new JPanel();
  ((FlowLayout)backLayer.getLayout()).setHgap(0);
  ((FlowLayout)backLayer.getLayout()).setVgap(0);
  backLayer.setSize(width,height);
  backLayer.setLocation(0,0);
  JLabel bg = new JLabel(new ImageIcon("12.jpg"));
  backLayer.add(bg);


  layeredPane.add(backLayer,new Integer(0));

  frontLayer = new JPanel();
  cardLayout = new CardLayout(0,0);
  frontLayer.setLayout(cardLayout);
  frontLayer.setOpaque(false);
  frontLayer.setSize(width,height);
  frontLayer.setLocation(0,0);

  layeredPane.add(frontLayer,new Integer(1));

 }

 //登录界面
 public JPanel loginPane = null;
 public JTextField loginCodeInput = null;

 public JLabel loginTipsLabel = null;
 public void showLogin(){
  if(loginPane == null){
   loginPane = new JPanel();
   loginPane.setOpaque(false);

   Box loginBox = Box.createVerticalBox();
   loginBox.add(Box.createVerticalStrut(180));

   JPanel welcome_panel = new JPanel();
   welcome_panel.setOpaque(false);
   JLabel welcome_label = new JLabel("老友俱乐部");

   welcome_label.setForeground(Color.WHITE);
   welcome_label.setFont(new Font("微软雅黑",Font.PLAIN,30));
   welcome_panel.add(welcome_label);
   loginBox.add(welcome_panel);

   loginBox.add(Box.createVerticalStrut(50));
   JPanel code_panel = new JPanel();
   code_panel.setOpaque(false);
   JLabel code_label = new JLabel("姓名:");
   code_label.setForeground(Color.WHITE);
   code_label.setFont(new Font("微软雅黑",Font.PLAIN,25));
   code_panel.add(code_label);
   loginCodeInput = new JTextField(10);
   loginCodeInput.setFont(new Font("微软雅黑", Font.PLAIN,25));
   code_panel.add(loginCodeInput);
   loginBox.add(code_panel);

   loginBox.add(Box.createVerticalStrut(30));

   JPanel btn_panel = new JPanel();
   btn_panel.setOpaque(false);
   JButton login_btn = new JButton("登 录");
   login_btn.setFont(new Font("微软雅黑",Font.PLAIN,15));
   btn_panel.add(login_btn);

   JButton reset_btn = new JButton("重 置");
   reset_btn.setFont(new Font("微软雅黑",Font.PLAIN,15));
   btn_panel.add(reset_btn);
   loginBox.add(btn_panel);

   loginBox.add(Box.createVerticalStrut(10));

   JPanel tips_panel = new JPanel();
   tips_panel.setOpaque(false);
   loginTipsLabel = new JLabel("");
   loginTipsLabel.setForeground(new Color(238,32,32));
   loginTipsLabel.setFont(new Font("微软雅黑",Font.PLAIN,20));
   tips_panel.add(loginTipsLabel);
   loginBox.add(tips_panel);

   loginPane.add(loginBox);

   frontLayer.add("loginPane",loginPane);
   cardLayout.show(frontLayer,"loginPane");
   frontLayer.validate();
   loginCodeInput.requestFocus();

   reset_btn.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent ae){
     loginCodeInput.setText("");
     loginTipsLabel.setText("");
     loginCodeInput.requestFocus();
    }
   });

   login_btn.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent ae){
     String code_str = loginCodeInput.getText();

     if("".equals(code_str)){
      loginTipsLabel.setText("姓名不能为空!");
      loginCodeInput.requestFocus();

     }else{

      cli.getName(code_str);

      showTalk();

     }
    }
   });
  }else{
   cardLayout.show(frontLayer,"loginPane");
   loginCodeInput.setText("");

   loginTipsLabel.setText("");
   loginCodeInput.requestFocus();
  }
 }

 //聊天主界面
 public JPanel menuPane = null;
 public JTextArea input = null;
 public JTextArea talk = new JTextArea(25,70);
 public void showTalk(){

   menuPane = new JPanel();
   menuPane.setOpaque(false);
   menuPane.setLayout(new BorderLayout());

   JPanel up = new JPanel();
   Box tipsBox = Box.createVerticalBox();
   menuPane.add(up,BorderLayout.NORTH); //北边顶上
   up.add(tipsBox);

   JLabel tips_label = new JLabel("在线朋友");
   tips_label.setForeground(Color.WHITE);
   tips_label.setFont(new Font("微软雅黑",Font.PLAIN,20));
   tips_label.setAlignmentX(Component.LEFT_ALIGNMENT);
   tipsBox.add(tips_label);
   tipsBox.add(Box.createVerticalStrut(10));
   JLabel upTxt = new JLabel(""); //接收在线朋友(需完善)

   tipsBox.add(upTxt);

   JPanel talk_panel = new JPanel();//中间聊天对话框
   talk_panel.setOpaque(false);

   menuPane.add(talk_panel,BorderLayout.WEST);

   JScrollPane sp = new JScrollPane(talk);
   talk_panel.add(talk);

   Box inputBox = Box.createHorizontalBox(); //下边输入框
   menuPane.add(inputBox,BorderLayout.SOUTH);

   JPanel input_panel = new JPanel();
   input_panel.setOpaque(false); //放置输入框
   input = new JTextArea(4,30);
   input.setFont(new Font("微软雅黑",Font.PLAIN,20));
   input.setAlignmentX(Component.LEFT_ALIGNMENT);
   input_panel.add(input);
   inputBox.add(input_panel);
   inputBox.add(Box.createHorizontalStrut(0));
   JButton send_btn = new JButton("发送");
   send_btn.setFont(new Font("微软雅黑",Font.PLAIN,15));
   inputBox.add(send_btn);

   frontLayer.add("menuPane",menuPane);
   cardLayout.show(frontLayer,"menuPane");
   frontLayer.validate();

   send_btn.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent ae){
     String append = talk.getText();
     String content = input.getText();
     talk.setText(append+'\n'+content);
     input.setText("");
     cli.say(content);

    }
   });


 }
 public void say(String content){
  if(talk!=null){
   String append = talk.getText();

   talk.setText(append+'\n'+content);
  }

 } 

}

您可能感兴趣的文章:

相关文章