? 在基于C/S模式下的Java編程中大多用到各種IO流的操作,ObjectStream(對(duì)象流)是其中的一種。
? 下面這個(gè)列子說(shuō)明Java對(duì)象流在C/S模式下的使用優(yōu)于字節(jié)流:
?
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("帳號(hào):");
??? 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("服務(wù)器正在監(jiān)聽……");
???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都有一個(gè)相同的包名(com.test.common)和一個(gè)相同的類。(User.java)。這是實(shí)現(xiàn)服務(wù)器端和客戶端實(shí)例一個(gè)User對(duì)象的過(guò)程。User在實(shí)例化的同時(shí)也被 Java.io.Serializable 序列化。
????? 用了對(duì)象流就可以直接用User中的get方法中取得相應(yīng)的值,不用像字節(jié)流還要去readLine后再去使用分隔符。
????? 這是在我知識(shí)范圍內(nèi)的一種見解。希望大家指出不足!
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
