JAVA入门到精通-第89讲-山寨QQ项目3-聊天界面.对象流

当点击某一个好友出现聊天的界面:
1167156-20181201003716734-293610586.png

1167156-20181201003717131-1703707148.png

文本域:JTextArea
1167156-20181201003717360-483684329.png

1167156-20181201003717704-354057121.png

-------------------------------------------
更改窗口小图标:
this.setIconImage
((new ImageIcon("image/qq.gif").getImage()));
1167156-20181201003717928-1817509983.png

1167156-20181201003718276-698615801.png

----------------------
显示“和谁聊天”传参数进来String friend;
1167156-20181201003718702-1138773732.png

1167156-20181201003719118-795410798.png

1167156-20181201003719333-1627019794.png

---------------------------
传参数 new QqChat (friendNo);
1167156-20181201003719972-1409186800.png
1167156-20181201003720619-1380690335.png
---------------------------------
登录界面-好友列表界面
1167156-20181201003721186-1833276042.png
把登录请求发送给后台服务器,
服务器进行 验证,正确,通过,进入好友列表界面;
否则,出错提示;
理论上到数据库验证;
1167156-20181201003721780-149164282.png

1167156-20181201003722421-1095224587.png

-------------------
-QqServer
-com.qq.server.view
-com.qq.server.model
-com.qq.server.tools
-com.qq.common
1167156-20181201003722652-241064385.png

-QQserver服务器端控制界面
1167156-20181201003723217-434455388.png
选项卡;

1167156-20181201003723475-2095614673.png

1167156-20181201003723737-1194801323.png

1167156-20181201003724153-394323387.png

-model建MyQqServer类,QQ服务器
 它在监听,等待某个QQ客户端来连接
1167156-20181201003724366-1455485032.png

1167156-20181201003724662-2130985882.png
首先是一个构造函数:public MyQqServer()
监听,在哪个机子上启动,在哪个机子上监听;

-以对象流方式处理ObjectInputStream

客户端发送号码、密码,看成一个对象user;
认为是一个对象在网络上传输,
以对象为单位进行接收;
软件公司一般以XML格式传递;
1167156-20181201003725374-1325895844.png
1167156-20181201003725671-1988719747.png

1167156-20181201003725960-868567394.png

readObject ( );
User u=(User) ois.readObject ();
1167156-20181201003726472-1500370959.png

-User对象需要在公用包common中定义:
1167156-20181201003726713-414779323.png
在客户端、服务器端都需要声明;不声明是不行的;
1167156-20181201003727063-1192200713.png

1167156-20181201003727537-1759457637.png
User的结构和属性都需要定义、声明;
没有的话是不能通讯的;

1167156-20181201003727845-222291713.png
writeObject(u);传送对象;

服务器端读取:
1167156-20181201003728106-2137923996.png

-JAVA对象的序列化Serializable:
对象保存在文件,或放在网络上传输需要 序列化
1167156-20181201003728468-246478556.png
只需要实现一个接口就行了
1167156-20181201003728732-252967779.png
implements  java.io.Serializable
JAVA的反射机制达到这个目的的;

一个对象通过序列化是可以在网络上传输的,
这样可以不用考虑message的各种格式;



补充讲解:

如何在网络间传递对象?

[MyServer.java]服务器源代码

package com.test.server; import java.io.ObjectInputStream; import java.net.ServerSocket; import java.net.Socket; import com.common.User; public class MyServer { ServerSocket ss; Socket s; ObjectInputStream ois; public static void main(String[] args) { new MyServer(); } //构造函数 public MyServer(){ try { ss=new ServerSocket(3456); s=ss.accept(); //以对象流的方式读取(假设客户端发送的是User的一个对象) ois=new ObjectInputStream(s.getInputStream()); User u=(User)ois.readObject(); //输出 System.out.println(u.getName()+"\t"+u.getPasswd()); } catch (Exception e) { e.printStackTrace(); }finally{ try { if(ois!=null) ois.close(); if(s!=null) s.close(); if(ss!=null) ss.close(); } catch (Exception e2) { e2.printStackTrace(); } } } }
public class MyServer { ServerSocket ss; Socket s; ObjectInputStream ois; public static void main(String[] args) { new MyServer(); } //构造函数 public MyServer(){ try { ss=new ServerSocket(3456); s=ss.accept(); //以对象流的方式读取(假设客户端发送的是User的一个对象) ois=new ObjectInputStream(s.getInputStream()); User u=(User)ois.readObject(); //输出 System.out.println(u.getName()+"\t"+u.getPasswd());
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]服务端的公共服务

package com.common; import java.io.Serializable; public class User implements Serializable{ private String name; private String passwd; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPasswd() { return passwd; } public void setPasswd(String passwd) { this.passwd = passwd; } }
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]客户端源代码

package com.test.client; import java.io.ObjectOutputStream; import java.net.Socket; import com.common.User; public class MyClient { Socket s; ObjectOutputStream oos; public static void main(String[] args) { new MyClient(); } //构造函数 public MyClient(){ try { s=new Socket("127.0.0.1",3456); //通过ObjectOutputStream给服务器传送对象 oos=new ObjectOutputStream(s.getOutputStream()); User u=new User(); u.setName("张三"); u.setPasswd("123"); oos.writeObject(u); } catch (Exception e) { e.printStackTrace(); }finally{ try { if(oos!=null) oos.close(); if(s!=null) s.close(); } catch (Exception e2) { e2.printStackTrace(); } } } }
public class MyClient { Socket s; ObjectOutputStream oos; public static void main(String[] args) { new MyClient(); } //构造函数 public MyClient(){ try { s=new Socket("127.0.0.1",3456); //通过ObjectOutputStream给服务器传送对象 oos=new ObjectOutputStream(s.getOutputStream()); User u=new User(); u.setName("张三"); u.setPasswd("123"); oos.writeObject(u);
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]客户端的公共服务

package com.common; import java.io.Serializable; //通过io在网络上传送对象需要进行序列化Serializable public class User implements Serializable{ private String name; private String passwd; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPasswd() { return passwd; } public void setPasswd(String passwd) { this.passwd = passwd; } }
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序列化,否则报错。




















转载于:https://www.cnblogs.com/xuxaut-558/p/10047900.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值