練手小專案一:JAVA聊天室原始碼
客戶端:
- 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.DataInputStream;
- import java.io.DataOutputStream;
- import java.io.IOException;
- import java.net.Socket;
- import java.net.SocketException;
- import java.net.UnknownHostException;
- public class Client extends Frame { //繼承Frame類
- TextField tf = new TextField(); //輸入框物件
- TextArea ta = new TextArea(); //顯示框物件
- Socket s = null;
- DataOutputStream dos = null;
- DataInputStream dis = null;
- boolean bConnected = false;
- recvThread r = new recvThread(); //執行緒類
- public static void main(String[] args) {
- new Client().creatFrame();
- }
- public void creatFrame() { //產生圖形介面
- this.setBounds(300, 300, 300, 300);
- ta.setEditable(false);
- this.add(tf, BorderLayout.SOUTH);
- this.add(ta, BorderLayout.NORTH);
- this.addWindowListener(new WindowAdapter() { //響應關閉視窗事件
- public void windowClosing(WindowEvent e) {
- disconnect();
- System.exit(0);
- }
- });
- tf.addActionListener(new tfListener()); //響應輸入事件
- this.pack();
- this.setVisible(true);
- connect();
- new Thread(r).start();
- }
- public void connect() {
- try {
- s = new Socket("127.0.0.1", 8888); //建立客戶端物件
- dos = new DataOutputStream(s.getOutputStream());
- dis = new DataInputStream(s.getInputStream());
- bConnected = true;
- } catch (UnknownHostException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public void disconnect() { //視窗關閉時關閉客戶端,輸入,輸出
- try {
- dos.close();
- dis.close();
- s.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- class tfListener implements ActionListener { //輸入框實現的介面,響應輸入事件
- public void actionPerformed(ActionEvent e) {
- String str = tf.getText();
- //ta.setText(str);
- tf.setText("");
- try {
- dos.writeUTF(str);
- dos.flush();
- //dos.close();
- } catch (IOException e1) {
- e1.printStackTrace();
- }
- }
- }
- class recvThread implements Runnable { //客戶端執行緒接收資料
- public void run() {
- try {
- while (bConnected) {
- String str;
- str = dis.readUTF(); //拿到資料
- ta.setText(ta.getText() + str + '/n');//顯示到顯示框中
- }
- } catch (SocketException e) {
- System.out.println("退出了");
- } catch (IOException e1) {
- e1.printStackTrace();
- }
- }
- }
- }
---------------------------------------------------------------------------------------------------------------------------------------
服務端:
- import java.io.DataInputStream;
- import java.io.DataOutputStream;
- import java.io.EOFException;
- import java.io.IOException;
- import java.net.BindException;
- import java.net.ServerSocket;
- import java.net.Socket;
- import java.net.SocketException;
- import java.util.ArrayList;
- import java.util.List;
- public class Server {
- boolean started = false;
- ServerSocket ss = null;
- List<ChatClient> clients = new ArrayList<ChatClient>(); //儲存客戶端執行緒類
- public static void main(String[] args) {
- new Server().start();
- }
- void start() {
- try {
- ss = new ServerSocket(8888); //建立服務端物件
- started = true;
- } catch (BindException e) {
- System.out.println("埠使用中");
- } catch (IOException e) {
- e.printStackTrace();
- }
- try {
- while (started) {
- Socket s = ss.accept(); //接收客戶端
- ChatClient c = new ChatClient(s);
- System.out.println("客戶端接收成功");
- new Thread(c).start(); //啟動執行緒
- clients.add(c); //新增執行緒類
- }
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {
- ss.close();
- } catch (IOException e) {
- // TODO 自動生成 catch 塊
- e.printStackTrace();
- }
- }
- }
- class ChatClient implements Runnable { //建立客戶端執行緒接收,傳送資料
- private Socket s;
- DataInputStream dis = null;
- DataOutputStream dos = null;
- boolean bConnected = false;
- public ChatClient(Socket s) {
- this.s = s;
- try {
- dis = new DataInputStream(s.getInputStream());
- dos = new DataOutputStream(s.getOutputStream());
- bConnected = true;
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- void send(String str) {
- try {
- dos.writeUTF(str);
- } catch (SocketException e) {
- System.out.println("對方退出了");
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public void run() {
- try {
- while (bConnected) {
- String str = dis.readUTF();
- // System.out.println(str);
- for (int i = 0; i < clients.size(); i++) {
- ChatClient c = clients.get(i);
- c.send(str);
- }
- }
- } catch (EOFException e) {
- System.out.println("客戶端退出了");
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- if (dis != null)
- if (s != null)
- try {
- dis.close();
- s.close();
- dos.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
- }
相關文章
- 前端練手專案小結前端
- [練手專案]Gin+websocket 的多人聊天室Web
- 長沙Java培訓:JAVA練手專案分享Java
- 最適合Java基礎練手的Java小專案「圖書管理系統」Java
- 70個Python經典實用練手專案(附原始碼)Python原始碼
- gin練手專案
- 前端練手專案前端
- 34套Java專案教程+原始碼包含Java swing專案 Java web專案 Java控制檯專案(視訊教程+原始碼)Java原始碼Web
- 練手小專案(二):計算器(說明文件)
- 【Java學習】聊天室專案(32)Java
- 練手專案,實現一個web框架Web框架
- 完整的python專案例項-Python例項練手專案彙總(附原始碼)Python原始碼
- Flutter練手專案--玩安卓Flutter安卓
- webpack練手專案之easySlide(一):初探webpackWebIDE
- 50行程式碼,Node爬蟲練手專案 ?️行程爬蟲
- webpack練手專案之easySlide(二):程式碼分割WebIDE
- 如何閱讀java專案的原始碼Java原始碼
- web前端佈局練手專案Web前端
- Vue練手專案(包含typescript版本)VueTypeScript
- 10個Python練手專案Python
- 一個練習專案,好玩的bbs-javaJava
- Java大型工程專案管理系統原始碼,原生APP原始碼Java專案管理原始碼APP
- 【提測平臺】測試平臺開發練手專案原始碼和教程彙總原始碼
- java版工程專案管理系統原始碼Java專案管理原始碼
- 又一個Rust練手專案-wssh(SSH over Websocket Client)RustWebclient
- java小課設:使用MySQL做一個聊天室JavaMySql
- 【練手小專案】簡易通訊錄:單連結串列實現
- 全網最全Python專案練習500例(附原始碼),練完可就業Python原始碼就業
- go+vue入門專案練手GoVue
- 分享一個簡單的聊天室專案
- Java專案:醫院分診管理系統,HIS原始碼 原始碼分享Java原始碼
- JAVA畢設代做(專案+論文+原始碼)Java原始碼
- 一個練手專案:MVP+Rxjava+Retrofit2+Material DesignMVPRxJavaMaterial Design
- 分享一份介面測試專案(非常值得練手)
- Java SSM練手小專案-手把手帶你搭建一個基於SSM框架的人力資源管理後臺系統JavaSSM框架
- 超讚!推薦一個專注於Java後端原始碼分析的Github專案!Java後端原始碼Github
- 學python找不到專案練手?別擔心,70個python練手專案給你充實感Python
- 手寫 Java HashMap 核心原始碼JavaHashMap原始碼