1.Socket实现多客户端用户登陆
对于多用户自然就需要用到多线程去处理了,因而需要在服务器端创建一个专门负责监听的应用主服务程序、一个专门负责响应的线程程序。
实现步骤:
1.创建服务器端线程类,run()方法中实现对一个请求的响应处理。
2.修改服务端的代码,实现一直监听状态。
3.服务器端每监听到一个请求,创建一个线程对象,启动。
2.服务端实现代码
public class LoginThread extends Thread {
Socket socket = null;
// 每启动一个线程,连接对应的Socket
public LoginThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
super.run();
try {
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
ObjectInputStream ois = new ObjectInputStream(is);
UserBean user = (UserBean) ois.readObject();
if (user != null) {
System.out.println("我是服务器,客户登录信息是:" + user.getName() + ",密码是:" + user.getPassword());
}
String reply = "欢迎" + user.getName() + ",登陆成功";
os.write(reply.getBytes());
ois.close();
os.close();
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(8800);
Socket socket = null;
while (true) {
socket = serverSocket.accept();
LoginThread thread = new LoginThread(socket);
thread.start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.客户端代码
相比第一节有所修改
public class UserClient {
private static String name;
private static String pwd;
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost", 8800);
OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
// 如果有登陆界面 登陆信息直接从界面获取
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名:");
name = scanner.nextLine();
System.out.println("请输入密码:");
pwd = scanner.nextLine();
UserClient user = new UserClient();
UserBean bean = user.getUserInfo(name, pwd);
oos.writeObject(bean);
socket.shutdownOutput();
// 接收服务器端的响应
String reply = null;
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while ((reply = br.readLine()) != null) {
System.out.println("我是客户端,服务器的响应是:" + reply);
}
scanner.close();
os.close();
is.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 验证是否有此用户
*
* @param name
* @param pwd
*/
public UserBean getUserInfo(String name, String pwd) {
// UserDao操作验证用户(此处省略)
// 由于没有数据库 所以此处需要将用户信息暂时放在bean当中
UserBean user = new UserBean(name, pwd);
user.setName(name);
user.setPassword(pwd);
return user;
}
}