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在网络上传送对象需要进行序列化Serializable5
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序列化,否则报错。




浙公网安备 33010602011771号