一、序列化对象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