JAVA入門到精通-第89講-山寨QQ專案3-聊天介面.物件流
阿新 • • 發佈:2018-12-01
當點選某一個好友出現聊天的介面:
文字域: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的各種格式;
來自為知筆記(Wiz)
文字域: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]伺服器原始碼
x1
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 1package 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]客戶端原始碼
x1
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 1package 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)