socket實現用戶登錄 && socket實現圖片上傳

需求:
經過客戶端鍵盤錄入用戶名,實現登陸。
服務端對客戶端的發送過來的用戶名進行校驗。
若是該用戶存在,服務端顯示用戶登陸,並回饋給客戶端歡迎光臨。
若是該用戶不存在,服務端顯示用戶嘗試登陸,並回饋給客戶端,該用戶不存在。java

另外,客戶端最多隻能嘗試登陸三次。
服務端也同樣做此限定。服務器

效果圖(左圖爲客戶端,右圖爲服務器端):多線程

   

思路:併發

客戶端:
1,創建socket服務。
2,讀取鍵盤錄入。
3,將錄入的一個用戶名數據經過socket的輸出發出,給服務端。
4,發出後,要讀取服務端回饋的信息。
5,判斷該信息,若是有歡迎字樣表示登陸成功,用戶名輸入結束。
由於操做的是文本,因此可使用字符流。並加上緩衝提升效率。socket

 

服務端:
1,創建socket服務。
2,不斷獲取客戶端對象。
3,將客戶端對象封裝到單獨的線程中。
4,限定判斷次數。
5,讀取本地用戶文件列表,對獲取的用戶名進行校驗。
6,根據校驗結果給出響應信息。this

 

完整代碼:spa

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,每一個客戶端去請求都會作這三個事情,咱們就不用去寫它了,服務器提供了更簡單的對象讓你去用。.net

服務器的做用就一個,不斷的去處理客戶端的請求並給客戶端的請求有相應的應答。線程

------------------------------------------------------------------------------------------------------------------------code

實現思路:

在客戶端獲取到文件流,將文件流寫入到經過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();
		}
	}
}
相關文章
相關標籤/搜索