網路編程3--畢向東java基礎教程視頻學習筆記

来源:http://www.cnblogs.com/wsw-tcsygrwfqd/archive/2016/01/19/5136531.html
-Advertisement-
Play Games

Day2401 TCP上傳圖片02 客戶端併發上傳圖片03 客戶端併發登錄04 瀏覽器客戶端-自定義服務端05 瀏覽器客戶端-Tomcat服務端01 TCP上傳圖片 1 import java.net.*; 2 import java.io.*; 3 class PicClient 4 { 5 .....


Day24

01 TCP上傳圖片
02 客戶端併發上傳圖片
03 客戶端併發登錄
04 瀏覽器客戶端-自定義服務端
05 瀏覽器客戶端-Tomcat服務端

 

01 TCP上傳圖片

 1 import java.net.*;
 2 import java.io.*;
 3 class PicClient  
 4 {
 5     public static void main(String[] args) throws Exception
 6     {
 7         Socket s=new Socket("127.0.0.1",10007);
 8         FileInputStream fis=new FileInputStream("E:\\圖\\素材\\頭像.jpg");
 9         OutputStream os=s.getOutputStream();
10         byte[] buf=new byte[1024*16];
11         int len;
12         while((len=fis.read(buf))!=-1)
13         {
14             os.write(buf,0,len);
15         }
16         //告訴伺服器數據寫入完畢
17         s.shutdownOutput();
18         InputStream is=s.getInputStream();
19         byte[] bufIn=new byte[1024];
20         int num=is.read(bufIn);
21         System.out.println(new String(bufIn,0,num));
22         
23         fis.close();
24         s.close();
25     
26     }
27 }
28 class  PicServer 
29 {
30     public static void main(String[] args) throws Exception
31     {
32         ServerSocket ss=new ServerSocket(10007);
33         Socket s=ss.accept();
34         System.out.println(s.getInetAddress().getHostAddress()+"......connected");
35         InputStream in=s.getInputStream();
36         byte[] buf=new byte[1024*16];
37         FileOutputStream fos=new FileOutputStream("touxiang.jpg");
38         int len;
39         while((len=in.read())!=-1)
40         {
41             fos.write(buf,0,len);
42         }
43         PrintWriter out=new PrintWriter(s.getOutputStream(),true);
44         out.println("圖片上傳成功!");
45 
46         fos.close();
47         s.close();
48         ss.close();
49         
50     }
51 }
View Code

 


02 客戶端併發上傳圖片

服務端如果只有當為一個客戶端服務完成後,才能為別的客戶端服務,效率就太低了,所以服務端需要採用多線程。

一個客戶端請求連接,服務端就開啟一個線程為他服務。這樣可以實現客戶端併發上傳圖片。

實現代碼如下:

  1 /*
  2 
  3 */
  4 import java.net.*;
  5 import java.io.*;
  6 class PicClient 
  7 {
  8     public static void main(String[] args) throws Exception
  9     {
 10         //判斷要上傳的文件是否符合要求,不符合則結束運行
 11         File file=new File(args[0]);
 12         if(args.length!=1)
 13         {
 14             System.out.println("請上傳一個文件,而不是多個!");
 15             return;
 16         }
 17         if(!(file.exists() && file.isFile()))
 18         {
 19             System.out.println("文件不存在,或者文件有問題。");
 20             return;
 21         }
 22         if(!(file.getName().endsWith(".png")))
 23         {
 24             System.out.println("請上傳一個png格式的文件。");
 25             return;
 26         }
 27         if(file.length()>1024*9)
 28         {
 29             System.out.println("上傳文件大小超過允許範圍!");
 30             return;
 31         }
 32 
 33         //建立Socket服務
 34         Socket s=new Socket("172.29.115.1",10008);
 35         //讀取一個圖片文件
 36         FileInputStream fis=new FileInputStream(file);
 37         byte[] buf=new byte[1024*9];
 38         OutputStream out=s.getOutputStream();
 39         int len=0;
 40         //寫入socket輸出流中
 41         while((len=fis.read(buf))!=-1)
 42         {
 43             out.write(buf,0,len);
 44 
 45         }
 46         //給服務端一個信號,客戶端輸出結束
 47         s.shutdownOutput();
 48         
 49         //接受服務端的回饋信息
 50         InputStream in=s.getInputStream();
 51         byte[] b=new byte[1024];
 52         int num=in.read(b);
 53         System.out.println("server:"+new String(b,0,num));
 54 
 55         //關閉資源
 56         fis.close();
 57         s.close();
 58 
 59         
 60     }
 61 }
 62 class  PicServerThread implements Runnable
 63 {
 64     private Socket s;
 65     public PicServerThread(Socket s)
 66     {
 67         this.s=s;
 68     }
 69     public void run()
 70     {
 71         try
 72         {
 73             int count=1;
 74         String ip=new String(s.getInetAddress().getHostAddress()+"");
 75         System.out.println(ip+"......connected");
 76         File file=new File(ip+"("+count+")");
 77         //如果文件名已經存在,通過增加序號,定義新名字
 78         //迴圈進行判斷,直到找到沒用過的文件名
 79         while(file.exists())
 80             file=new File(ip+"("+(count++)+")"+".png");
 81 
 82         InputStream in=s.getInputStream();
 83         FileOutputStream fos=new FileOutputStream(file);
 84         
 85         byte[] buf=new byte[1024*9];
 86         int len;
 87         //讀取數據並寫入到文件中
 88         while((len=in.read(buf))!=-1)
 89         {
 90             fos.write(buf,0,len);
 91         }
 92 
 93         //向客戶端發送提示信息
 94         PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
 95         pw.println("上傳成功!");
 96 
 97         //關閉資源
 98         fos.close();
 99         s.close();
100         
101 
102             
103         }
104         catch (Exception e)
105         {
106             throw new RuntimeException("服務建立失敗!");
107         }
108         
109     }
110 
111     
112 }
113 class  PicServer
114 {
115     public static void main(String[] args) throws Exception
116     {
117     
118         //建立服務
119         ServerSocket ss=new ServerSocket(10008);
120         while(true)
121         {
122             //接收客戶端埠
123         Socket s=ss.accept();
124         new Thread(new PicServerThread(s)).start();
125 
126         }
127     
128     }
129 }
View Code

 


03 客戶端併發登錄

客戶端通過鍵盤錄入用戶名,服務端對這個用戶名進行校驗。
如果該用戶存在,在服務端顯示XXX,已登錄。
併在客戶端顯示,XXX歡迎登陸。

如果該用戶不存在,在服務端顯示XXX,嘗試登陸。
併在客戶端顯示,XXX,該用戶不存在。

最多只能嘗試登陸三次。

  1 import java.net.*;
  2 import java.io.*;
  3 class LoginClient 
  4 {
  5     public static void main(String[] args)throws Exception 
  6     {
  7         //建立服務
  8         Socket s=new Socket("127.0.0.1",10008);
  9         //獲得鍵盤錄入
 10         BufferedReader bufr=
 11             new BufferedReader(new InputStreamReader(System.in));
 12         //獲得socket對應的輸出流,設置為自動刷新
 13         PrintWriter out=new PrintWriter(s.getOutputStream(),true);
 14 
 15         //獲得socket對應的輸入流
 16         BufferedReader in=
 17             new BufferedReader(new InputStreamReader(s.getInputStream()));
 18         //最多只能嘗試登陸三次
 19         for(int x=0;x<3;x++)
 20         {
 21             String name=bufr.readLine();
 22             //如果鍵盤錄入為空(按下CTRL+C),迴圈結束
 23             if(name==null)
 24                 break;
 25             out.println(name);
 26             String info=in.readLine();
 27             System.out.println("server:"+info);
 28             //如果驗證成功,迴圈結束
 29             if(info.contains("歡迎"))
 30                 break;
 31         }
 32         //關閉資源
 33         bufr.close();
 34         s.close();
 35         
 36     }
 37 }
 38 class  UserThread implements Runnable
 39 {
 40     private Socket s;
 41     public UserThread(Socket s)
 42     {
 43         this.s=s;
 44     }
 45     public void run()
 46     {
 47         try
 48         {
 49             //獲取客戶端ip
 50             String ip=s.getInetAddress().getHostAddress();
 51             System.out.println(ip+"......connected.");
 52             //伺服器最多提供三次驗證服務
 53             for(int i=0;i<3;i++)
 54             {
 55                 BufferedReader in=
 56                     new BufferedReader(new InputStreamReader(s.getInputStream()));
 57                 //為讀取伺服器端的用戶文件,建立輸入流
 58                 BufferedReader bufr=new BufferedReader(new FileReader("user.txt"));
 59                 PrintWriter out=new PrintWriter(s.getOutputStream(),true);
 60                 //設置標誌位,以便確定伺服器需做出什麼樣的的動作
 61                 boolean flag=false;
 62                 String line=null;
 63                 String name=in.readLine();
 64                 if(name==null)
 65                     break;
 66                 while((line=bufr.readLine())!=null)
 67                 {
 68                     if(name.equals(line))
 69                     {
 70                         //如果在伺服器的用戶文件中找到客戶輸入的登錄名
 71                         //改變標誌位,結束迴圈
 72                         flag=true;
 73                         break;
 74                     }
 75                 }
 76                 //根據標誌位不同,伺服器做出不同動作
 77                 if(flag)
 78                 {
 79                     System.out.println(name+"已經登錄");
 80                     out.println(name+"歡迎登陸!");
 81                     break;
 82                 }
 83                 else
 84                 {
 85                     System.out.println(name+"嘗試登錄");
 86                     out.println(name+",抱歉,用戶名不存在!");
 87                 }
 88                 
 89 
 90             }
 91             //關閉資源
 92             s.close();
 93         }
 94         catch (Exception e)
 95         {
 96             e.printStackTrace();
 97         }
 98     }
 99 
100     
101 }
102 class  LoginServer
103 {
104     public static void main(String[] args)throws Exception 
105     {
106         //建立伺服器端
107         ServerSocket ss=new ServerSocket(10008);
108         while(true)
109         {
110             //迴圈接收客戶請求
111             Socket s=ss.accept();
112             //為客戶開啟一個線程
113             new Thread(new UserThread(s)).start();
114         }
115         
116     }
117 }
View Code

 


04 瀏覽器客戶端-自定義服務端

 

演示客戶端和服務端
客戶端:瀏覽器
伺服器:自定義

 

 1 import java.net.*;
 2 import java.io.*;
 3 class  ServerDemo
 4 {
 5     public static void main(String[] args) throws Exception
 6     {
 7         ServerSocket ss=new ServerSocket(11000);
 8         Socket s=ss.accept();
 9         System.out.println(s.getInetAddress().getHostAddress());
10         PrintWriter out=new PrintWriter(s.getOutputStream(),true);
11         out.println("<font color='blue' size=8>客戶端你好!</font>");
12         s.close();
13         ss.close();
14     }
15 }
View Code

不過用telnet當做客戶端實驗時,我電腦可能沒用這個應用,就沒有成功。

運行顯示:
D:\abc>telnet 127.0.0.1 11000
'telnet' 不是內部或外部命令,也不是可運行的程式
或批處理文件。

 


05 瀏覽器客戶端-Tomcat服務端

客戶端:瀏覽器

服務端:Tomcat

Tomcat 伺服器是一個免費的開放源代碼的Web 應用伺服器,屬於輕量級應用伺服器,

在中小型系統和併發訪問用戶不是很多的場合下被普遍使用,是開發和調試JSP 程式的首選。

對於一個初學者來說,可以這樣認為,當在一臺機器上配置好Apache 伺服器,

可利用它響應HTML(標準通用標記語言下的一個應用)頁面的訪問請求。

實際上Tomcat 部分是Apache 伺服器的擴展,但它是獨立運行的,

所以當你運行tomcat 時,它實際上作為一個與Apache 獨立的進程單獨運行的。

 

簡要介紹我安裝Tomcat的過程。

1.下載。

官方下載網址為:http://tomcat.apache.org/
選擇DownLoad--Tomcat6.0-32-bit/64-bit Windows Service Installer(pgp,md5)

這個版本直接點擊就可以安裝。如果不需要改變安裝路徑,直接選擇下一步就可以了。

2.環境設置。

變數名:JAVA-HOME

變數值:SDK路徑。

3.啟動

啟動Tomcat我們可以直接運行bin目錄下的 Tomcat6.exe 可執行文件。

在啟動完成以後在瀏覽器中輸入:http://127.0.0.1:8080 .顯示如下

 

在D:\tomcat\webapps路徑下新建文件夾myWeb,再在此文件夾中新建文件Demo.html.

文件內容:

 1 <html>
 2   <body>
 3       <h1>這是我的主頁</h1>
 4       <font size=8 color=blue>歡迎登陸</font>
 5       <div>
 6           錦瑟無端五十弦,</br>
 7           一弦一柱思華年。</br>
 8           莊生曉夢迷蝴蝶,</br>
 9           望帝春心托杜鵑。</br>
10           滄海月明珠有淚。</br>
11           藍田日暖玉生煙,</br>
12           此情可待成追憶。</br>
13           只是當時已惘然。</br>
14     
15         
16       </div>
17   </body>
18 </html>
View Code

 

在瀏覽器中輸入http://127.0.0.1:8080/myWeb/Demo.html,顯示如下:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 記得以前在大學里學習c語言的時候,剛開始是很吃力的. 入門級別的演算法中有個叫冒泡排序法,也有稱為氣泡排序法.那時候剛接觸它就對它的名字特別感興趣,因為覺得很有意思.好了,廢話不多說了,我們先一起簡單回憶下這個冒泡排序法. 一.列印行和列一般是這樣的一個簡單代碼,輸出4行4列*:for(...
  • 地區分三層結構例如:大中華地區一級劃分:華東華中華北西南特別行政區華南-------------------------------------------------請輸入你要查看的大中華地區名字:華中------------------包含的省名字二級:-----------------湖北湖南...
  • 簡要介紹Java的記憶體區域:運行時數據區域HotSpot虛擬機對象一、概覽二、運行時數據區域2.1 程式計數器Program Counter Register,代表當前線程所執行的位元組碼的行號指示器,操作系統中的PC,這兩個是一個概念。執行時就是通過改變這個計數器來選取下一條需要執行的位元組碼指令。J...
  • #coding:utf-8import os,repath = 'test'files = os.listdir(path)def count_word(words): dic = {} max = 0 marked_key = '' #計算每個單詞出現的次數 for ...
  • 一、簡介 如果有一種軟體能將圖形界面的設計及時地展現於開發人員的面前,而且在設計完後能直接看到界面的外觀效果,這樣就使程式員的主要精力集中於應用程式核心功能的開發上,這就是所謂的可視化編程思想。 二、安裝 1)yum方式 yum install -y glade3 三、教程 http://www.4...
  • 歸併排序就是將未排序的數組進行對半劃分成兩個數組,劃分後的數組只有原來數組的一半數量的元素。然後在對劃分的兩個數組再繼續劃分,迴圈此操作,直到劃分的數組中只有一個元素時停止劃分,然後對於劃分完成的數組進行歸併排序操作。將兩個已經劃分完成的數組合併成一個有序的數組,直到最後合併成一個包含所有元素的數組...
  • 1.pom 項目對象模型 (project object model) pom的組成 1.項目基本信息 2.構建環境 --dev,test,beta,prod 3.pom關係 --依賴jar包 4.構建設置 -- plugin 插件2.插件與目標 調用插件目標的兩種方式: ...
  • 1、常用的五種併發包ConcurrentHashMapCopyOnWriteArrayListCopyOnWriteArraySetArrayBlockingQueueLinkedBlockingQueue2、ConcurrentHashMap線程安全的HashMap的實現數據結構:一個指定個數的S...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...