一、socket通訊原理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; } }
三、建立服務端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 = serverSocket.accept(); // 得到輸入流 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(); serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
四、建立客戶端socket
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("Tom"); user.setPassword("123456"); 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(); } } }
運行結果:this
服務端:spa
用戶信息:Tom 123456.net
客戶端:code
我是客戶端,服務端響應是:welcomeserver