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序列化,否则报错。