TCP客户端并发登录
要求:
客户端通过键盘录入用户名。服务端对这个用户名进行校验。
如果该用户存在,在服务端显示xxx,已登陆。并在客户端显示 xxx,欢迎光临。
如果该用户不存在,在服务端显示xxx,尝试登陆。并在客户端显示 xxx,该用户不存在。最多就登录三次。
客户端代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
//客户端套接字
Socket s = new Socket("127.0.0.1",8888);
//带缓冲的reader 获得键盘输入
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
//printwriter 往服务端写内容
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
//s.getInputStream() 获得服务端的响应
BufferedReader bufi = new BufferedReader(new InputStreamReader(s.getInputStream()));
//循环
for(int i = 0;i < 3;i++) {
String line = bufr.readLine();
if(line == null) {
break;
}
out.println(line);//打印服务端响应的内容
String info = bufi.readLine();
System.out.println("info:" + info);
if(info.contains("欢迎")) {
break;
}
}
bufr.close();
s.close();
}
}
服务端代码:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
class UserThread implements Runnable{
private Socket s;
public UserThread(Socket s) {
this.s = s;
}
@Override
public void run() {
//获取ip
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip + "....连接进来");
try {
int i = 0;
while((i++) <= 2) {
//获得客户端写的用户名
BufferedReader bufin = new BufferedReader(new InputStreamReader(s.getInputStream()));
//接收客户端名字
String name = bufin.readLine();
if(name == null) {
break;
}
BufferedReader bufr = new BufferedReader(new FileReader("user.txt"));
//打印流 这是往客户端响应内容
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
String line = null;//因为这个变量是可以作为两种情况
boolean flag = false;
while((line = bufr.readLine()) != null) {
//line是读取txt的名字
if(line.equals(name)) {
flag = true;//有这个人
break;
}
}
if(flag) {
System.out.println(name+",已登录");
out.println(name + ",欢迎光临");
}else {
System.out.println(name + ",尝试登录");
out.println(name + ",用户名不存在");
}
}
s.close();
} catch (Exception e) {
System.out.println(e.getMessage());
throw new RuntimeException("校验失败");
}
}
}
public class Server {
public static void main(String[] args) throws IOException {
//服务端套接字
ServerSocket ss = new ServerSocket(8888);
while(true) {
Socket s = ss.accept();
new Thread(new UserThread(s)).start();
}
}
}
最后:
需要创建一个user.txt文档来存储用户的姓名。因为该程序没有注册功能,所以user.txt文档中
必须提前存储姓名,否则程序没法使用。