用java实现一个简单的网络聊天室
生活随笔
收集整理的這篇文章主要介紹了
用java实现一个简单的网络聊天室
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這個小玩意兒很早之前就弄完了,計算機網絡課設時候寫的,最近才想起來還有個csdn賬號,統一一下學習歷程一并更新發了(這半年頭發掉的太多了😥)。
那我們這個聊天室都由什么組成呢?
首先,基于B/S模型,你肯定得有一個server,然后至少兩個client吧,我們先來看看server端怎么實現。ps:主要還是用socket通信那一套。
import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList;public class ChatServer {ArrayList clientOutPutStreams = new ArrayList();public static void main(String[] args) {new ChatServer().go();}public void go() {try {//server端創建出與client端通信的socketServerSocket serverSocket = new ServerSocket(8888);System.out.println("服務器啟動成功!");while (true) {//服務器創建出與客戶端通信的socketSocket clientSocket = serverSocket.accept();String ip=clientSocket.getInetAddress().getHostAddress();System.out.println(ip+"加入了聊天室!");//控制臺打印進入到聊天室的用戶地址并提示//與客戶端建立輸出流,為以后給客戶端寫數據做準備PrintWriter printWriter = new PrintWriter(clientSocket.getOutputStream());clientOutPutStreams.add(printWriter);//開啟一個線程用于與一個客戶端進行通信Thread thread = new Thread(new clientHandler(clientSocket));//開啟線程,使服務器一直處于接受消息并轉發給所有人thread.start();System.out.println("有新連接加入");}} catch (IOException e) {e.printStackTrace();}}public class clientHandler implements Runnable {BufferedReader reader;Socket socket;/**clientHandler的構造方法*/public clientHandler(Socket socket) {//與客戶端建立通信并定義接受數據的輸入流try {this.socket = socket;InputStreamReader inputStreamReader = new InputStreamReader(socket.getInputStream());reader = new BufferedReader(inputStreamReader);} catch (IOException e) {e.printStackTrace();}}/**開啟線程之后要執行的run()方法*/@Overridepublic void run() {//定義準備接受消息變量String message = null;try {//使線程不斷從socket上讀取數據的狀態while ((message= reader.readLine())!=null){System.out.println("MESSAGE_Receive: "+message);//將數據發送給每一個客戶端sendEveryone(message);}} catch (IOException e) {e.printStackTrace();}}}/**給客戶端發送消息的方法*/public void sendEveryone(String message){for (Object COPStreams: clientOutPutStreams) {try {PrintWriter writer = (PrintWriter) COPStreams;writer.println(message);writer.flush();}catch (Exception e){e.printStackTrace();}}} }?然后是客戶端
import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket;public class ChatClient1 {JTextArea incoming; //文本域,用來顯示消息JTextField outgoing; //輸入框BufferedReader reader; //緩沖字符輸入流,用于讀取服務器轉發的消息PrintWriter writer; //輸出字符流,用于給服務器發消息Socket socket; //創建準備與服務器連接的套接字public static void main(String[] args) {new ChatClient1().go();}public void go() {JFrame jFrame = new JFrame("聊天室客戶端1");JPanel jPanel = new JPanel();//創建文本域incoming = new JTextArea(15, 22);incoming.setFont(new Font("微軟雅黑",Font.BOLD,16));incoming.setLineWrap(true); //設置在行過長時自動換行incoming.setWrapStyleWord(true); //設置在單詞過長時,將單詞移到下一行incoming.setEditable(false);//創建滾動面板,并將文本域放入其中JScrollPane jScrollPane = new JScrollPane(incoming);jScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);jScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);//創建輸入框outgoing = new JTextField(20);//創建發送按鈕,并創建監聽器JButton sendButton = new JButton("發送");sendButton.addActionListener(new sendButtonListener());//將上述定義組件放入JPanel容器中jPanel.add(jScrollPane);jPanel.add(outgoing);jPanel.add(sendButton);//將JPanel容器放入JFrame面板中jFrame.getContentPane().add(BorderLayout.CENTER, jPanel);jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jFrame.setSize(400,450);jFrame.setVisible(true);//與服務器建立連接setUpNetworking();//開啟一個線程,并執行其中run()方法Thread thread = new Thread(new IncomingReader());thread.start();}/*** 與服務器建立socket連接,并在socket基礎上建立輸入流和輸出流*/private void setUpNetworking() {try {//與服務器socket建立連接socket = new Socket("127.0.0.1", 8888);//與socket建立字符緩沖輸入流,用于接受發送框中的消息InputStreamReader inputStreamReader = new InputStreamReader(socket.getInputStream());reader = new BufferedReader(inputStreamReader);//與socket建立字符緩沖輸出流,用于發送消息writer = new PrintWriter(this.socket.getOutputStream());incoming.append("客戶端1成功連接到服務器......" + "\n");} catch (Exception e) {e.printStackTrace();}}/*** 監聽器與發送消息給服務器模塊*/class sendButtonListener implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {//當發送按鈕點擊,出發事件,將輸入框中的文字獲取,并發送給服務器writer.println("客戶端1: " + outgoing.getText());writer.flush();//輸入框文字清空outgoing.setText("");outgoing.requestFocus();}}/*** 該線程任務是不斷讀取服務器發送的信息,并將其加入到文本域中*/class IncomingReader implements Runnable {public IncomingReader() {}@Overridepublic void run() {String message; //用于接受從服務器與客戶端1建立的輸入流中讀出的信息try {while ((message = reader.readLine()) != null) {System.out.println("接收到消息: " + message);incoming.append(message + "\n");}} catch (Exception e) {e.printStackTrace();}}} }當然,再加一個客戶端的話就是cv工作了,這里面可能有些對于多線程的把握還不是很好,后面可以再找時間優化優化。
總結
以上是生活随笔為你收集整理的用java实现一个简单的网络聊天室的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: websocket实现聊天室(一)
- 下一篇: MinIO分布式文件服务器搭建与入门