一、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