当点击某一个好友出现聊天的界面:
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003716734-293610586.png)
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003717131-1703707148.png)
文本域:JTextArea
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003717360-483684329.png)
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003717704-354057121.png)
-------------------------------------------
更改窗口小图标:
this.setIconImage
((new ImageIcon("image/qq.gif").getImage()));
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003717928-1817509983.png)
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003718276-698615801.png)
----------------------
显示“和谁聊天”传参数进来String friend;
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003718702-1138773732.png)
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003719118-795410798.png)
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003719333-1627019794.png)
---------------------------
传参数new QqChat (friendNo);
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003720619-1380690335.png)
---------------------------------
登录界面-好友列表界面
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003721186-1833276042.png)
把登录请求发送给后台服务器,
服务器进行 验证,正确,通过,进入好友列表界面;
否则,出错提示;
理论上到数据库验证;
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003721780-149164282.png)
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003722421-1095224587.png)
-------------------
-QqServer
-com.qq.server.view
-com.qq.server.model
-com.qq.server.tools
-com.qq.common
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003722652-241064385.png)
-QQserver服务器端控制界面
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003723217-434455388.png)
选项卡;
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003723475-2095614673.png)
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003723737-1194801323.png)
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003724153-394323387.png)
-model建MyQqServer类,QQ服务器
它在监听,等待某个QQ客户端来连接
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003724366-1455485032.png)
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003724662-2130985882.png)
首先是一个构造函数:public MyQqServer()
监听,在哪个机子上启动,在哪个机子上监听;
-以对象流方式处理ObjectInputStream
客户端发送号码、密码,看成一个对象user;
认为是一个对象在网络上传输,
以对象为单位进行接收;
软件公司一般以XML格式传递;
readObject ( );
User u=(User) ois.readObject ();
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003726472-1500370959.png)
-User对象需要在公用包common中定义:
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003726713-414779323.png)
在客户端、服务器端都需要声明;不声明是不行的;
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003727063-1192200713.png)
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003727537-1759457637.png)
User的结构和属性都需要定义、声明;
没有的话是不能通讯的;
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003727845-222291713.png)
writeObject(u);传送对象;
服务器端读取:
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003728106-2137923996.png)
-JAVA对象的序列化Serializable:
对象保存在文件,或放在网络上传输需要序列化
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003728468-246478556.png)
只需要实现一个接口就行了
![](https://img2018.cnblogs.com/blog/1167156/201812/1167156-20181201003728732-252967779.png)
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()+" "+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序列化,否则报错。