本文地址:http://blog.csdn.net/kongxx/article/details/7259827
Java Socket實戰之一 單線程通訊
Java Socket實戰之二 多線程通訊
前面兩篇文章介紹了怎樣建立Java Socket通訊,這一篇說一下怎樣使用Java Socket來傳輸對象。
首先需要一個普通的對象類,由於需要序列化這個對象以便在網路上傳輸,所以實現java.io.Serializable介面就是必不可少的了,入下:
package com.googlecode.garbagecan.test.socket.sample3;</p><p>public class User implements java.io.Serializable {<br />private static final long serialVersionUID = 1L;<br />private String name;<br />private String password;</p><p>public User() {</p><p>}</p><p>public User(String name, String password) {<br />this.name = name;<br />this.password = password;<br />}</p><p>public String getName() {<br />return name;<br />}</p><p>public void setName(String name) {<br />this.name = name;<br />}</p><p>public String getPassword() {<br />return password;<br />}</p><p>public void setPassword(String password) {<br />this.password = password;<br />}<br />}對於Server端的代碼,代碼中分別使用了ObjectInputStream和ObjectOutputStream來接收和發送socket中的InputStream和OutputStream,然後轉換成Java對象,如下:
package com.googlecode.garbagecan.test.socket.sample3;</p><p>import java.io.*;<br />import java.net.ServerSocket;<br />import java.net.Socket;<br />import java.util.logging.Level;<br />import java.util.logging.Logger;</p><p>public class MyServer {</p><p>private final static Logger logger = Logger.getLogger(MyServer.class.getName());</p><p>public static void main(String[] args) throws IOException {<br />ServerSocket server = new ServerSocket(10000);</p><p>while (true) {<br />Socket socket = server.accept();<br />invoke(socket);<br />}<br />}</p><p>private static void invoke(final Socket socket) throws IOException {<br />new Thread(new Runnable() {<br />public void run() {<br />ObjectInputStream is = null;<br />ObjectOutputStream os = null;<br />try {<br />is = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));<br />os = new ObjectOutputStream(socket.getOutputStream());</p><p>Object obj = is.readObject();<br />User user = (User)obj;<br />System.out.println("user: " + user.getName() + "/" + user.getPassword());</p><p>user.setName(user.getName() + "_new");<br />user.setPassword(user.getPassword() + "_new");</p><p>os.writeObject(user);<br />os.flush();<br />} catch (IOException ex) {<br />logger.log(Level.SEVERE, null, ex);<br />} catch(ClassNotFoundException ex) {<br />logger.log(Level.SEVERE, null, ex);<br />} finally {<br />try {<br />is.close();<br />} catch(Exception ex) {}<br />try {<br />os.close();<br />} catch(Exception ex) {}<br />try {<br />socket.close();<br />} catch(Exception ex) {}<br />}<br />}<br />}).start();<br />}<br />}Client也和Server端類似,同樣使用ObjectOutputStream和ObjectInputStream來處理,如下:
package com.googlecode.garbagecan.test.socket.sample3;</p><p>import java.io.BufferedInputStream;<br />import java.io.IOException;<br />import java.io.ObjectInputStream;<br />import java.io.ObjectOutputStream;<br />import java.net.Socket;<br />import java.util.logging.Level;<br />import java.util.logging.Logger;</p><p>public class MyClient {</p><p>private final static Logger logger = Logger.getLogger(MyClient.class.getName());</p><p>public static void main(String[] args) throws Exception {<br />for (int i = 0; i < 100; i++) {<br />Socket socket = null;<br />ObjectOutputStream os = null;<br />ObjectInputStream is = null;</p><p>try {<br />socket = new Socket("localhost", 10000);</p><p>os = new ObjectOutputStream(socket.getOutputStream());<br />User user = new User("user_" + i, "password_" + i);<br />os.writeObject(user);<br />os.flush();</p><p>is = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));<br />Object obj = is.readObject();<br />if (obj != null) {<br />user = (User)obj;<br />System.out.println("user: " + user.getName() + "/" + user.getPassword());<br />}<br />} catch(IOException ex) {<br />logger.log(Level.SEVERE, null, ex);<br />} finally {<br />try {<br />is.close();<br />} catch(Exception ex) {}<br />try {<br />os.close();<br />} catch(Exception ex) {}<br />try {<br />socket.close();<br />} catch(Exception ex) {}<br />}<br />}<br />}<br />}最後測試上面的代碼,首先運行Server類,然後運行Client類,就可以分別在Server端和Client端控制台看到接收到的User對象執行個體了。