需求:
經過客戶端鍵盤錄入用戶名,實現登陸。
服務端對客戶端的發送過來的用戶名進行校驗。
若是該用戶存在,服務端顯示用戶登陸,並回饋給客戶端歡迎光臨。
若是該用戶不存在,服務端顯示用戶嘗試登陸,並回饋給客戶端,該用戶不存在。java
另外,客戶端最多隻能嘗試登陸三次。
服務端也同樣做此限定。服務器
效果圖(左圖爲客戶端,右圖爲服務器端):多線程
思路:併發
客戶端:
1,創建socket服務。
2,讀取鍵盤錄入。
3,將錄入的一個用戶名數據經過socket的輸出發出,給服務端。
4,發出後,要讀取服務端回饋的信息。
5,判斷該信息,若是有歡迎字樣表示登陸成功,用戶名輸入結束。
由於操做的是文本,因此可使用字符流。並加上緩衝提升效率。socket
服務端:
1,創建socket服務。
2,不斷獲取客戶端對象。
3,將客戶端對象封裝到單獨的線程中。
4,限定判斷次數。
5,讀取本地用戶文件列表,對獲取的用戶名進行校驗。
6,根據校驗結果給出響應信息。this
完整代碼:spa
總結:其實服務器就是相似這樣一種程序,當用戶請求服務器的時候,它首先會建立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(); } } }