socket实现用户登陆 && 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,每个客户端去请求都会做这三个事情,我们就不用去写它了,服务器提供了更简单的对象让你去用。

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

------------------------------------------------------------------------------------------------------------------------

实现思路:

在客户端获取到文件流,将文件流写入到通过socket指定到某服务器的输出流中,在服务器中通过socket获取到输入流,将数据写入到指定的文件夹内,为了提供多用户同时上传,这里需要将在服务器上传客户端的文件操作放在另开启一个线程去运行。

完整代码:

    

import java.net.*;
import java.io.*;
/*
服务端将获取到的客户端封装到单独的线程中。
*/
class  JpgClient2
{
	public static void main(String[] args) throws Exception
	{
		//检验文件
		if(args.length==0)
		{
			System.out.println("指定一个jpg文件先!");
			return ;
		}
		File file = new File(args[0]);
		if(!(file.exists() && file.isFile() && file.getName().endsWith(".jpg")))
		{
			System.out.println("选择文件错误,请重新选择一个正确的文件。");
			return ;
		}

		//读取文件并写入到服务器中
		Socket s = new Socket("192.168.137.199",9006);
		FileInputStream fis = new FileInputStream(file);
		OutputStream out = s.getOutputStream();
		byte[] buf = new byte[1024];
		int len = 0;
		while((len=fis.read(buf))!=-1)
		{
			out.write(buf,0,len);
		}
		
		//通知服务器发送数据结束
		s.shutdownOutput();

		//获取服务器响应
		InputStream in = s.getInputStream();
		byte[] bufIn = new byte[1024];
		int num = in.read(bufIn);
		String str = new String(bufIn,0,num);
		System.out.println(str);

		fis.close();
		s.close();
	}
}


class JpgThread implements Runnable
{
	private Socket s;
	JpgThread(Socket s)
	{
		this.s = s;
	}
	public void run()
	{
		int count = 1;

		String ip = s.getInetAddress().getHostAddress();

		try
		{
			//获取客户端数据
			InputStream in = s.getInputStream();
			
			//指定文件存放路径将读取到客户提交的数据写入文件中
			File dir = new File("c:\\pic");
			File file = new File(dir,ip+"("+count+").jpg");
			while(file.exists())
				file = new File(dir,ip+"("+(count++)+").jpg");
			FileOutputStream fos = new FileOutputStream(file);
			byte[] buf = new byte[1024];
			int len = 0;
			while((len=in.read(buf))!=-1)
			{
				fos.write(buf,0,len);
			}

			//返回上传状态给客户端
			OutputStream out = s.getOutputStream();
			out.write("上传文件成功".getBytes());

			fos.close();
			s.close();
		}
		catch (Exception e)
		{
			System.out.println(e.toString());
		}
	}
}
class  JpgServer2
{
	public static void main(String[] args)throws Exception 
	{
		ServerSocket ss = new ServerSocket(9006);

		//开启线程并发访问
		while(true)
		{
			Socket s = ss.accept();
			String ip = s.getInetAddress().getHostAddress();
			System.out.println(ip+"....connected");
			new Thread(new JpgThread(s)).start();
		}
	}
}

转载于:https://my.oschina.net/xiahuawuyu/blog/81182

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值