需求说明:实现多客户端用户登录,实现多客户端登录一般都需要使用线程技术:
(1)创建服务器端线程类,run()方法中实现对一个请求的响应处理;
(2)修改服务器端代码,实现循环监听状态;
(3)服务器端每监听到一个请求,创建一个处理线程;
关于Socket与SocketServer介绍我这里不多说了,网上很多资料,这里推荐一个
http://www.cnblogs.com/rond/p/3565113.html
代码如下:
1、用户类
package com.j02.d04; import java.io.Serializable; /* * 使用对象的思想进行客户端与服务端的通信 */ public class User implements Serializable{ private String name; private String pwd; public User() { super(); } public User(String name, String pwd) { super(); this.name = name; this.pwd = pwd; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } }
2、服务器类
package com.j02.d04; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.ObjectInputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) { ServerSocket server=null; Socket socket=null; User user=new User(); try { //创建ServerSocket端口 server=new ServerSocket(9001); //创建通信连接 while(true){ socket=server.accept(); //创建线程执行响应操作 ServerThread st=new ServerThread(socket); st.start(); } } catch (IOException e) { e.printStackTrace(); } } }
3、服务器线程类
package com.j02.d04; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; /* * 服务端的线程,处理多个客户端请求 */ public class ServerThread extends Thread{ //定义一个客户端socket private Socket socket; public ServerThread(){ } public ServerThread(Socket socket){ this.socket=socket; } //执行响应输出操作 public void run() { try { //获取客户端的输出流 InputStream is=socket.getInputStream(); ObjectInputStream ois=new ObjectInputStream(is); User user=(User)ois.readObject(); System.out.println("我是服务器,接收到客户端的信息是:"+user.getName()+"------"+user.getPwd()); //输出给客户端的响应 String reply="登陆成功!"; OutputStream os=socket.getOutputStream(); BufferedWriter oos=new BufferedWriter(new OutputStreamWriter(os)); oos.write(reply); oos.flush(); //关闭流 oos.close(); os.close(); ois.close(); is.close(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
4、客户端1
package com.j02.d04; 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.net.Socket; import java.net.UnknownHostException; /* * 客户端 */ public class Client { public static void main(String[] args) { Socket socket=null; OutputStream os=null; ObjectOutputStream oos=null; User login=new User("admin","123456"); try { //创建Socket指定访问地址和端口 socket=new Socket("localhost",9001); //获取输出流对象 os=socket.getOutputStream(); oos=new ObjectOutputStream(os); //输出的是对象的值 oos.writeObject(login); //读服务器返回的响应 InputStream is=socket.getInputStream(); BufferedReader br=new BufferedReader(new InputStreamReader(is)); String reply; while((reply=br.readLine())!=null){ System.out.println("我是客户端,服务器返回的响应是:"+reply); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
5、客户端2
package com.j02.d04; 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.net.Socket; import java.net.UnknownHostException; /* * 客户端 */ public class Client2 { public static void main(String[] args) { Socket socket=null; OutputStream os=null; ObjectOutputStream oos=null; User login=new User("kate","4rfv%TGB"); try { //创建Socket指定访问地址和端口 socket=new Socket("localhost",9001); //获取输出流对象 os=socket.getOutputStream(); oos=new ObjectOutputStream(os); //输出的是对象的值 oos.writeObject(login); //读服务器返回的响应 InputStream is=socket.getInputStream(); BufferedReader br=new BufferedReader(new InputStreamReader(is)); String reply; while((reply=br.readLine())!=null){ System.out.println("我是客户端,服务器返回的响应是:"+reply); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
运行:先运行服务器类-客户端1-客户端2
然后在小电脑那里选择服务器类执行:
结果:
其它知识点补充:
获取客户机的IP地址
在线程那个类中添加代码:
//获取客户端的IP地址 InetAddress adress=socket.getInetAddress();//socket这个方法是获取一个返回套接字连接的地址。它返回的是一个此套接字连接到的远程 IP 地址 String ip=adress.getHostAddress();//InetAddress 套接字的类可以通过getHostName()方法获取获取此 IP 地址的主机名。 System.out.println("请求的客户机ip地址是:"+ip);
结果如下: