第一步:再次新建一个 java project,再增加一个类,多线程类,重写父类的run方法,实现处理用户的请求,如下图所示:
第二步:增加ServerThread类的代码如下:
package com.socket.Thread; 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; import com.socket.entity.User; /** * 线程类 * * @author lfc * */ public class ServerThread extends Thread { // 创建一个和本线程相关的socket Socket socket = null; //当创建一个线程的时候,创建一个socket public ServerThread(Socket socket){ this.socket=socket; } //启动线程,重写父类的方法 public void run(){ System.out.println("服务器端准备好监听客户端的请求了。。。"); try { // 3:获得输入流 InputStream is = socket.getInputStream(); // 包装下变成字符流,实现可以对对象进行反序列话操作 ObjectInputStream ois=new ObjectInputStream(is); //创建输出流,用来给客户端提示的响应信息 OutputStream os = socket.getOutputStream(); PrintWriter pw = new PrintWriter(os); // 4:读取对象,获得对象 User user=(User)ois.readObject(); System.out.println("编号:"+user.getId()); System.out.println("年龄:"+user.getAge()); System.out.println("姓名:"+user.getName()); System.out.println("密码:"+user.getPassword()); //给客户端的回应信息 String response="客户端已经收到你们的信息了,Success"; pw.write(response); pw.flush(); // 5:关闭资源,注意,关闭的时候,要从底部开始往上依次关闭,顺序不能错! os.close(); pw.close(); ois.close(); is.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
第三步,User类的代码请看前面的socket二中的代码,没有修改。
第四步,修改SocketServer的服务端的代码后如下:
package com.socket.server; 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; import com.socket.Thread.ServerThread; import com.socket.entity.User; /** * 服务器端 * * @author lfc 对于这个客户端以及服务端,运行的时候,必须先服务端开始运行起来,开始监听客户端的程序请求 * 缺点:如果是登录程序中只能监听一个用户登录程序就会进入死亡转态了 * 为了解决多用户能够同时进行请求,需要用多线程序来改造代码 */ public class SocketServer { public static void main(String[] args) { try { // 1:创建一个服务端的ServerScoket,绑定端口开始监听 ServerSocket serverScoket = new ServerSocket(8800); // 2:使用accept()方法阻塞等待连接,获得新的连接 Socket socket = null; //加入一个统计来自客户端的请求的数目 int num=0; //一直处于监听的运行转态 while (true) { socket=serverScoket.accept(); ServerThread serverThread=new ServerThread(socket); //启动线程 serverThread.start(); num++; System.out.println("客户端请求的次数为:"+num); } } catch (IOException e) { e.printStackTrace(); } } }
第五步:客户端的代码 loginClient代码没有修改,请查看前面的socket二中的客户端的代码:
第六步:运行服务器端的代码:如下图所示,服务器处于监听转态:
第七步,运行客户端的代码,如下图所示
第八步,此时再次查看服务器端打印出来的内容如下图所示:
第九步,我们修改客户端的User的名字为jack 密码也修改下,然后运行一次客户端的代码,再次查看服务器端的输出内容:
到此为止,我们就实现了利用socket面向对象编程,并且实现对用户同时发送请求,如果还想要好玩点,可以把服务器端的代码放到另外的一台电脑上运行,多个客户端在电脑上,同时发送请求,主要修改的地方时,客户端发送请求的ip要需改为对应服务器端电脑的ip地址即可。