打赏

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




















posted on 2018-12-01 00:37  XuCodeX  阅读(431)  评论(0编辑  收藏  举报

导航