溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中利用Tcp/ip連接多人交互聊天室的實(shí)現(xiàn)

發(fā)布時(shí)間:2021-06-12 18:40:13 來源:億速云 閱讀:130 作者:Leah 欄目:編程語言

Java中利用Tcp/ip連接多人交互聊天室的實(shí)現(xiàn),針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。

使用指南:

1.運(yùn)行Server.java文件,保證服務(wù)端的開啟
2.運(yùn)行UI.java文件,界面登陸。每運(yùn)行一個(gè)UI文件并登陸進(jìn)去,就代表一個(gè)客戶進(jìn)了群聊中,可進(jìn)行對(duì)話。

程序簡(jiǎn)單易懂,非常適合初學(xué)者練習(xí)網(wǎng)絡(luò)編程的知識(shí)。

Client.java

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

public class Client{

  String name;
  Socket s;
  UI ui;
  //構(gòu)造方法 ,把UI對(duì)象傳過來
  public Client(UI ui){
    this.ui = ui;
  }

  //從登陸界面獲得名字并傳去服務(wù)端
  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();
    }
  }
  //從聊天界面獲得要發(fā)送的內(nèi)容并經(jīng)服務(wù)器轉(zhuǎn)發(fā)給各個(gè)客戶端
  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]+"已進(jìn)入群聊!");
        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]+"發(fā)送于 "+(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();

  //初始化業(yè)務(wù)對(duì)象
  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();//中間聊天對(duì)話框
      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("發(fā)送");
      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);
    }

  } 

}

關(guān)于Java中利用Tcp/ip連接多人交互聊天室的實(shí)現(xiàn)問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI