在基于C/S模式下的Java编程中大多用到各种IO流的操作,ObjectStream(对象流)是其中的一种。
下面这个列子说明Java对象流在C/S模式下的使用优于字节流:
TestClient.java
package com.test.Client;
import java.awt.*;
import java.awt.event.*;
import com.test.conServer.*;
import javax.swing.*;
import com.test.common.*;
public class TestClient extends JFrame implements ActionListener
{
JLabel jl1,jl2;
JButton jb1,jb2;
JTextField jtf1;
JPasswordField jpf;
public static void main(String[] args) {
// TODO Auto-generated method stub
TestClient tc=new TestClient();
}
public TestClient()
{
jl1=new JLabel("帐号:");
jl2=new JLabel("密码:");
jb1=new JButton("登陆");
jb1.addActionListener(this);
jb2=new JButton("取消");
jb2.addActionListener(this);
jtf1=new JTextField(10);
jpf=new JPasswordField(10);
this.setLayout(new FlowLayout());
this.add(jl1);
this.add(jtf1);
this.add(jl2);
this.add(jpf);
this.add(jb1);
this.add(jb2);
this.setSize(180, 130);
this.setLocation(200, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setIconImage(new ImageIcon("images/QQ.jpg").getImage());
this.setVisible(true);
}
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
if(arg0.getSource()==jb1)
{
/*User u=new User();
u.setUserID(jtf1.getText());
u.setUserPwd(new String(jpf.getPassword()));
*/
TestCreateUser tcu=new TestCreateUser(jtf1.getText(),new String(jpf.getPassword()));
//TestClientConServer tccs=new TestClientConServer(u);
}
if(arg0.getSource()==jb2)
{
System.exit(0);
}
}
}
User.java
package com.test.common;
public class User implements java.io.Serializable {
private String userID;
private String userPwd;
public String getUserID() {
return userID;
}
public void setUserID(String userID) {
this.userID = userID;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
}
TestClientConServer.java
package com.test.conServer;
import java.io.*;
import java.net.*;
import com.test.common.*;
public class TestClientConServer {
public TestClientConServer(Object o)
{
try{
Socket s=new Socket("127.0.0.1",9999);
ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream());
oos.writeObject(o);
}catch(Exception e){
e.printStackTrace();
}
}
}
TestCreateUser .java
package com.test.conServer;
import com.test.common.*;
public class TestCreateUser {
public TestCreateUser(String userID,String userPwd)
{
User u=new User();
u.setUserID(userID);
u.setUserPwd(userPwd);
TestClientConServer tccs=new TestClientConServer(u);
}
}
TestServer.java
package com.test.Server;
import java.io.*;
import java.net.*;
import com.test.common.*;
public class TestServer {
public static void main(String arg[]) throws ClassNotFoundException
{
TestServer ts=new TestServer();
}
public TestServer() throws ClassNotFoundException
{
try {
System.out.print("服务器正在监听……");
ServerSocket ss=new ServerSocket(9999);
Socket s=ss.accept();
ObjectInputStream ois=new ObjectInputStream(s.getInputStream());
User u=(User) ois.readObject();
System.out.print(u.getUserID()+u.getUserPwd());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
在上图中可以看出Server和Client都有一个相同的包名(com.test.common)和一个相同的类。(User.java)。这是实现服务器端和客户端实例一个User对象的过程。User在实例化的同时也被 Java.io.Serializable 序列化。
用了对象流就可以直接用User中的get方法中取得相应的值,不用像字节流还要去readLine后再去使用分隔符。
这是在我知识范围内的一种见解。希望大家指出不足!