院
系: :
計算機科學學院
專
業: :
計算機科學與技術
年
級: :
3 2013 級
課程名稱: :
軟件工程
組
員: :
司少武
(2)
蘭少雄
(2)
張宇
(2)
納洪澤 (2) 指導教師: :
劉衛平
5 2015 年
2 12 月
26 日
聊天室
1 前言
1 1 、 1 即時消息系統的研究現狀
即時消息系統[1](Instant Messenger,IM)就是一種在后 PC 時代興起的,以 Internet 網絡為基礎的,允許交互雙方即時地傳送文字、語音、視頻等信息,能夠跟蹤網絡用戶在線狀態的網絡應用軟件。即時消息系統產生有著深刻的社會原因:人們都有渴望社交,獲得社會尊重、實現自我的需求,這正就是即時消息軟件風行的原動力,而物質文明的日益發達所帶來副作用,又使得人們習慣與周圍的人保持距離,以致人們更愿意對陌生人敞開心扉,在網絡中可以跨越年齡、身份、行業、地域的限制,達到人與人、人與信息之間的零距離交流。從這點上講,即時消息系統的出現改變了人們的溝通方式與交友文化,大大拓展了個人生活交流的空間。
1 1 、2 2 本工程的主要內容
隨著互聯網逐步普及,人們的生活與工作也越來越離不開信息網絡的支持, 而聊天室就是人們最常見, 最直接的網上交流的方式。本聊天系統以聊天交流為主,為廣大用戶提供一個借助網絡進行人際交往的平臺,也就是網絡與現實最貼近的實用型網站。本文所介紹的網絡聊天系統就是基于開放的 JAVA 應用程序開發設計的,其主要特性就是能動態、實時的完成信息的傳遞,且具有高效的交互性,更有效的處理客戶請求, 且具有脫離數據庫技術方法, 易于維護與更新的特點。
2 需求分析
本系統所要實現的主要功能就是當用戶聊天時,將當前用戶名、聊天對象、聊天內容、聊天語氣與就是否私聊進行封裝,然后與服務器建立 Socket 連接,再用對象輸出流包裝 Socket 的輸出流將聊天信息對象發送給服務器端 當用戶發送聊天信息時,服務端將會收到客戶端用 Socket 傳輸過來的聊天信息對象,然后將其強制轉換為 Chat 對象,并將本次用戶的聊天信息對象添加到聊天對象集 Message 中,以供所有聊天用戶訪問。
接收用戶的聊天信息就是由多線程技術實現的,因為客戶端必須時時關注更新服務器上就是否有最新消息,在本程序中設定的就是 3 秒刷新服務器一次,如果間隔時間太短將會增加客戶端與服務器端的通信負擔,而間隔時間長就會讓人感覺沒有時效性,所以經過權衡后認為3秒最佳,因為每個用戶都不可能在3秒內連續發送信息。
當每次用戶接收到聊天信息后將會開始分析聊天信息然后將適合自己的信息人性化地顯示在聊天信息界面上。
2 2 、 1
業務需求
1、 與聊天室成員一起聊天。
2、 可以與聊天室成員私聊。
3、 可以改變聊天內容風格。
4、 用戶注冊(含頭像)、登錄。
5、 服務器監控聊天內容。
6、 服務器過濾非法內容。
7、 服務器發送通知。
8、 服務器踢人。
9、 保存服務器日志。
10、保存用戶聊天信息。
2 2 、 2
系統功能模塊
2 2 、2 2 、 1
服務器端
1、處理用戶注冊
2、處理用戶登錄
3、處理用戶發送信息
4、處理用戶得到信息
5、處理用戶退出 2 2 、2 2 、 2
客戶端
1、用戶注冊界面及結果
2、用戶登錄界面及結果
3、用戶發送信息界面及結果
4、用戶得到信息界面及結果
5、用戶退出界面及結果 2 2 、 3
性能需求
運行環境:Windows All
必要環境:JDK 1、5 以上
硬件環境:CPU 400MHz 以上,內存 64MB 以上 3 3 數據結構
3 3 、 1 數據結構
此系統數據庫中儲存信息采用字符指針儲存,將用戶的信息用字符的形式進行處理并儲存。
3 3 、 2 邏輯結構
邏輯結構:
用戶向服務器發送請求,服務器獲取對方 IP,若獲取成功,用戶向其發送消息,服務器將其處理并將其記錄,然后將消息發給另一用戶。其 E—R 圖如下所示: 2
將 E-R 圖轉化為關系模型,建立關系模型為: 消息(內容,時間); 記錄信息(內容,儲存信息); 服務器(服務器 IP);
3 3 3 、 3 功能模塊劃分
3、3、1 結構框圖 消息 發送 服務器 記錄 記錄信息 內容 時間 內容 儲存信息 圖 1、E-R 圖 服務器 IP
3、3、2 程序流圖 (1) 整個系統流程圖如下:
聊天系統 發送消息 接受消息 服務器獲取 IP 服務器發送消息 保存信息 時鐘 圖 2、結構圖 用戶發送的消息或請求 結束 服務器接收信息 查詢請求? 向用請求戶發送消息 保存信息 向目標用戶發送消息 就 否 圖 3、系統程序流程圖
3、3、3 模塊功能分析及外部設計 模塊功能分析: (1)發送消息:用戶選擇好友,如果好友在線,服務器便獲取其IP地址,用戶打開消息盒編輯需要發送的消息,然后發送,服務器接受此消息,并處理記錄到記錄表中,然后將其發送給好友。
(2)接收消息:好友發送的信息通過服務器處理并發送到本用戶,如果設置為接收消息,則系統提示并可以打開查瞧此消息,否則服務器不將此消息發送到本用戶。
(3)消息記錄查詢:用戶向服務器發送查詢請求,服務器作出響應并將最近消息記錄發送到此用戶。
外部設計: 交互設計就是面向最終用戶的設計,就是軟件的外部設計,交互設計要求在研究軟件技術問題的同時對人加以研究。用戶就是什么樣的人?用戶怎樣與新的計算機系統進行交互?用戶怎樣解釋系統產生的信息?用戶對系統有哪些期望?這些問題僅僅就是需要在用戶交互設計時必須詢問與回答的問題。
作為點對點的聊天系統,作為服務使用者得用戶與提供服務的聊天系統有著互動與交換信息的過程,用戶有請求,系統就必須有應答,需要雙方參與。
(1)當用戶選擇好友向其發送消息時,點擊好友,向服務器發送請求,如果好友在線,服務器自動獲取好友 IP 并建立雙方的連接,進行聊天。否則應該提示好友不在,不能聊天或發送離線信息。
(2)用戶查詢聊天信息時,向服務器發送查詢請求,服務器作出響應并將相應記錄發送到此用戶界面。
通過對產品的界面與行為進行交互設計,讓產品與它的使用者之間建立一種有機關系,從而可以有效的達到使用者的目標,而好的交互設計會使系統與使用者之間更好的交互,達到“愉悅地合作”,這就是交互設計的最終目的。
4 詳細設計
4 4 、 1 類定義
ChatClient、java 為客戶端程序啟動類,負責客戶端的啟動與退出。
Login、java 為客戶端程序登錄界面,負責用戶帳號信息的驗證與反饋。
Register、java 為客戶端程序注冊界面,負責用戶帳號信息的注冊驗證與反饋。
ChatRoom、java 為客戶端程序聊天室主界面,負責接收、發送聊天內容與服務器端的 Connection、java 親密合作。
Windowclose 為 ChatRoom、java 的內部類,負責監聽聊天室界面的操作,當用戶退出時返回給服務器信息。
Clock、java 為客戶端程序的一個小程序,實現的一個石英鐘功能。
4 4 、 2 主要模塊內部設計
此點對點聊天系統主要包括以下模塊:(1)發送消息;(2)接收消息;(3)查詢消息記錄。每個模塊的主要執行功能函數及算法如下。
4 4 、2 2 、1 1 模塊 1 1 設計
4、2、1、1 模塊算法 模塊一:發送消息:
發送消息函數:send messages(char *p,InetAdrress);
發送消息后自動執行儲存函數:memory messages(InetAdrress,char *p); 4、2、1、2 流程圖
4.2.2 模塊 2 2 設計
4、2、2、1 模塊算法 模塊二:接收消息:
接收消息消息函數: *receive messages(InetAdrress,char *p);
接 收 消 息 后 自 動 執 行 儲 存 消 息 函 數 :memory messages(InetAdrress,char *p); 4、2、2、2 流程圖: 用戶輸入要發送的信息 就是否在線? 獲取 IP 發送消息 保存記錄 結束 就否 圖 4、發送消息流程圖
4.2.3 模塊 3 3 設計
4、2、3、1 模塊算法 模塊三:消息記錄查詢:
執行發送請求函數:*check notes(InetAdrress,char *p);
刪除記錄函數:delete notes(InetAdrress);
自動執行接收消息函數:*receive messages(InetAdrress,char *p);
4、2、3、2
流程圖: 好友發送的消息 就是否接收 打開消息 保存消息記 結束 圖 5、接收消息流程圖 就 否
5 測試分析與截圖
在實現本系統的同時每設計一個模塊,就實現模塊測試,使其能實現該函數需要實現的功能,此階段為白盒測試。此階段將此模塊作為單獨的一個實體來測試,而且比較容易實際檢驗模塊正確性的測試方案,保證每個模塊單元的正確運行,來確定編碼與詳細設計的錯誤。
然后集成測試。集成測試階段,先將單元測試成功的模塊放在一起形成一個子系統來測試,以解決模塊間的協調與通信問題。然后將子系統測試通過的模塊放在一起形成一個完整的系統測試,檢驗功能,來發現需求報告中的錯誤。
5 5 、 1 測試用例
為了檢驗此系統的正確性,設計了以下的一些測試用例: (1)登錄注冊
(2)發送與接收消息 A:您好 B:您好
(3)保存聊天記錄
用戶發送的查詢請求 就是否存在記錄服務器向其發送記錄 讀取記錄 結束 就 否 圖 6、查詢記錄流程
(4)保存聊天記錄
(5)保存服務器日志
(6)服務器踢人 不同的測試數據發現程序錯誤的能力差別很大,為了提高測試效率低測試成本,應該選擇高效的測試用例,數據盡量少,做到盡可能完備的測試就可以了。
5 5 、 2 測試結果
5、2、1 登錄界面
5、2、2 注冊界面
5、2、3 服務器
5、2、4 聊天室聊天 對所有人,私人聊天,系統提示信息。
5、2、5 聊天記錄保存
5、2、6 服務器日志保存
5、2、7 服務器踢人
5、2、8 時鐘
6
結束語
Java面向對象程序設計就是一門應用廣泛并且實用性極強的高級程序設計語言。通過本次課程設計,我們對面向對象的基本思想有了進一步的理解,對項目的各個階段的任務也有了一定的了解。設計開始階段必須明確設計的目的與需求分析,總體設計要全面分析聊天室系統的架構。通過這次設計,使我們認識到體系的架構就是最重要的,只有準確的系統設計、很好的定義各個模塊及模塊之間的關系,才能在編碼階段更輕松的的實現。
通過這次課程設計,對我們的邏輯思維能力就是一個很大的鍛煉,它不僅加強了我們的系統思考問題的能力,而且還改變了我們以前不好的編程習慣,雖然花費了不少的時間,但就是我們學到了豐富的知識。
另外,此次課程設計也提高了我們的團對合作精神,讓我們明白不就是不能一個人能單獨完成,而就是要集思廣益,結合更多的人的創意思維。讓我們大家深刻的體會到理論與實際相結合的重要性與微妙之處。對于不同的想法我們都會集中討論并對好的意見加以借鑒,在這個討論的過程中,還更正了不少我們各自自身對于某個知識點的誤區。
這次程序設計也就是一個毅力的考驗過程。有時候往往只就是一個小小的錯誤,卻要花出幾小時甚至就是一兩天的時間才可能發現它。所以在這個過程不能
過于急躁,要很有耐心將程序反復調試。
App server 、 java
import java、io、*; import java、net、*; import java、util、*; public class AppServer extends Thread {
private ServerSocket serverSocket;
private ServerFrame sFrame;
private static Vector userOnline = new Vector(1, 1);
private static Vector v = new Vector(1, 1);
public AppServer() {
sFrame = new ServerFrame();
try {
serverSocket = new ServerSocket(1001);
// 獲取服務器的主機名與 IP 地址
InetAddress address = InetAddress、getLocalHost();
sFrame、txtServerName、setText(address、getHostName());
sFrame、txtIP、setText(address、getHostAddress());
sFrame、txtPort、setText("1001");
} catch (IOException e) {
fail(e, "不能啟動服務!");
}
sFrame、txtStatus、setText("已啟動、、、");
this、start(); // 啟動線程
}
public static void fail(Exception e, String str) {
System、out、println(str + " 。" + e);
}
public void run() {
try {
while (true) {
Socket client = serverSocket、accept();
new Connection(sFrame, client, userOnline, v);
System、out、println("userLength:"+userLength);
}
} catch (IOException e) {
fail(e, "不能監聽!");
}
}
public static void main(String args[]) {
new AppServer();
} } Login 、 java
import*; public class Login extends JFrame implements ActionListener {
private static final long serialVersionUID = -89657739L;
private JPanel pnlLogin;
private JButton btnLogin, btnRegister, btnExit;
private JLabel lblServer, lblUserName, lblPassword, lblLogo;
private JTextField txtUserName, txtServer;
private JPasswordField pwdPassword;
private String strServerIp;
private Dimension scrnsize;
private Toolkit toolkit = Toolkit、getDefaultToolkit();
public Login() {
super("登錄[HappyChat]聊天室");
pnlLogin = new JPanel();
this、getContentPane()、add(pnlLogin);
lblServer = new JLabel("服務器(S):");
lblUserName = new JLabel("用戶名(U):");
lblPassword = new JLabel("口
令(P):");
txtServer = new JTextField(20);
txtServer、setText("127、0、0、1");
txtUserName = new JTextField(20);
pwdPassword = new JPasswordField(20);
btnLogin = new JButton("登錄(L)");
btnLogin、setToolTipText("登錄到服務器");
btnLogin、setMnemonic("L");
btnRegister = new JButton("注冊(R)");
btnRegister、setToolTipText("注冊新用戶");
btnRegister、setMnemonic("R");
btnExit = new JButton("退出(X)");
btnExit、setToolTipText("退出系統");
btnExit、setMnemonic("X");
pnlLogin、setLayout(null);
pnlLogin、setBackground(new Color(52, 130, 203));
lblServer、setBounds(50, 100, 100, 30);
txtServer、setBounds(150, 100, 120, 25);
lblUserName、setBounds(50, 130, 100, 30);
txtUserName、setBounds(150, 130, 120, 25);
lblPassword、setBounds(50, 160, 100, 30);
pwdPassword、setBounds(150, 160, 120, 25);
btnLogin、setBounds(50, 200, 80, 25);
btnRegister、setBounds(130, 200, 80, 25);
btnExit、setBounds(210, 200, 80, 25);
Font fontstr = new Font("宋體", Font、PLAIN, 12);
lblServer、setFont(fontstr);
txtServer、setFont(fontstr);
lblUserName、setFont(fontstr);
txtUserName、setFont(fontstr);
lblPassword、setFont(fontstr);
pwdPassword、setFont(fontstr);
btnLogin、setFont(fontstr);
btnRegister、setFont(fontstr);
btnExit、setFont(fontstr);
lblUserName、setForeground(Color、BLACK);
lblPassword、setForeground(Color、BLACK);
btnLogin、setBackground(Color、ORANGE);
btnRegister、setBackground(Color、ORANGE);
btnExit、setBackground(Color、ORANGE);
pnlLogin、add(lblServer);
pnlLogin、add(txtServer);
pnlLogin、add(lblUserName);
pnlLogin、add(txtUserName);
pnlLogin、add(lblPassword);
pnlLogin、add(pwdPassword);
pnlLogin、add(btnLogin);
pnlLogin、add(btnRegister);
pnlLogin、add(btnExit);
Icon logo1 = new ImageIcon("images\\loginlogo、jpg");
lblLogo = new JLabel(logo1);
lblLogo、setBounds(0, 0, 340, 66);
pnlLogin、add(lblLogo);
setResizable(false);
setSize(340, 260);
setVisible(true);
scrnsize = toolkit、getScreenSize();
setLocation(scrnsize、width / 2 - this、getWidth() / 2, scrnsize、height
/ 2 - this、getHeight() / 2);
Image img = toolkit、getImage("images\\appico、jpg");
setIconImage(img);
btnLogin、addActionListener(this);
btnRegister、addActionListener(this);
btnExit、addActionListener(this);
@SuppressWarnings({ "deprecation", "static-access" })
public void actionPerformed(ActionEvent ae) {
Object source = ae、getSource();
if (source、equals(btnLogin)) {
if (txtUserName、getText()、equals("")
|| pwdPassword、getText()、equals("")) {
JOptionPane op1 = new JOptionPane();
op1、showMessageDialog(null, "用戶名或密碼不能為空");
} else {
strServerIp = txtServer、getText();
login();
}
}
if (source、equals(btnRegister)) {
strServerIp = txtServer、getText();
this、dispose();
new Register(strServerIp);
}
if (source == btnExit) {
System、exit(0);
}
}
@SuppressWarnings("deprecation")
public void login() {
Customer data = new Customer();
data、custName = txtUserName、getText();
data、custPassword = pwdPassword、getText();
try {
Socket toServer;
toServer = new Socket(strServerIp, 1001);
ObjectOutputStream streamToServer = new ObjectOutputStream(toServer
、getOutputStream());
streamToServer、writeObject((Customer) data);
BufferedReader fromServer = new BufferedReader(
new InputStreamReader(toServer、getInputStream()));
String status = fromServer、readLine();
if (status、equals("登錄成功")) {
new ChatRoom((String) data、custName, strServerIp);
this、dispose();
streamToServer、close();
fromServer、close();
toServer、close();
} else {
JOptionPane、showMessageDialog(null, status);
streamToServer、close();
fromServer、close();
toServer、close();
}
} catch (ConnectException e1) {
JOptionPane、showMessageDialog(null, "未能建立到指定服務器的連接!");
} catch (InvalidClassException e2) {
JOptionPane、showMessageDialog(null, "類錯誤!");
} catch (NotSerializableException e3) {
JOptionPane、showMessageDialog(null, "對象未序列化!");
} catch (IOException e4) {
JOptionPane、showMessageDialog(null, "不能寫入到指定服務器!");
}
}
public static void main(String args[]) {
new Login();
} }
Register 、 java
import *; public class Register extends JFrame
implements ActionListener {
private JComboBox comboBox;
private static final long serialVersionUID = 97522180L;
JPanel
pnlRegister;
JLabel
lblUserName,lblGender,lblAge;
JLabel
lblPassword,lblConfirmPass,lblEmail,logoPosition;
JTextField
txtUserName,txtAge,txtEmail;
JPasswordField
pwdUserPassword,pwdConfirmPass;
JRadioButton
rbtnMale,rbtnFemale;
ButtonGroup
btngGender;
JButton
btnOk,btnCancel,btnClear;
String
strServerIp;
final JLabel headLabel = new JLabel();
Dimension scrnsize;
Toolkit toolkit=Toolkit、getDefaultToolkit();
public Register(String ip)
{
super("[HappyChat]聊天室注冊窗口");
strServerIp=ip;
pnlRegister=new JPanel();
this、getContentPane()、add(pnlRegister);
lblUserName=new JLabel("用 戶 名:");
lblGender=new JLabel("性
別:");
lblAge=new JLabel("年
齡:");
lblPassword=new JLabel("口
令:");
lblConfirmPass=new JLabel("確認口令:");
lblEmail=new JLabel("電子郵件:");
txtUserName=new JTextField(30);
txtEmail=new JTextField(30);
txtAge=new JTextField(10);
pwdUserPassword=new JPasswordField(30);
pwdConfirmPass=new JPasswordField(30);
rbtnMale=new JRadioButton("男",true);
rbtnFemale=new JRadioButton("女");
btngGender=new ButtonGroup();
btnOk=new JButton("確定(O)");
btnOk、setMnemonic("O");
btnOk、setToolTipText("保存注冊信息");
btnCancel=new JButton("返回(B)");
btnCancel、setMnemonic("B");
btnCancel、setToolTipText("返回登錄窗口");
btnClear=new JButton("清空(L)");
btnClear、setMnemonic("L");
btnClear、setToolTipText("清空注冊信息");
pnlRegister、setLayout(null);
pnlRegister、setBackground(new Color(52,130,203));
lblUserName、setBounds(30,80,100,30);
txtUserName、setBounds(110,85,120,20);
lblPassword、setBounds(30,141,100,30);
pwdUserPassword、setBounds(110,146,120,20);
lblConfirmPass、setBounds(30,166,100,30);
pwdConfirmPass、setBounds(110,171,120,20);
lblGender、setBounds(30,191,100,30);
rbtnMale、setBounds(110,196,60,20);
rbtnFemale、setBounds(190,196,60,20);
lblAge、setBounds(30,216,100,30);
txtAge、setBounds(110,221,120,20);
lblEmail、setBounds(30,241,100,30);
txtEmail、setBounds(110,246,120,20);
btnOk、setBounds(246,166,80,25);
btnCancel、setBounds(246,201,80,25);
btnClear、setBounds(246,241,80,25);
Font fontstr=new Font("宋體",Font、PLAIN,12);
lblUserName、setFont(fontstr);
lblGender、setFont(fontstr);
lblPassword、setFont(fontstr);
lblConfirmPass、setFont(fontstr);
lblAge、setFont(fontstr);
lblEmail、setFont(fontstr);
rbtnMale、setFont(fontstr);
rbtnFemale、setFont(fontstr);
txtUserName、setFont(fontstr);
txtEmail、setFont(fontstr);
btnOk、setFont(fontstr);
btnCancel、setFont(fontstr);
btnClear、setFont(fontstr);
lblUserName、setForeground(Color、BLACK);
lblGender、setForeground(Color、BLACK);
lblPassword、setForeground(Color、BLACK);
lblAge、setForeground(Color、BLACK);
lblConfirmPass 、setForeground(Color、BLACK);
lblEmail、setForeground(Color、BLACK);
rbtnMale、setForeground(Color、BLACK);
rbtnFemale、setForeground(Color、BLACK);
rbtnMale、setBackground(Color、white);
rbtnFemale、setBackground(Color、white);
btnOk、setBackground(Color、ORANGE);
btnCancel、setBackground(Color、ORANGE);
btnClear、setBackground(Color、ORANGE);
rbtnMale、setOpaque(false);
rbtnFemale、setOpaque(false);
pnlRegister、add(lblUserName);
pnlRegister、add(lblGender);
pnlRegister、add(lblPassword);
pnlRegister、add(lblConfirmPass);
pnlRegister、add(lblEmail);
pnlRegister、add(lblAge);
pnlRegister、add(txtAge);
pnlRegister、add(txtUserName);
pnlRegister、add(txtEmail);
pnlRegister、add(pwdUserPassword);
pnlRegister、add(pwdConfirmPass);
pnlRegister、add(btnOk);
pnlRegister、add(btnCancel);
pnlRegister、add(btnClear);
pnlRegister、add(rbtnMale);
pnlRegister、add(rbtnFemale);
btngGender、add(rbtnMale);
btngGender、add(rbtnFemale);
Icon logo = new ImageIcon("images\\registerlogo、jpg");
logoPosition = new JLabel(logo);
logoPosition、setBounds(0, 0, 360,78);
pnlRegister、add(logoPosition);
this、setSize(360,313);
this、setVisible(true);
this、setResizable(false);
scrnsize=toolkit、getScreenSize();
this、setLocation(scrnsize、width/2-this、getWidth()/2,
scrnsize、height/2-this、getHeight()/2);
Image img=toolkit、getImage("images\\appico、jpg");
this、setIconImage(img);
btnOk
、addActionListener(this);
btnCancel、addActionListener(this);
btnClear
、addActionListener(this);
final JLabel label = new JLabel();
label、setText("頭
像:");
label、setBounds(30, 120, 60, 15);
pnlRegister、add(label);
comboBox = new JComboBox();
comboBox、setAutoscrolls(true);
comboBox、setModel(new DefaultComboBoxModel(new String[] {"1", "2", "3"}));
comboBox、setBounds(110, 116, 47, 23);
comboBox、addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent arg0) {
Icon logo = new ImageIcon("face\\"+comboBox 、getSelectedItem()、toString()+"、jpg");
headLabel、setIcon(logo);
}
});
pnlRegister、add(comboBox);
headLabel、setHorizontalAlignment(SwingConstants、CENTER);
// 、 setIcon(SwingResourceManager 、 getIcon(Register 、 class, "face/1、jpg"));
headLabel、setIcon(new ImageIcon("face//1、JPG"));
headLabel、setBounds(247, 88, 74, 72);
pnlRegister、add(headLabel);
}
public void actionPerformed(ActionEvent ae)
{
Object source=new Object();
source=ae、getSource();
if (source、equals(btnOk))
{
register();
}
if (source、equals(btnCancel))
{
new Login();
this、dispose();
}
if (source、equals(btnClear))
{
txtUserName、setText("");
pwdUserPassword、setText("");
pwdConfirmPass、setText("");
txtAge、setText("");
txtEmail、setText("");
}
}
@SuppressWarnings({ "deprecation", "static-access" })
public void register()
{
Register_Customer data=new Register_Customer();
data、custName
= txtUserName、getText();
data、custPassword = pwdUserPassword、getText();
data、age
= txtAge、getText();
data、sex
= rbtnMale、isSelected()?"男":"女";
data、email
= txtEmail、getText();
//chenmin
data、head
= comboBox、getSelectedItem()、toString();
if(data、custName、length()==0)
{
JOptionPane、showMessageDialog(null,"用戶名不能為空");
return;
}
if(data、custPassword、length()==0)
{
JOptionPane、showMessageDialog(null,"密碼不能為空");
return;
}
if(!data、custPassword、equals(pwdConfirmPass、getText()))
{
JOptionPane、showMessageDialog(null,"密碼兩次輸入不一致,請重新輸入");
return;
}
if(data、age、length()==0)
{
JOptionPane、showMessageDialog(null,"年齡不能為空");
return;
}
int age=Integer、parseInt(txtAge、getText());
if (age<=0||age>100){
JOptionPane、showMessageDialog(null,"年齡輸入不合法");
return;
}
int Found_flag=0;
for (int i=0;i<data、email、length();i++)
{
if(data、email、charAt(i)=="@")
{
Found_flag++;
}
}
if(Found_flag!=1)
{
JOptionPane、showMessageDialog(null,"電子郵箱格式不正確,請重新輸入");
return;
}
try
{
Socket toServer;
toServer = new Socket(strServerIp,1001);
ObjectOutputStream streamToServer=new ObjectOutputStream (toServer、getOutputStream());
streamToServer、writeObject((Register_Customer)data);
BufferedReader fromServer=new BufferedReader(new InputStreamReader(toServer、getInputStream()));
String status=fromServer、readLine();
JOptionPane op=new JOptionPane();
op、showMessageDialog(null,status);
if(status、equals(data、custName+"注冊成功"))
{
txtUserName、setText("");
pwdUserPassword、setText("");
pwdConfirmPass、setText("");
txtAge、setText("");
txtEmail、setText("");
}
streamToServer、close();
fromServer、close();
}
catch(InvalidClassException e1)
{
JOptionPane、showMessageDialog(null,"類錯誤!");
}
catch(NotSerializableException e2)
{
JOptionPane、showMessageDialog(null,"對象未序列化!");
}
catch(IOException e3)
{
JOptionPane、showMessageDialog(null,"不能寫入到指定服務器!");
}
}
public static void main(String args[])
{
new Register("127、0、0、1");
} }
ChatRoom 、 java
public ChatRoom(String name, String ip) {
// Dialog d = new FontDialog();
strServerIp = ip;
strLoginName = name;
frmChat = new JFrame("聊天室" + "[用戶:" + name + "]");
pnlChat = new JPanel();
frmChat、setDefaultCloseOperation(JFrame、EXIT_ON_CLOSE);
frmChat、getContentPane()、add(pnlChat);
Font fntDisp1 = new Font("宋體", Font、PLAIN, 12);
String list[] = { "所有人" };
btnCls = new JButton("清屏(C)");
btnExit = new JButton("退出(X)");
btnSend = new JButton("發送(N)");
btnSave = new JButton("保存(S)");
btnTimer = new JButton("時鐘(T)");
lblUserList = new JLabel("【在線用戶列表】");
lblUserMessage = new JLabel("【聊天信息】");
lblSendMessage = new JLabel("聊天內容:");
lblChatUser = new JLabel("您對:");
lblUserTotal = new JLabel("在線人數:");
lblCount = new JLabel("0");
lstUserList = new java、awt、List();
txtMessage = new JTextField(170);
cmbUser = new JComboBox(list);
// chenmin
cmbUser、addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent arg0) {
freshHead();
}
});
chPrivateChat = new JCheckBox("私聊");
taUserMessage = new TextArea("", 300, 200,
TextArea、SCROLLBARS_VERTICAL_ONLY);// 只能向下滾動
// taUserMessage、setText("aaaaaa 漢字 aaaa");
taUserMessage、setForeground(new Color(0, 0, 0));
taUserMessage、setEditable(false); // 不可寫入 Clock 、 java
public class Clock extends JFrame implements ActionListener
{
private static final long serialVersionUID = 67908093L;
Timer timer;
int x,y,old_X,old_Y, r,x0,y0,w,h,ang;
int sdo,mdo,hdo,old_M,old_H;
TimeZone tz =TimeZone、getTimeZone("JST");
final double RAD=Math、PI/180、0;
@SuppressWarnings("deprecation") public Clock()
{
super("[HappyChat]時鐘");
setSize(300,300);
setBackground(new Color(0,0,192));
setResizable(false);
Dimension scr=Toolkit、getDefaultToolkit()、getScreenSize();
Dimension fra=this、getSize();
if(fra、width>scr、width)
{
fra、width=scr、width;
}
if(fra、height>scr、height)
{
fra、height=scr、height;
}
this、setLocation((scr、width-fra、width)/2,(scr、height-fra、height)/2);
show();
int delay = 1000;
ActionListener taskPerformer = new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
repaint();
}
};
new Timer(delay, taskPerformer)、start();
}
public void actionPerformed(ActionEvent e)
{
timer、restart();
}
public void paint( Graphics g )
{
Insets insets = getInsets();
int L0 = (insets、left)/2, T0 = (insets、top)/2;
int hh,mm,ss;
String st;
h=getSize()、height;
g、setColor(Color、white);
g、drawOval(L0+30,T0+30,h-60,h-60);
g、drawOval(L0+32,T0+32,h-64,h-64);
r=h/2-30;
x0=30+r-5+L0;
y0=30+r-5-T0;
ang=60;
for (int i=1; i<=12; i++)
{
x=(int)((r+10)*Math、cos(RAD*ang)+x0);
y=(int)((r+10)*Math、sin(RAD*ang)+y0);
g、drawString(""+i,x,h-y);
ang-=30;
}
x0=30+r+L0; y0=30+r+T0;
Calendar now=Calendar、getInstance();
hh=now、get(Calendar、HOUR_OF_DAY);
mm=now、get(Calendar、MINUTE);
ss=now、get(Calendar、SECOND);
g、setColor(Color、pink);
g、fillRect(L0,T0,60,28);
g、setColor(Color、blue);
if (hh < 10) st="0"+hh;
else st=""+hh;
if (mm < 10) st=st+":0"+mm; else st=st+":"+mm;
if (ss < 10) st=st+":0"+ss; else st=st+":"+ss;
g、drawString(st,L0,T0+25);
sdo=90-ss*6;
mdo=90-mm*6;
hdo=90-hh*30-mm/2;
if (old_X > 0)
{
g、setColor(getBackground());
g、drawLine(x0,y0,old_X,(h-old_Y));
} else
{
old_M=mdo;
old_H=hdo;
}
g、setColor(Color、yellow);
x=(int)((r-8)*Math、cos(RAD*sdo)+x0);
y=(int)((r-8)*Math、sin(RAD*sdo)+y0)-2*T0;
g、drawLine(x0,y0,x,(h-y));
old_X=x;
old_Y=y;
if (mdo != old_M)
{
line(g,old_M,(int)(r*0、7),getBackground());
old_M=mdo;
}
if (hdo != old_H)
{
line(g,old_H,(int)(r*0、5),getBackground());
old_H=hdo;
}
line(g,mdo,(int)(r*0、7),Color、green);
line(g,hdo,(int)(r*0、5),Color、red);
}
public void line(Graphics g, int t, int n, Color c)
{
int [] xp = new int[4];
int [] yp = new int[4];
xp[0]=x0;
yp[0]=y0;
xp[1]=
(int)((n-10)*Math、cos(RAD*(t-4))+x0);
yp[1]=h-(int)((n-10)*Math、sin(RAD*(t-4))+y0);
xp[2]=
(int)( n
*Math、cos(RAD* t
)+x0);
yp[2]=h-(int)( n
*Math、sin(RAD* t
)+y0);
xp[3]=
(int)((n-10)*Math、cos(RAD*(t+4))+x0);
yp[3]=h-(int)((n-10)*Math、sin(RAD*(t+4))+y0);
g、setColor(c);
g、fillPolygon(xp,yp,4);
}
public static void main(String args[])
{
new Clock();
}}
推薦訪問: 軟件工程 實驗 報告上一篇:新整理企業自查報告(1)
下一篇:Junit使用實驗報告
同志們:今天這個大會,是市委全面落實黨要管黨、從嚴治黨要求的一項重大舉措,也是對縣市區委書記履行基層黨建工作第一責任人情況的一次集中檢閱,同時是對全市基層黨建工作的一次再部署、再落實的會議。前面,**
***年,我認真履行領班子、帶隊伍、抓黨員、保穩定的基層黨建工作思路,以學習貫徹習近平新時代中國特色社會主義思想和黨的十九大歷次全會精神為主線,以市局基層黨建工作考核細則為落腳點,落實全面從嚴治黨主體
根據會議安排,現將2022年履行抓基層黨建工作職責情況報告如下:一、履職工作特色和亮點1 突出政治建設,著力在思想認識上提高。牢固樹立抓黨建就是抓政績的理念,以“黨建工作抓引領、社區治理求突破,為民服
2022年以來,在**黨委的正確領導下,堅持以習近平新時代中國特色社會主義思想為指導,深入學習宣傳貫徹黨的二十大精神,以黨建工作為統領,扎實開展夯實“三個基本”活動,以“四化四力”行動為抓手,聚力創建
各位領導,同志們:根據會議安排,現就2022年度抓基層黨建工作情況匯報如下:一、主要做法及成效(一)強化政治引領。一是不斷強化理論武裝。堅持通過黨組會、中心組學習會和“三會一課”,第一時間、第一議題學
2022年度抓基層黨建工作述職報告按照黨委工作部署,現將本人2022年度抓基層黨建工作情況報告如下:一、2022年度抓基層黨建工作情況(一)旗幟鮮明講政治將旗幟鮮明講政治放在全局發展首要位置,積極開展
2022年,是我在數計系黨總支書記這個新崗位上度過的第一個完整的工作年度。回首一年來在校黨委的正確領導下,與數計系領導班子和全體師生共同走過的日子,艱辛歷歷在目,收獲溫潤心田。作為黨總支書記,我始終牢
按照考核要求,現將本人一年來,作為統戰部長履行職責、廉潔自律等方面情況報告如下:一、著眼增強政治素質,不斷深化理論學習堅持把旗幟鮮明講政治作為履職從政的第一位要求,帶領統戰系統干部堅決擁護“兩個確立”
**年,緊緊圍繞黨工委、管委會的決策部署,全體人員團結協作、凝心聚力,緊扣黨工委“**”基本工作思路,全力開拓進取,認真履職盡責,圓滿完成各項工作任務。一、個人思想政治狀況檸檬文苑www bgzjy
按照縣委關于開展抓基層黨建述職評議會議的有關要求,經請示縣委組織部同意,今天,我們在此召開2022年度基層黨組織書記抓基層黨建述職評議會議。1 首先,請**黨委書記,**同志述職。**黨委能夠主動研究