1. 程式人生 > >黑馬程式設計師-JAVA高階(網路程式設計)PART2

黑馬程式設計師-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.函式的