黑馬程式設計師-JAVA高階(網路程式設計)PART2
---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ----------------------
這部分的知識點主要有:
1.TCP傳輸的幾個應用;
2.瀏覽器訪問伺服器。
一、TCP傳輸的幾個應用
1.TCP上傳圖片
import java.io.*; import java.net.*; class UploadPicClient { public static void main(String[] args) throws Exception { Socket s = new Socket("192.168.31.1",10010); FileInputStream fis = new FileInputStream("client.png"); 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); System.out.println(new String(bufIn,0,num)); fis.close(); s.close(); } } class UploadPicServer { public static void main(String[] args) throws Exception { ServerSocket ss = new ServerSocket(10010); Socket s = ss.accept(); String ip = s.getInetAddress().getHostAddress(); System.out.println(ip+" connected..."); InputStream in = s.getInputStream(); FileOutputStream fos = new FileOutputStream("server.png"); 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(); ss.close(); } }
2.客戶端併發上傳圖片
要求通過鍵盤輸入要上傳的圖片路徑,並對格式和大小有要求。
import java.net.*; import java.io.*; class UploadPicByThreadClient { public static void main(String[] args) throws Exception { //判斷是不是隻傳遞了一個引數 if(args.length!=1) { System.out.println("請提供一個jpg格式檔案的路徑"); return; } File file = new File(args[0]); //判斷傳過來的路徑對應的檔案物件是否是檔案以及檔案是否存在 if(!(file.exists()&&file.isFile())) { System.out.println("檔案不存在或不是檔案"); return; } //判斷是不是jpg格式的檔案 if(!file.getName().endsWith(".jpg")) { System.out.println("檔案格式不正確,請選擇jpg檔案"); return; } //檔案體積不能超過5M if(file.length()>1024*1024*5) { System.out.println("檔案體積過大,不能大於5兆"); return; } Socket s = new Socket("192.168.31.1",10011); 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 bufLen = in.read(bufIn); System.out.println(new String(bufIn,0,bufLen)); fis.close(); s.close(); } } class UploadPicThread implements Runnable { private Socket s; UploadPicThread(Socket s) { this.s = s; } public void run() { String ip = this.s.getInetAddress().getHostAddress(); System.out.println(ip+" connected..."); FileOutputStream fos = null; int count = 1; try { //使用連線到伺服器的客戶端的ip地址來命名上傳的圖片 File file = new File(ip+".jpg"); //如果存在同名檔案,則在後面加上數字序號 while(file.exists())//這裡不能用if判斷,要用while迴圈 file = new File(ip+"("+(count++)+")"+".jpg"); fos = new FileOutputStream(file); InputStream in = this.s.getInputStream(); byte[] buf = new byte[1024]; int len = 0; while((len=in.read(buf))!=-1) { fos.write(buf,0,len); } OutputStream out = this.s.getOutputStream(); out.write("圖片上傳成功".getBytes()); } catch (Exception e) { throw new RuntimeException("圖片上傳異常"); } finally { if(fos!=null) try { fos.close(); } catch (IOException e) { throw new RuntimeException("寫入流關閉異常"); } try { this.s.close(); } catch (IOException e) { throw new RuntimeException("socket關閉異常"); } } } } class UploadPicByThreadServer { private Socket s; public static void main(String[] args) throws Exception { ServerSocket ss = new ServerSocket(10011); while(true) { Socket s = ss.accept(); new Thread(new UploadPicThread(s)).start(); } } }
3.客戶端併發登陸
需求:客戶通過鍵盤錄入使用者名稱,服務端對這個使用者名稱進行校驗。如果該使用者存在,在服務端顯示“xxx,已登入”,在客戶端顯示“xxx,歡迎光臨”;如果該使用者不存在,在服務端顯示“xxx,嘗試登陸”,在客戶端顯示“xxx,該使用者不存在”。最多登陸三次。
import java.io.*; import java.net.*; class LoginClient { public static void main(String[] args) throws Exception { Socket s = new Socket("192.168.31.1",10001); BufferedReader bufr = new BufferedReader( new InputStreamReader(System.in)); BufferedReader bufIn = new BufferedReader( new InputStreamReader(s.getInputStream())); BufferedWriter bufOut = new BufferedWriter( new OutputStreamWriter(s.getOutputStream())); for(int i=0;i<3;i++) { String line = bufr.readLine(); if(line==null) break; bufOut.write(line); bufOut.newLine(); bufOut.flush(); String info = bufIn.readLine(); System.out.println(info); if(info.contains("歡迎")) break; } bufr.close(); s.close(); } } class UserThread implements Runnable { private Socket s; UserThread(Socket s) { this.s = s; } public void run() { String ip = this.s.getInetAddress().getHostAddress(); System.out.println(ip+" connected..."); try { BufferedReader bufIn = new BufferedReader( new InputStreamReader(s.getInputStream())); BufferedWriter bufOut = new BufferedWriter( new OutputStreamWriter(s.getOutputStream())); for(int i=0;i<3;i++) { String name = bufIn.readLine(); BufferedReader bufr = new BufferedReader( new FileReader("users.txt")); boolean flag = false; String line = null; while((line=bufr.readLine())!=null) { if(line.equals(name)) { flag = true; break; } } if(flag) { System.out.println(name+",已登入"); bufOut.write(name+",歡迎光臨"); bufOut.newLine(); bufOut.flush(); break; } else { System.out.println(name+",嘗試登陸"); bufOut.write(name+",該使用者不存在"); bufOut.newLine(); bufOut.flush(); } bufr.close(); } } catch(Exception e) { throw new RuntimeException("驗證異常"); } finally { try { this.s.close(); } catch (IOException e) { throw new RuntimeException("socket關閉異常"); } } } } class LoginServer { public static void main(String[] args) throws Exception { ServerSocket ss = new ServerSocket(10001); System.out.println(ss); while(true) { Socket s = ss.accept(); new Thread(new UserThread(s)).start(); } } }
二、瀏覽器訪問服務端
1.瀏覽器客戶端訪問自定義服務端
import java.net.*;
import java.io.*;
class ServerDemo
{
public static void main(String[] args) throws Exception
{
ServerSocket ss = new ServerSocket(10015);
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+" connected...");
PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
pw.println("");
s.close();
//ss.close();
}
}
通過瀏覽器訪問http://xxx.xxx.xxx.xxx:10015訪問服務端,可以顯示服務端的反饋資訊。其中xxx.xxx.xxx.xxx表示本機ip。
2.瀏覽器訪問Tomcat服務端
3.自定義瀏覽器訪問Tomcat服務端
import java.io.*;
import java.net.*;
class MyIE
{
public static void main(String[] args) throws Exception
{
Socket s = new Socket("192.168.31.1",8080);
PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
//向伺服器傳送請求資料頭
pw.println("GET /myweb/demo.html HTTP/1.1");
pw.println("Accept: */*");
pw.println("Accept-Language: zh-CN");
pw.println("Host: 192.168.31.1:10015");
pw.println("Connection: Keep-Alive");
pw.println();
//讀取伺服器傳送過來的資料
BufferedReader bufIn = new BufferedReader(
new InputStreamReader(s.getInputStream()));
String line = null;
while((line=bufIn.readLine())!=null)
System.out.println(line);
s.close();
}
}
4.URL和URLConnection
用URLConnection物件獲取的服務端資料,沒有響應頭
import java.net.*;
class URLDemo
{
public static void main(String[] args) throws MalformedURLException
{
URL url = new URL("http://192.168.31.1:8080/myweb/demo.html?name=zhangsan&age=30");
System.out.println("getFile():"+url.getFile());//獲取此URL的檔名
System.out.println("getHost():"+url.getHost());//獲取此URL的主機名
System.out.println("getPath():"+url.getPath());//獲取此URL的路徑部分
System.out.println("getPort():"+url.getPort());//獲取此URL的埠號
System.out.println("getProtocol():"+url.getProtocol());//獲取此URL的協議名稱
System.out.println("getQuery():"+url.getQuery());//獲取此URL的查詢部分
}
}
import java.io.*;
import java.net.*;
class URLConnectionDemo
{
public static void main(String[] args) throws Exception
{
URL url = new URL("http://192.168.31.1:8080/myweb/demo.html");
URLConnection conn = url.openConnection();
InputStream in = conn.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println(new String(buf,0,len));
}
}
5、小知識點
(1)Socket有一個函式connect(SocketAddress endPoint),其中SocketAddress封裝的是IP地址和埠,二InetAddress封裝的只是IP地址。
(2)ServerSocket有一個建構函式ServerSocket(int port,int backlog),其中backlog表示能連線到服務端的客戶端的最大數量。
----------------------
ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ----------------------
相關推薦
黑馬程式設計師-JAVA高階(網路程式設計)PART2
---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ---------------------- 這部分的知識點主要有: 1.TCP傳輸的幾個應用; 2.瀏覽器訪問伺服器。 一、TCP傳輸的幾個應用
黑馬程式設計師-JAVA高階(網路程式設計)PART1
---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ---------------------- 這部分的主要知識點: 1.網路程式設計概述; 2.UDP傳輸; 3.TCP傳輸。 一、網路程式設計概述
黑馬程式設計師-JAVA高階(IO輸入與輸出)PART1
---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ---------------------- 什麼是IO流? IO流用來處理裝置之間的資料傳輸。Java通過流的方式來操作資料。 流的分類: 按操作
黑馬程式設計師-JAVA高階(IO輸入與輸出)PART4
---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ---------------------- 這部分內容的知識點為: 1.IO包中的其他幾個類; 2.字元編碼; 3.練習。 一、IO包中的其他幾個
黑馬程式設計師-JAVA高階(IO輸入與輸出)PART3
---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ---------------------- 這部分的內容主要有以下幾個知識點: 1.File類; 2.Properties類; 3.IO體系的其他一
黑馬程式設計師 —— Java高階視訊_IO輸入與輸出(第十八天)1
------- android培訓、java培訓、期待與您交流! ---------- 一 其它物件 - System 現在來看一下一些其他類是如何使用的。 比起了解這些類的方法怎麼使用,在這幾節學習過程中, 更重要的是要掌握如何通過查閱API文件實現功能。 1
黑馬程式設計師 —— Java高階視訊_IO輸入與輸出(第十九天)2
------- android培訓、java培訓、期待與您交流! ---------- 十八 流操作規律1 上面學習瞭如果之多的流(其實後面的章節還有不少),那麼到底應該如何確定什麼情況用什麼流呢? 關鍵是要掌握了流操作的基本規律,掌握了規律操作起來就容易了
黑馬程式設計師——Java GUI(圖形使用者介面)
-----------android培訓、java培訓、java學習型技術部落格、期待與您交流!------------ GUI(圖形使用者介面) 一、概述 1.什麼是GUI? GUI(Graphical User Interface)是使用者與作業系統進行互動的一種
黑馬程式設計師-java高新技術(反射)
一、反射 1、定義: Java程式中的各個Java類屬於統一類事物,描述這類事物的Java類名就是Class。反射機制指的是程式在執行時能夠獲取自身的資訊。在java中,只要給定類的名字,那麼就可以通過反射機制來獲得類的所有資訊。 2、優點和缺
黑馬程式設計師-------Java高階特性--------反射
黑馬程式設計師—–Java高階特性—–反射 一.概述 Java 反射是Java語言的一個很重要的特徵,它使得Java具體了“動態性”。 這個機制允許程式在執行時透過Reflection APIs取得任何一個已知名稱的class的內部資訊,包括其mod
黑馬程式設計師——Java 網路程式設計
-----------android培訓、java培訓、java學習型技術部落格、期待與您交流!------------ 一、概述 1.網路模型 網路模型常見的有ISO參考模型和TCP/IP參考模型,兩者的對應關係如下圖: ISO參考模型分為七個層次:應用層、表示層、
黑馬程式設計師----JAVA基礎之GUI視覺化程式設計與列舉&網路程式設計
------ android培訓、java培訓、期待與您交流! ---------- 一、GUI視覺化程式設計 1. GUI視覺化程式設計是什麼? 就是讓介
黑馬程式設計師--Java學習日記之GUI&網路程式設計
------- android培訓、java培訓、期待與您交流! ---------- GUI 如何建立一個視窗並顯示 Graphical User Interface(圖形使用者介面)。
黑馬程式設計師——Java集合框架(一)之迭代器、Collection層次結構等
-----------android培訓、java培訓、java學習型技術部落格、期待與您交流!------------ 集合框架概述 一、什麼是集合框架 1.什麼是集合? 集合是指把具有相同性質的一類東西匯聚成一個整體,簡單說就是指儲存資料的一個容器。集
黑馬程式設計師——Java IO流(二)之流操作規律總結、File類、Properties類、序列流等
-----------android培訓、java培訓、java學習型技術部落格、期待與您交流!------------ 六、流操作規律總結 1.明確源和目的: 源: 字元流:FileReader(純文字檔案)。 位元組流:FileInputStream(
黑馬程式設計師——Java面向物件(二)之封裝、繼承、多型、介面等
-----------android培訓、java培訓、java學習型技術部落格、期待與您交流!------------ 五、面向物件的特徵 面向物件主要有三大特徵: 1.特徵一 —— 封裝 1)定義:是指隱藏物件的屬性和實現細節,僅對外提供公共訪問方式。 2)好處:
黑馬程式設計師——Java語言基礎(一)
-----------android培訓、java培訓、java學習型技術部落格、期待與您交流!------------ 對於Java初學者,學好Java語言基礎是非常重要的,這將影響將來程式設計的程式碼質量與效率。那麼Java語言基礎內容包括哪些呢?Java基礎內
黑馬程式設計師——Java集合框架(二)之泛型
培訓、java培訓、java學習型技術部落格、期待與您交流!------------ 泛型 一、泛型概述 1.什麼是泛型? 泛型就是指將資料型別引數化,把以前固定的資料型別用一個代表資料型別的引數進行表示,該引數可以接受傳入的任意資料型別。可以這
黑馬程式設計師——Java面向物件(一)之匿名物件、程式碼塊、static關鍵字等
a)子類只繼承父類的預設(預設)建構函式,即無形參建構函式。如果父類沒有預設建構函式,那子類不能從父類繼承預設建構函式。 b)子類從父類處繼承來的父類預設建構函式,不能成為子類的預設建構函式。 c)在建立物件時,先呼叫父類預設建構函式對物件進行初始化,然後呼叫子類自身自己定義的建構函
黑馬程式設計師——Java語法基礎(二)
-----------android培訓、java培訓、java學習型技術部落格、期待與您交流!------------ 七、函式 1.什麼是函式? 定義在類中的具有特定功能的一段獨立小程式 ,就叫函式,也可以稱為方法。 2.函式的