生活随笔
收集整理的這篇文章主要介紹了
网络多人聊天室1.0 群聊
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
群聊
用戶在客戶端登錄 (不涉及數據庫)隨便輸入賬號密碼
進入聊天室
發送聊天內容
顯示聊天內容
多個客戶端 一個服務器端(監聽存儲連接到的客戶端 一直處于監聽狀態)
功能設計:
(1)客戶端:
1.啟動客戶端 就是一個登陸窗口
2.輸入信息 點擊登陸
3.連接服務器端,不成功給提示 成功進聊天窗口
4.制作聊天窗口
5.輸入聊天內容,點擊發送
6.在客戶端監聽接收服務器響應的內容
(2)服務器端:
1.啟動服務器端 創建ServerSocket
循環監聽客戶端的連接,如果客戶端連接到服務器存儲客戶端Socket
創建線程 在線程中監聽自己客戶端發送的內容
接收之后將內容轉發給其他客戶端
package com.ffyc.chatrom.server;import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;public class Server {//存儲連接到服務器的所有客戶端ArrayList<Socket> sockets=new ArrayList<>();public void startServer(int port) throws IOException {try {ServerSocket serverSocket=new ServerSocket(port); //端口System.out.println("服務器啟動成功");while (true){//一直監聽Socket socket=serverSocket.accept();//監聽客戶端的連接sockets.add(socket);//存儲已連接的客戶端System.out.println("有"+sockets.size()+"個客戶端連接成功");//啟動線程new SocketThread(socket).start();//每接收到一個客戶端就開啟線程}}catch (BindException b){b.printStackTrace();System.out.println("端口被占用異常");//自定義端口 則端口有可能被其他占用}catch (IOException o){o.printStackTrace();System.out.println("服務器啟動失敗");}}//在服務端創建線程 接收各自客戶端發送的消息 并向其他客戶端轉發class SocketThread extends Thread{Socket socket;//socket 構造方法傳過來DataInputStream dataInputStream;//接收數據
Boolean flo=true;public SocketThread(Socket socket) throws IOException {this.socket = socket;this.dataInputStream=new DataInputStream(socket.getInputStream());}@Overridepublic void run() {while (flo){//一直處于接收狀態try {String s=dataInputStream.readUTF();//接收客戶端發送的信息//向連接到服務器的客戶端轉發消息Iterator<Socket> iterator=sockets.iterator(); //迭代器迭代(迭代過程可以remove刪除)while (iterator.hasNext()){//如果迭代里面有客戶端的話Socket so=iterator.next();//拿到他if (so.isClosed()){//如果客戶端so是關閉的 移除 (判斷socket狀態)iterator.remove();continue;}//轉發// 給拿到的客戶端發 即soDataOutputStream dataOutputStream=new DataOutputStream(so.getOutputStream());
dataOutputStream.writeUTF(s);}} catch (IOException e) {e.printStackTrace();System.out.println("客戶端斷開");sockets.remove(socket);//他下線了就把他移出集合flo=false;//就不執行了}}}}
}
package com.ffyc.chatrom.server;import java.io.IOException;public class ServerRun {//啟動 一個項目里就一個啟動public static void main(String[] args) throws IOException {new Server().startServer(1234);//啟動服務器 把端口傳過去}
}
package com.ffyc.chatroom.client;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;public class LoginFrame extends JFrame {//登陸界面JTextField account;//賬號 構造方法傳過去public LoginFrame(){//構造方法創建窗口//JFrame jFrame=new JFrame("登陸界面");// jFrame.setLocation(500,500);//設置窗口大小this.setSize(300,200);this.setTitle("登陸界面");this.setResizable(false);this.setLocationRelativeTo(null);//窗口出現在屏幕中間this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);//布局 網格JPanel jPanel=new JPanel(new GridLayout(3,1));//創建一個面板 流式布局JPanel jp1=new JPanel();
JLabel label1=new JLabel("賬號");
JTextField account=new JTextField(15);
jp1.add(label1);
jp1.add(account);JPanel jp2=new JPanel();
JLabel label2=new JLabel("密碼");
JPasswordField jPasswordField=new JPasswordField(15);
jp2.add(label2);
jp2.add(jPasswordField);JPanel jp3=new JPanel();
JButton jButton1=new JButton("登陸");
JButton jButton2=new JButton("取消");
jp3.add(jButton1);
jp3.add(jButton2);jPanel.add(jp1);
jPanel.add(jp2);
jPanel.add(jp3);//事件監聽 + 事件處理jButton1.addActionListener(new ActionListener() {//登錄@Overridepublic void actionPerformed(ActionEvent e) {try {String accountText = account.getText();//獲取輸入的內容String passwordTest = new String(jPasswordField.getPassword());//.getPassword獲取的是char[]數組 把char數組放到new的String類里面就能轉換成String類if (accountText.length() == 0) {JOptionPane.showMessageDialog(null, "賬號不能為空", "來自系統的提示", JOptionPane.WARNING_MESSAGE);return;//不加return 就會繼續往下走 所以不滿足規則就停}if (passwordTest.length() == 0) {JOptionPane.showMessageDialog(null, "密碼不能為空", "來自系統的提示", JOptionPane.INFORMATION_MESSAGE);return;}/*后續與數據庫連接*///怎么進另一個窗口 new一個對象調他的構造方法就行了try {Socket socket = new Socket("192.168.32.5", 1234);//如果沒有問題 進入聊天窗口new ChatFrame(accountText, socket);//打開聊天窗口dispose();//釋放當前窗口} catch (UnknownHostException un) {//ip異常 亂寫un.printStackTrace();JOptionPane.showMessageDialog(null, "ip錯誤");} catch (IOException io) {io.printStackTrace();JOptionPane.showMessageDialog(null, "連接服務器失敗");}dispose();//釋放當前窗口} catch (Exception exception) {exception.printStackTrace();JOptionPane.showMessageDialog(null, "系統故障!");}}});jButton2.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {account.setText("");jPasswordField.setText("");}});this.add(jPanel);this.setVisible(true);//顯示窗口}}
package com.ffyc.chatroom.client;import javax.swing.*;
import javax.xml.crypto.Data;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.sql.Time;
import java.util.Calendar;
import java.util.GregorianCalendar;public class ChatFrame extends JFrame {Socket socket;//給哪發String account;//賬號 誰發的JTextArea jTextArea;//放在構造方法 好傳DataOutputStream dataOutputStream;//String message1;//接收到的信息Calendar c = new GregorianCalendar();public ChatFrame(String account,Socket socket) throws IOException {this.account = account;this.socket = socket;this.dataOutputStream = new DataOutputStream(socket.getOutputStream());//JFrame jFrame = new JFrame("歡迎來到多人聊天室");this.setSize(500, 500);this.setLocationRelativeTo(null);//窗口出現在屏幕中間this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setTitle("歡迎" + this.account + "來到聊天室");this.setVisible(true);/*//設置字體顏色JTextPane jTextPane=new JTextPane();JColorChooser jColorChooser=new JColorChooser();jColorChooser.setColor(Color.red);*/JPanel jPanel = new JPanel(new BorderLayout());//邊界布局jTextArea = new JTextArea();//文本域 顯示聊天內容jTextArea.setEditable(false);//文本內容不可修改JScrollPane js = new JScrollPane(jTextArea);//創建滾蛋面板 把文本放進去 讓文本域可以滾動jPanel.add(js);//把滾動面板放到大面板中JPanel sendjPanel = new JPanel();//聊天內容面板JTextField message = new JTextField(30);//文本輸入面板JButton sendJB = new JButton("發送");sendjPanel.add(message);sendjPanel.add(sendJB);jPanel.add(sendjPanel, BorderLayout.SOUTH);//添加到底部this.add(jPanel);//為窗口添加監聽this.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {int a = JOptionPane.showConfirmDialog(null, "您確定要關閉嗎");if (a == 0) {//確定退出try {socket.close();dataOutputStream.close();dispose();new LoginFrame();//返回登陸界面} catch (IOException ioException) {ioException.printStackTrace();}}}});//發送聊天內容sendJB.addActionListener((e) -> {String message0 = message.getText();if (message0.length() == 0) {JOptionPane.showMessageDialog(null, "內容不能為空");return;//結束 不然還要往下走}message0 = this.account +c.getTime() +" " + "\n" + message0+"\n";// jTextArea.append(message0);//追加 把信息加到原來的上面 保留了原來的信息 不被覆蓋try {dataOutputStream.writeUTF(message0);message.setText(" ");} catch (IOException ioException) {ioException.printStackTrace();JOptionPane.showMessageDialog(null, "網絡連接失敗");}});//客戶端還需要一個監聽器 接收服務器發送(轉發)的消息new jieshouThread(socket,jTextArea).start();jTextArea.append(message1);}}
package com.ffyc.chatroom.client;import javax.swing.*;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;public class jieshouThread extends Thread{Socket socket;JTextArea jTextArea;DataInputStream dataInputStream;public jieshouThread(Socket socket, JTextArea jTextArea) throws IOException {this.socket = socket;this.jTextArea = jTextArea;this.dataInputStream=new DataInputStream(socket.getInputStream());}@Overridepublic void run() {while (true){String message1=null;try {message1=dataInputStream.readUTF();jTextArea.append(message1);} catch (IOException e) {e.printStackTrace();}}}
}
package com.ffyc.chatroom.client;public class ClientRun {//啟動客戶端public static void main(String[] args) {new LoginFrame();}
}
?
?
總結
以上是生活随笔為你收集整理的网络多人聊天室1.0 群聊的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。