一、序列化對象java
package com.ljb.app.socket; import java.io.Serializable; /** * 用戶類(實現序列化) * @author LJB * @version 2015年3月12日 */ public class User implements Serializable{ private String name; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
二、客戶端服務器
package com.ljb.app.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; /** * 客戶端(模擬客戶登錄並接收服務端響應信息) * @author LJB * @version 2015年3月11日 */ public class LoginClient { /** * @param args */ public static void main(String[] args) { try { // 創建客戶端Socket鏈接,指定服務器的位置以及端口 Socket socket = new Socket("localhost",8800); // 獲得Socket的讀寫流 OutputStream os = socket.getOutputStream(); // 對對象進行序列化操做 ObjectOutputStream oos = new ObjectOutputStream(os); // 獲取輸入流 InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); // 進行寫操做 User user = new User(); user.setName("Tom2"); user.setPassword("1234567"); oos.writeObject(user); socket.shutdownOutput(); // 接收服務端響應 String reply = null; while (!((reply = br.readLine()) == null)) { System.out.println("我是客戶端,服務端響應是:" + reply); } // 關閉流 br.close(); is.close(); oos.close(); os.close(); socket.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
三、服務端app
package com.ljb.app.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.ObjectInputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; /** * 服務端(接收客戶端登錄信息並給出響應) * @author LJB * @version 2015年3月11日 */ public class LoginServer { /** * @param args */ public static void main(String[] args) { try { // 創建一個服務器綁定指定端口Socket(ServerSocket)並開始監聽 ServerSocket serverSocket = new ServerSocket(8800); // 使用accept()方法阻塞等待監聽,得到新的鏈接 Socket socket = null; // 客戶數量 int num = 0; // 持續監聽 while (true) { socket = serverSocket.accept(); ServerThread serverThread = new ServerThread(socket); serverThread.start(); num++; System.out.println("客戶數量爲:" + num); // 客戶的IP信息 InetAddress is = socket.getInetAddress(); // 客戶的IP地址 String ip = is.getHostAddress(); System.out.println("客戶的IP地址:" + ip); // 客戶的主機名稱 String hostname = is.getHostName(); System.out.println("客戶名稱爲:" + hostname); } } catch (IOException e) { e.printStackTrace(); } } }
四、服務端線程socket
package com.ljb.app.socket; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; /** * 建立服務端線程,持續響應客戶請求 * @author LJB * @version 2015年3月12日 */ public class ServerThread extends Thread { Socket socket = null; public ServerThread (Socket socket) { this.socket = socket; } // 響應客戶請求 public void run () { try { // 得到輸入流 InputStream is = socket.getInputStream(); // 得到流,能夠對對象進行反序列化 ObjectInputStream ois = new ObjectInputStream(is); // 得到輸出流 OutputStream os = socket.getOutputStream(); PrintWriter pw = new PrintWriter(os); // 讀取用戶輸入信息 User user = (User)ois.readObject(); System.out.println("用戶信息:" + user.getName() + " " + user.getPassword()); // 響應信息 String reply = "welcome"; pw.write(reply); pw.flush(); // 關閉流 pw.close(); os.close(); ois.close(); is.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
客戶端傳遞兩個不一樣的對象this
運行結果:spa
客戶端:.net
我是客戶端,服務端響應是:welcome線程
服務端:code
客戶數量爲:1
用戶信息:Tom 123456
客戶數量爲:2
用戶信息:Tom2 1234567
server