最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java多線程實現(xiàn)聊天客戶端和服務(wù)器

 更新時間:2021年08月26日 11:42:49   作者:White_Idiot  
這篇文章主要為大家詳細(xì)介紹了Java多線程聊天客戶端和服務(wù)器實現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了java聊天室代碼,供大家參考,具體內(nèi)容如下

主要涉及知識

  • Java中GUI程序的編寫,包括事件監(jiān)聽機(jī)制。
  • Java的網(wǎng)絡(luò)通信編程,ServerSocket,Socket類的使用。
  • Java中多線程的編程,Thread類,Runnable接口的使用。

源代碼

客戶端

package project1; 
 
import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 
import java.net.*; 
 
import javax.swing.*; 
 
public class Client { 
 private JFrame clientFrame; 
 private JLabel IPLabel; 
 private JLabel PortLabel; 
 private JLabel sayLabel; 
 private JLabel nicknameLabel; 
 private JTextField IPText; 
 private JTextField PortText; 
 private JTextField nicknameText; 
 private JTextField sayText; 
 private JButton connectButton; 
 private JButton nicknameButton; 
 private JButton sayButton; 
 private JPanel jPanelNorth; 
 private JPanel jPanelSouth0; 
 private JPanel jPanelSouth1; 
 private JPanel jPanelSouth2; 
 private JTextArea clientTextArea; 
 private JScrollPane scroller; 
 private BufferedReader reader; 
 private PrintWriter writer; 
 private String nickname; 
 
 public static void main(String args[]) { 
  Client aClient = new Client(); 
  aClient.startUp(); 
 } 
 
 // 初始化組件 
 public Client() { 
  nickname = "客戶端"; 
 
  clientFrame = new JFrame(); 
  jPanelNorth = new JPanel(); 
  IPLabel = new JLabel("服務(wù)器IP", JLabel.LEFT); 
  IPText = new JTextField(10); 
  PortLabel = new JLabel("服務(wù)器端口", JLabel.LEFT); 
  PortText = new JTextField(10); 
  connectButton = new JButton("連接"); 
  clientTextArea = new JTextArea(); 
  scroller = new JScrollPane(clientTextArea); 
  jPanelSouth0 = new JPanel(); 
  jPanelSouth1 = new JPanel(); 
  jPanelSouth2 = new JPanel(); 
  nicknameLabel = new JLabel("昵稱", JLabel.LEFT); 
  nicknameText = new JTextField(nickname, 30); 
  nicknameButton = new JButton("確認(rèn)"); 
  sayLabel = new JLabel("消息", JLabel.LEFT); 
  sayText = new JTextField(30); 
  sayButton = new JButton("確認(rèn)"); 
 } 
 
 // 構(gòu)建GUI 
 private void buildGUI() { 
  // 窗口的設(shè)置 
  clientFrame.setTitle("客戶端"); 
  clientFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
  clientFrame.setSize(550, 550); 
 
  // 北區(qū)的組件 
  jPanelNorth.add(IPLabel); 
  jPanelNorth.add(IPText); 
  jPanelNorth.add(PortLabel); 
  jPanelNorth.add(PortText); 
  jPanelNorth.add(connectButton); 
  clientFrame.getContentPane().add(BorderLayout.NORTH, jPanelNorth); 
 
  // 中間的組件 
  clientTextArea.setFocusable(false); 
  scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 
  scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 
  clientFrame.getContentPane().add(BorderLayout.CENTER, scroller); 
 
  // 南區(qū)的組件 
  jPanelSouth1.add(nicknameLabel); 
  jPanelSouth1.add(nicknameText); 
  jPanelSouth1.add(nicknameButton); 
  jPanelSouth2.add(sayLabel); 
  jPanelSouth2.add(sayText); 
  jPanelSouth2.add(sayButton); 
  jPanelSouth0.setLayout(new BoxLayout(jPanelSouth0, BoxLayout.Y_AXIS)); 
  jPanelSouth0.add(jPanelSouth1); 
  jPanelSouth0.add(jPanelSouth2); 
  clientFrame.getContentPane().add(BorderLayout.SOUTH, jPanelSouth0); 
 
  // 設(shè)置窗口可見 
  clientFrame.setVisible(true); 
 } 
 
 // 客戶端運(yùn)行 
 public void startUp() { 
  buildGUI(); 
 
  // 接收服務(wù)器消息的線程 
  Runnable incomingReader = new Runnable() { 
   @Override 
   public void run() { 
    String message; 
    try { 
     while ((message = reader.readLine()) != null) { 
      clientTextArea.append(message + "\n"); 
     } 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
   } 
  }; 
 
  // 監(jiān)聽Connect按鈕,實現(xiàn)服務(wù)器的連接 
  connectButton.addActionListener(new ActionListener() { 
   @Override 
   public void actionPerformed(ActionEvent e) { 
    String aServerIP = IPText.getText(); 
    String aServerPort = PortText.getText(); 
 
    if (aServerIP.equals("") || aServerPort.equals("")) { 
     JOptionPane.showMessageDialog(clientFrame, "請輸入 完整的 IP和端口!"); 
    } else { 
     try { 
      @SuppressWarnings("resource") 
      Socket clientSocket = new Socket(aServerIP, Integer.parseInt(aServerPort)); 
      InputStreamReader streamReader = new InputStreamReader(clientSocket.getInputStream()); 
      reader = new BufferedReader(streamReader); 
      writer = new PrintWriter(clientSocket.getOutputStream()); 
 
      clientTextArea.append("服務(wù)器已連接...\n"); 
 
      Thread readerThread = new Thread(incomingReader); 
      readerThread.start(); 
     } catch (Exception ex) { 
      JOptionPane.showMessageDialog(clientFrame, "連接不上服務(wù)器!\n請確認(rèn) IP 和 端口 輸入正確。"); 
     } 
    } 
   } 
  }); 
 
  // 監(jiān)聽nickname,設(shè)置昵稱 
  ActionListener nicknameListener = new ActionListener() { 
   @Override 
   public void actionPerformed(ActionEvent e) { 
    String aText = nicknameText.getText(); 
    if (!aText.equals("")) { 
     nickname = aText; 
    } 
   } 
  }; 
  nicknameButton.addActionListener(nicknameListener); 
  nicknameText.addActionListener(nicknameListener); 
  nicknameText.addFocusListener(new FocusListener() { 
   @Override 
   public void focusGained(FocusEvent e) { 
   } 
 
   @Override 
   public void focusLost(FocusEvent e) { 
    String aText = nicknameText.getText(); 
    if (!aText.equals("")) { 
     nickname = aText; 
    } 
   } 
  }); 
 
  // 發(fā)送消息到服務(wù)器 
  ActionListener SayListener = new ActionListener() { 
   @Override 
   public void actionPerformed(ActionEvent e) { 
    String aText = sayText.getText(); 
    if (aText.equals("")) { 
     JOptionPane.showMessageDialog(clientFrame, "內(nèi)容不能為空!"); 
    } else { 
     try { 
      writer.println(nickname + ":" + aText); 
      writer.flush(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
     sayText.setText(""); 
    } 
   } 
  }; 
  sayButton.addActionListener(SayListener); 
  sayText.addActionListener(SayListener); 
 
 } 
 
} 

服務(wù)器

package project1; 
 
import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 
import java.net.*; 
import java.util.ArrayList; 
import java.util.Iterator; 
import javax.swing.*; 
 
public class Server { 
 private JFrame serverFrame; 
 private JLabel portLabel; 
 private JLabel sayLabel; 
 private JLabel nicknameLabel; 
 private JTextField portText; 
 private JTextField sayText; 
 private JTextField nicknameText; 
 private JButton startButton; 
 private JButton sayButton; 
 private JButton nicknameButton; 
 private JPanel jPanelNorth; 
 private JPanel jPanelSouth0; 
 private JPanel jPanelSouth1; 
 private JPanel jPanelSouth2; 
 private JScrollPane scroller; 
 private JTextArea serverTextArea; 
 private ArrayList<PrintWriter> clientOutputStreams; 
 private String nickname; 
 
 public static void main(String[] args) { 
  Server aServer = new Server(); 
  aServer.startUp(); 
 } 
 
 // 初始化組件 
 public Server() { 
  nickname = "服務(wù)器"; 
 
  serverFrame = new JFrame(); 
  jPanelNorth = new JPanel(); 
  portLabel = new JLabel("端口", JLabel.LEFT); 
  portText = new JTextField(30); 
  startButton = new JButton("開始"); 
  serverTextArea = new JTextArea(); 
  scroller = new JScrollPane(serverTextArea); 
  nicknameLabel = new JLabel("昵稱", JLabel.LEFT); 
  nicknameText = new JTextField(nickname, 30); 
  nicknameButton = new JButton("確認(rèn)"); 
  jPanelSouth0 = new JPanel(); 
  jPanelSouth1 = new JPanel(); 
  jPanelSouth2 = new JPanel(); 
  sayLabel = new JLabel("消息", JLabel.LEFT); 
  sayText = new JTextField(30); 
  sayButton = new JButton("確認(rèn)"); 
 } 
 
 // 構(gòu)建GUI 
 private void buildGUI() { 
  // 窗口的設(shè)置 
  serverFrame.setTitle("服務(wù)器"); 
  serverFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
  serverFrame.setSize(550, 550); 
 
  // 北區(qū)的組件 
  jPanelNorth.add(portLabel); 
  jPanelNorth.add(portText); 
  jPanelNorth.add(startButton); 
  serverFrame.getContentPane().add(BorderLayout.NORTH, jPanelNorth); 
 
  // 中間的組件 
  serverTextArea.setFocusable(false); 
  scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 
  scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 
  serverFrame.getContentPane().add(BorderLayout.CENTER, scroller); 
 
  // 南區(qū)的組件 
  jPanelSouth1.add(nicknameLabel); 
  jPanelSouth1.add(nicknameText); 
  jPanelSouth1.add(nicknameButton); 
  jPanelSouth2.add(sayLabel); 
  jPanelSouth2.add(sayText); 
  jPanelSouth2.add(sayButton); 
  jPanelSouth0.setLayout(new BoxLayout(jPanelSouth0, BoxLayout.Y_AXIS)); 
  jPanelSouth0.add(jPanelSouth1); 
  jPanelSouth0.add(jPanelSouth2); 
  serverFrame.getContentPane().add(BorderLayout.SOUTH, jPanelSouth0); 
 
  // 設(shè)置窗口可見 
  serverFrame.setVisible(true); 
 } 
 
 // 服務(wù)器運(yùn)行 
 public void startUp() { 
  buildGUI(); 
 
  // 監(jiān)聽Start按鈕,建立端口 
  ActionListener startListener = new ActionListener() { 
   @Override 
   public void actionPerformed(ActionEvent e) { 
    clientOutputStreams = new ArrayList<PrintWriter>(); 
    String aPort = portText.getText(); 
 
    if (aPort.equals("")) { 
     JOptionPane.showMessageDialog(serverFrame, "請輸入正確的端口號!"); 
    } else { 
     try { 
      // 等待客戶端連接的線程 
      Runnable serverRunnable = new Runnable() { 
       @Override 
       public void run() { 
        ServerSocket serverSocket; 
        try { 
         serverSocket = new ServerSocket(Integer.parseInt(aPort)); 
         serverTextArea.append("正在等待客戶端連接...\n"); 
         while (true) { 
          Socket clientSocket = serverSocket.accept(); 
          serverTextArea.append("客戶端已連接...\n"); 
 
          PrintWriter writer = new PrintWriter(clientSocket.getOutputStream()); 
          clientOutputStreams.add(writer); 
 
          Thread t = new Thread(new ClientHandler(clientSocket)); 
          t.start(); 
         } 
        } catch (NumberFormatException | IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      }; 
      Thread serverThread = new Thread(serverRunnable); 
      serverThread.start(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 
   } 
  }; 
  startButton.addActionListener(startListener); 
  portText.addActionListener(startListener); 
 
  // 監(jiān)聽nickname,設(shè)置昵稱 
  ActionListener nicknameListener = new ActionListener() { 
   @Override 
   public void actionPerformed(ActionEvent e) { 
    String aText = nicknameText.getText(); 
    if (!aText.equals("")) { 
     nickname = aText; 
    } 
   } 
  }; 
  nicknameButton.addActionListener(nicknameListener); 
  nicknameText.addActionListener(nicknameListener); 
  nicknameText.addFocusListener(new FocusListener() { 
   @Override 
   public void focusGained(FocusEvent e) { 
   } 
 
   @Override 
   public void focusLost(FocusEvent e) { 
    String aText = nicknameText.getText(); 
    if (!aText.equals("")) { 
     nickname = aText; 
    } 
   } 
  }); 
 
  // 監(jiān)聽Say按鈕,發(fā)送消息 
  ActionListener SayListener = new ActionListener() { 
   @Override 
   public void actionPerformed(ActionEvent e) { 
    String aText = sayText.getText(); 
    if (!aText.equals("")) { 
     aText = nickname + ":" + aText; 
     sendToEveryClient(aText); 
     serverTextArea.append(aText + "\n"); 
     sayText.setText(""); 
    } else { 
     JOptionPane.showMessageDialog(serverFrame, "內(nèi)容不能為空!"); 
    } 
   } 
  }; 
  sayButton.addActionListener(SayListener); 
  sayText.addActionListener(SayListener); 
 } 
 
 // 多客戶端的線程 
 public class ClientHandler implements Runnable { 
  BufferedReader bReader; 
  Socket aSocket; 
 
  public ClientHandler(Socket clientSocket) { 
   try { 
    aSocket = clientSocket; 
    InputStreamReader isReader = new InputStreamReader(aSocket.getInputStream()); 
    bReader = new BufferedReader(isReader); 
   } catch (Exception ex) { 
    ex.printStackTrace(); 
   } 
  } 
 
  @Override 
  public void run() { 
   String message; 
   try { 
    while ((message = bReader.readLine()) != null) { 
     sendToEveryClient(message); 
     serverTextArea.append(message + "\n"); 
    } 
   } catch (Exception ex) { 
    ex.printStackTrace(); 
   } 
  } 
 } 
 
 // 發(fā)送消息給所有客戶端的方法 
 private void sendToEveryClient(String message) { 
  Iterator<PrintWriter> it = clientOutputStreams.iterator(); 
  while (it.hasNext()) { 
   try { 
    PrintWriter writer = (PrintWriter) it.next(); 
    writer.println(message); 
    writer.flush(); 
   } catch (Exception ex) { 
    ex.printStackTrace(); 
   } 
  } 
 } 
 
} 

GUI運(yùn)行截圖:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot啟動后立即執(zhí)行的幾種方法小結(jié)

    SpringBoot啟動后立即執(zhí)行的幾種方法小結(jié)

    在項目開發(fā)中某些場景必須要用到啟動項目后立即執(zhí)行方式的功能,本文主要介紹了SpringBoot啟動后立即執(zhí)行的幾種方法小結(jié),具有一定的參考價值,感興趣的可以了解一下
    2023-05-05
  • SpringBoot與docker的結(jié)合的示例

    SpringBoot與docker的結(jié)合的示例

    本篇文章主要介紹了SpringBoot與docker的結(jié)合的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • SpringBoot3.4.0無法找到StringRedisTemplate?bean的問題Consider?defining?a?bean?of?type?‘org.springframework

    SpringBoot3.4.0無法找到StringRedisTemplate?bean的問題Consider?def

    本文主要介紹了SpringBoot3.4.0無法找到StringRedisTemplate?bean的問題Consider?defining?a?bean?of?type?‘org.springframework,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • java判斷空的實現(xiàn)方法

    java判斷空的實現(xiàn)方法

    字符串判斷空有兩種情況:一個是分配了內(nèi)存但值為空(""),另一個是未分配內(nèi)存(null),判斷方法包括isEmpty()和isBlank(),其中isBlank()還可以過濾空格、制表符,對于列表,判斷不為空可以使用list!=null && !list.isEmpty()或list!=null && list.size()>0
    2024-09-09
  • web項目WEB-INF下沒有web.xml的解決方法

    web項目WEB-INF下沒有web.xml的解決方法

    新手如果在web項目創(chuàng)建后WEB-INF下面沒有出現(xiàn)web.xml,怎么辦?別慌,沒有web.xml文件的原因是因為在創(chuàng)建web項目的時候沒有把創(chuàng)建web.xml勾上。這篇文章主要介紹了web項目WEB-INF下沒有web.xml的解決方法,需要的朋友可以參考下
    2022-12-12
  • 教你利用springboot集成swagger并生成接口文檔

    教你利用springboot集成swagger并生成接口文檔

    有很多小伙伴不會利用springboot集成swagger并生成接口文檔,今天特地整理了這篇文章,文中有非常詳細(xì)的代碼圖文介紹及代碼示例,對不會這個方法的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • Spring Boot LocalDateTime格式化處理的示例詳解

    Spring Boot LocalDateTime格式化處理的示例詳解

    這篇文章主要介紹了Spring Boot LocalDateTime格式化處理的示例詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • SpringBoot整合Lettuce redis過程解析

    SpringBoot整合Lettuce redis過程解析

    這篇文章主要介紹了SpringBoot整合Lettuce redis過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • Java調(diào)用第三方接口封裝實現(xiàn)

    Java調(diào)用第三方接口封裝實現(xiàn)

    本文主要介紹了Java調(diào)用第三方接口封裝實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • SpringBoot整合SpringSecurityOauth2實現(xiàn)鑒權(quán)動態(tài)權(quán)限問題

    SpringBoot整合SpringSecurityOauth2實現(xiàn)鑒權(quán)動態(tài)權(quán)限問題

    這篇文章主要介紹了SpringBoot整合SpringSecurityOauth2實現(xiàn)鑒權(quán)-動態(tài)權(quán)限,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06

最新評論

改则县| 张家口市| 黄山市| 惠来县| 鹤山市| 东港市| 普兰县| 宝应县| 江门市| 大名县| 茌平县| 平塘县| 基隆市| 化德县| 安溪县| 天台县| 高州市| 武穴市| 苍梧县| 鄄城县| 吉水县| 松江区| 右玉县| 朝阳区| 三原县| 岚皋县| 海晏县| 思南县| 金华市| 额尔古纳市| 德安县| 遵化市| 沾益县| 潢川县| 翁牛特旗| 客服| 武乡县| 凭祥市| 保定市| 逊克县| 江口县|