socket实现用户登陆

需求:
通过客户端键盘录入用户名,实现登录。
服务端对客户端的发送过来的用户名进行校验。
如果该用户存在,服务端显示用户登录,并回馈给客户端欢迎光临。
如果该用户不存在,服务端显示用户尝试登录,并回馈给客户端,该用户不存在。

另外,客户端最多只能尝试登录三次。
服务端也一样作此限定。

效果图(左图为客户端,右图为服务器端):

思路:

客户端:
1,建立socket服务。
2,读取键盘录入。
3,将录入的一个用户名数据通过socket的输出发出,给服务端。
4,发出后,要读取服务端回馈的信息。
5,判断该信息,如果有欢迎字样表示登录成功,用户名输入结束。
因为操作的是文本,所以可以使用字符流。并加上缓冲提高效率。

服务端:
1,建立socket服务。
2,不断获取客户端对象。
3,将客户端对象封装到单独的线程中。
4,限定判断次数。
5,读取本地用户文件列表,对获取的用户名进行校验。
6,根据校验结果给出响应信息。

完整代码:

import java.net.*;
import java.io.*;
/*
 * 客户端:
 */
class  LoginClient
{
	public static void main(String[] args)throws Exception 
	{
		Socket s = new Socket("192.168.137.199",8888);
		//读取键盘录入,获取用户名。
		BufferedReader bufr = 
			new BufferedReader(new InputStreamReader(System.in));

		//对socket输出流进行打印。将录入的用户名发送给服务端。
		PrintWriter out = new PrintWriter(s.getOutputStream(),true);

		//对socket输入流中的数据进行获取,其实就是在获取服务端的回馈信息。
		BufferedReader bufIn = 
				new BufferedReader(new InputStreamReader(s.getInputStream()));

		//客户端值允许录入三次。
		for(int x=0; x<3; x++)
		{
			//从键盘读取一行。
			String username = bufr.readLine();
			if(username==null)
			{
				//s.shutdownOutput();
				break;
			}
			
			//将该行数据打印到socket输出流。
			out.println(username);

			//获取服务端反馈信息。
			String info = bufIn.readLine();
			System.out.println(info);
			if(info.contains("欢迎"))
				break;
		}

		bufr.close();
		s.close();
	}
}

/*
 * 服务器端:
 */
class  LoginServer
{
	public static void main(String[] args) throws Exception
	{
		ServerSocket ss = new ServerSocket(8888);
		while(true)
		{
			Socket s = ss.accept();
			System.out.println(s.getInetAddress().getHostAddress()+".....connected");
			new Thread(new UserThread(s)).start();
		}
	}
}

class UserThread implements Runnable
{
	private Socket s;
	UserThread(Socket s)
	{
		this.s = s;
	}
	public void run()
	{
		try
		{
			for(int x=0; x<3; x++)
			{
				//判断用户名是否为空
				BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
				String name = bufIn.readLine();
				if(name==null)
				{
					System.out.println("程序结束 ");
					break;
				}

				//匹配用户名并实现登陆
				BufferedReader bufr = new BufferedReader(new FileReader("user.txt"));
				String line = null;
				PrintWriter out = new PrintWriter(s.getOutputStream(),true);
				boolean b = false;
				while((line=bufr.readLine())!=null)
				{
					if(line.equals(name))
					{
						b = true;
						break;
					}				
				}
				if(b)
				{
					System.out.println(name+"已登录");
					out.println(name+",欢迎光临");
				}
				else
				{
					System.out.println(name+"尝试登录");
					out.println(name+",用户不存在");
				}
			}
		}
		catch (Exception e)
		{
			System.out.println(e.toString());
		}
		finally
		{
			try
			{
				if(s!=null)
					s.close();
			}
			catch (Exception e)
			{
				System.out.println("close:"+e.toString());
			}
			
		}
	}
}


总结:其实服务器就是类似这样一种程序,当用户请求服务器的时候,它首先会创建socket服务,这样客户端才能连上,第二步把客户端拿到的对象封装成线程,第三步进行数据的传输,服务端底层就是用的这三个技术socket,多线程,io,每个客户端去请求都会做这三个事情,我们就不用去写它了,服务器提供了更简单的对象让你去用。

服务器的作用就一个,不断的去处理客户端的请求并给客户端的请求有相应的应答。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值