1. 程式人生 > >JAVA入門到精通-第89講-山寨QQ專案3-聊天介面.物件流

JAVA入門到精通-第89講-山寨QQ專案3-聊天介面.物件流

當點選某一個好友出現聊天的介面:

文字域:JTextArea

------------------------------------------- 更改視窗小圖示: this.setIconImage ((new ImageIcon("image/qq.gif").getImage()));

---------------------- 顯示“和誰聊天”傳引數進來String friend;


--------------------------- 傳引數 new QqChat (friendNo);
--------------------------------- 登入介面-好友列表介面 把登入請求傳送給後臺伺服器, 伺服器進行 驗證,正確,通過,進入好友列表介面; 否則,出錯提示; 理論上到資料庫驗證;

------------------- -QqServer -com.qq.server.view -com.qq.server.model -com.qq.server.tools -com.qq.common
-QQserver伺服器端控制介面
選項卡;



-model建MyQqServer類,QQ伺服器  它在監聽,等待某個QQ客戶端來連線
首先是一個建構函式:public MyQqServer() 監聽,在哪個機子上啟動,在哪個機子上監聽;
-以物件流方式處理ObjectInputStream
客戶端傳送號碼、密碼,看成一個物件user; 認為是一個物件在網路上傳輸, 以物件為單位進行接收; 軟體公司一般以XML格式傳遞;

readObject ( ); User u=(User) ois.readObject ();

-User物件需要在公用包common中定義: 在客戶端、伺服器端都需要宣告;不宣告是不行的;
User的結構和屬性都需要定義、宣告; 沒有的話是不能通訊的;
writeObject(u);傳送物件;
伺服器端讀取:
-JAVA物件的序列化Serializable: 物件儲存在檔案,或放在網路上傳輸需要 序列化 只需要實現一個介面就行了 implements  java.io.Serializable JAVA的反射機制達到這個目的的;
一個物件通過序列化是可以在網路上傳輸的, 這樣可以不用考慮message的各種格式;


補充講解:

如何在網路間傳遞物件?

[MyServer.java]伺服器原始碼

x
1
package com.test.server;
2
 
3
import java.io.ObjectInputStream;
4
import java.net.ServerSocket;
5
import java.net.Socket;
6
import com.common.User;
7
 
8
public class MyServer {
9
    ServerSocket ss;
10
    Socket s;
11
    ObjectInputStream ois;
12
   
13
    public static void main(String[] args) {
14
        new MyServer();
15
    }
16
   
17
    //建構函式
18
    public MyServer(){
19
        try {
20
            ss=new ServerSocket(3456);
21
            s=ss.accept();
22
            //以物件流的方式讀取(假設客戶端傳送的是User的一個物件)
23
            ois=new ObjectInputStream(s.getInputStream());
24
            User u=(User)ois.readObject();
25
            //輸出
26
            System.out.println(u.getName()+"\t"+u.getPasswd());
27
           
28
        } catch (Exception e) {
29
            e.printStackTrace();
30
        }finally{
31
            try {
32
                if(ois!=null) ois.close();
33
                if(s!=null) s.close();
34
                if(ss!=null) ss.close();
35
            } catch (Exception e2) {
36
                e2.printStackTrace();
37
            }
38
        }
39
    }
40
}

[User.java]服務端的公共服務

20 20   1
package com.common;
2
 
3
import java.io.Serializable;
4
 
5
public class User implements Serializable{
6
    private String name;
7
    private String passwd;
8
    public String getName() {
9
        return name;
10
    }
11
    public void setName(String name) {
12
        this.name = name;
13
    }
14
    public String getPasswd() {
15
        return passwd;
16
    }
17
    public void setPasswd(String passwd) {
18
        this.passwd = passwd;
19
    }
20
}

[MyClient.java]客戶端原始碼

x
1
package com.test.client;
2
 
3
import java.io.ObjectOutputStream;
4
import java.net.Socket;
5
import com.common.User;
6
 
7
public class MyClient {
8
    Socket s;
9
    ObjectOutputStream oos;
10
   
11
    public static void main(String[] args) {
12
        new MyClient();
13
    }
14
 
15
    //建構函式
16
    public MyClient(){
17
        try {
18
            s=new Socket("127.0.0.1",3456);
19
            //通過ObjectOutputStream給伺服器傳送物件
20
            oos=new ObjectOutputStream(s.getOutputStream());
21
            User u=new User();
22
            u.setName("張三");
23
            u.setPasswd("123");
24
            oos.writeObject(u);
25
        } catch (Exception e) {
26
            e.printStackTrace();
27
        }finally{
28
            try {
29
                if(oos!=null) oos.close();
30
                if(s!=null) s.close();
31
            } catch (Exception e2) {
32
                e2.printStackTrace();
33
            }
34
        }
35
    }
36
}

[User.java]客戶端的公共服務

21   1
package com.common;
2
 
3
import java.io.Serializable;
4
//通過io在網路上傳送物件需要進行序列化Serializable
5
public class User implements Serializable{
6
    private String name;
7
    private String passwd;
8
   
9
    public String getName() {
10
        return name;
11
    }
12
    public void setName(String name) {
13
        this.name = name;
14
    }
15
    public String getPasswd() {
16
        return passwd;
17
    }
18
    public void setPasswd(String passwd) {
19
        this.passwd = passwd;
20
    }
21
}

特別說明:

java網路程式設計需要通過IO流實現物件的傳遞需要對,服務端和客戶端定義相同的傳遞對對向方法,以達到實現物件的傳遞。同時需要對方法進行Serializable序列化,否則報錯。


















來自為知筆記(Wiz)