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

黑馬程式設計師-JAVA高階(網路程式設計)PART1

---------------------- ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ----------------------

這部分的主要知識點:

1.網路程式設計概述;

2.UDP傳輸;

3.TCP傳輸。

一、網路程式設計概述

1.網路參考模型

OSI參考模型:包括應用層、表示層、會話層、傳輸層、網路層、資料鏈路層、物理層七層。

TCP/IP參考模型:包括應用層(對應OSI模型的應用層、表示層和會話層)、傳輸層(對應OSI模型的傳輸層)、網際層(對應OSI模型的網路層)、主機至網路層(對應OSI模型的資料鏈路層和物理層)四層。

2.網路通訊要素

(1)IP地址

IP地址是網路中裝置的標識。本地迴環地址為127.0.0.1,主機名為localhost。192.168.1.0表示網路段,192.168.1.255表示這個網路段上的廣播地址。

表示IP地址的類是InetAddress

import java.net.*;

class IPDemo 
{
	public static void main(String[] args) throws UnknownHostException
	{
		InetAddress i = InetAddress.getLocalHost();//獲得本地主機

		System.out.println(i);
		System.out.println(i.getHostName());//獲取IP地址的主機名
		System.out.println(i.getHostAddress());//獲取IP地址的字串表現形式

		//在給定主機名的情況下確定主機的IP地址
		InetAddress ia = InetAddress.getByName("www.baidu.com");
		System.out.println(ia.getHostName());
		System.out.println(ia.getHostAddress());

		//在給定主機名的情況下,獲取其IP地址組成的陣列
		InetAddress[] ias = InetAddress.getAllByName("www.taobao.com");
		for(InetAddress add:ias)
			System.out.println(add.getHostAddress());
	}
}

(2)埠號

埠用於標識程序的邏輯地址。有效埠號是0~65535,其實0~1024為系統使用或保留埠。

(3)傳輸協議

傳輸協議表示通訊的規則,常用的協議有UDP和TCP。

3.TCP和UDP

(1)UDP

將資料封裝在資料報中;每個資料報的大小限制在64k內;面向無連線,不可靠;傳輸速度快。

(2)TCP

建立連線,形成傳輸資料的通道;傳輸資料量大;連線要“三次握手”,可靠;效率稍低,速度慢。

4.socket(套接字)

socket是為網路服務提供的一種機制,網路通訊的兩端都有socket,網路通訊其實就是socket之間的通訊,資料在兩個socket之間通過IO傳輸。

二、UDP傳輸

兩個物件,DatagramPacket表示資料報包,DatagramSocket表示用來發送和接收資料報包的套接字。

傳輸過程:使用DatagramSocket建立傳送端和接收端;使用DatagramPacket建立資料包;呼叫DatagramSocket的傳送接收方法;關閉DatagramSocket物件。

1.UDP傳送資料演示

需求:通過UDP傳輸方式,將一段文字資料傳送出去,並在接收端處理資料。

需要建立一個傳送端和一個接收端。

import java.net.*;

/*
UDP傳送端建立思路:
1.建立UDPSocket服務;
2.將資料封裝到資料包中;
3.通過socket服務的傳送功能,將資料包傳送出去;
4.關閉資源。
*/
class UdpSend 
{
	public static void main(String[] args) throws Exception
	{
		//通過DatagramSocket物件建立socket服務
		DatagramSocket ds = new DatagramSocket();
	
		//獲取資料,並通過DatagramPacket物件將資料封裝成資料包
		byte[] buf = "udp ge men lai le".getBytes();
		DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.31.1"),10000);

		//通過DatagramSocket物件的send方法,將封裝好的資料包傳送出去
		ds.send(dp);

		//關閉資源
		ds.close();
	}
}

/*
UDP接收端建立思路:
1.建立socket服務,監聽一個埠;
2.建立一個數據包,用來儲存接收到的資料;
3.將接收到的資料存入建立好的資料包中;
4.處理資料;
5.關閉資源。
*/
class UdpReceive
{
	public static void main(String[] args) throws Exception
	{
		//通過DatagramSocket物件建立socket服務,監聽10000埠
		DatagramSocket ds = new DatagramSocket(10000);

		//通過DatagramPacket物件建立資料包
		byte[] buf = new byte[1024];
		DatagramPacket dp = new DatagramPacket(buf,buf.length);
	
		//通過DatagramSocket物件的receive方法接收資料,並存入建立好的資料包中
		ds.receive(dp);

		//通過DatagramPacket物件處理獲取到的資料
		String ip = dp.getAddress().getHostAddress();
		int port = dp.getPort();
		String data = new String(dp.getData(),0,dp.getLength());

		System.out.println(ip+":"+port+"-->"+data);
		
		//關閉資源
		ds.close();
		}
}
必須先執行接收端程式UdpReceive,再執行傳送端程式UdpSend,才能收到資料。

2.通過UDP將鍵盤錄入的資料傳送出去

import java.net.*;
import java.io.*;

class UdpSend2 
{
	public static void main(String[] args) throws Exception
	{
		DatagramSocket ds = new DatagramSocket();

		//讀取鍵盤錄入,加入緩衝
		BufferedReader bufr = new BufferedReader(
			new InputStreamReader(System.in));
		String line = null;
		while((line=bufr.readLine())!=null)
		{
			//如果輸入的是"over",則停止輸入
			if("over".equals(line))
				break;

			//通過DatagramPacket建立資料包,併發送出去
			byte[] buf = line.getBytes();
			DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.31.1"),10000);
			ds.send(dp);
		}

		bufr.close();
		ds.close();
	}
}

class UdpRec2
{
	public static void main(String[] args) throws Exception
	{
		DatagramSocket ds = new DatagramSocket(10000);

		while(true)//不停的接收
		{
			byte[] buf = new byte[1024];
			DatagramPacket dp = new DatagramPacket(buf,buf.length);
			ds.receive(dp);//阻塞式方法

			String ip = dp.getAddress().getHostAddress();
			int port = dp.getPort();
			String data = new String(dp.getData(),0,dp.getLength());

			System.out.println(ip+":"+port+"-->"+data);
		}
	}
}

3.UDP聊天

需求:編寫一個聊天程式。

分析:需要有發資料的部分和收資料的部分,這兩部分需要同時進行,所以需要用到多執行緒,一個執行緒控制發資料,另一個控制收資料。

import java.net.*;
import java.io.*;

class Send implements Runnable
{
	private DatagramSocket ds;
	Send(DatagramSocket ds)
	{
		this.ds = ds;
	}

	public void run()
	{
		BufferedReader bufr = null;
		try
		{
			bufr = new BufferedReader(
				new InputStreamReader(System.in));
			String line = null;
			while((line=bufr.readLine())!=null)
			{
				byte[] buf = line.getBytes();
				DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.31.1"),10001);
				this.ds.send(dp);
				if("bb".equals(line))
					break;
			}
		}
		catch (Exception e)
		{
			throw new RuntimeException("傳送資訊異常");
		}
		finally
		{
			if(bufr!=null)
				try
				{
					bufr.close();
				}
				catch (IOException e)
				{
					throw new RuntimeException("讀取流關閉異常");
				}
			this.ds.close();
		}
	}
}

class Rec implements Runnable
{
	private DatagramSocket ds;
	Rec(DatagramSocket ds)
	{
		this.ds = ds;
	}

	public void run()
	{
		try
		{
			while(true)
			{
				byte[] buf = new byte[1024];
				DatagramPacket dp = new DatagramPacket(buf,buf.length);
				this.ds.receive(dp);

				String ip = dp.getAddress().getHostAddress();
				int pt = dp.getPort();
				String data = new String(dp.getData(),0,dp.getLength());

				if("bb".equals(data))
					break;

				System.out.println(ip+"("+pt+")"+":::"+data);
			}
		}
		catch(IOException e)
		{
			e.printStackTrace();
			throw new RuntimeException("接收資訊異常");
		}
		finally
		{
			this.ds.close();
		}

	}
}

class ChatDemo 
{
	public static void main(String[] args) throws SocketException
	{
		DatagramSocket sendSocket = new DatagramSocket();
		DatagramSocket recSocket = new DatagramSocket(10001);

		new Thread(new Send(sendSocket)).start();
		new Thread(new Rec(recSocket)).start();
	}
}

三、TCP傳輸

兩個物件,Socket物件表示客戶端套接字,ServerSocket物件表示伺服器套接字。

傳輸過程:通過Socket物件建立客戶端,ServerSocket物件建立服務端;建立連線受,通過Socket中的IO流進行資料傳輸;關閉Socket

1.TCP傳輸資料演示

import java.io.*;
import java.net.*;

class TcpClient 
{
	public static void main(String[] args) throws Exception
	{
		//建立socket服務,並指定要連線的主機和埠
		Socket s = new Socket("192.168.31.1",10003);
		
		//從socket中獲取位元組輸出流
		OutputStream out = s.getOutputStream();

		//將資料寫出去
		out.write("tcp傳送資料".getBytes());

		//關閉資源
		s.close();
	}
}

class TcpServer
{
	public static void main(String[] args) throws Exception
	{
		//建立服務端的socket服務,監聽一個埠
		ServerSocket ss = new ServerSocket(10003);
		
		//獲取連線過來的客戶端物件,阻塞式方法
		Socket s = ss.accept();

		//通過獲取的客戶端物件,獲取資料
		String ip = s.getInetAddress().getHostAddress();
		System.out.println(ip+" connected...");

		byte[] buf = new byte[1024];
		InputStream in = s.getInputStream();
		int len = in.read(buf);
		System.out.println(new String(buf,0,len));

		//關閉資源
		s.close();
		ss.close();//可選
	}
}
同樣是需要先執行服務端程式。

2.服務端反饋資訊到客戶端

需求:客戶端給服務端傳送資料,服務端收到後,給客戶端反饋資訊。

import java.io.*;
import java.net.*;

class TcpClient2 
{
	public static void main(String[] args) throws Exception
	{
		//建立客戶端socket服務,指定連線的主機和埠
		Socket s = new Socket("192.168.31.1",10004);

		//獲取socket的輸出流,向服務端傳送資料
		OutputStream out = s.getOutputStream();
		out.write("服務端你好!".getBytes());

		//獲取socket的輸入流,讀取服務端的反饋資料
		InputStream in = s.getInputStream();
		byte[] buf = new byte[1024];
		int len = in.read(buf);
		System.out.println(new String(buf,0,len));

		//關閉資源
		s.close();
	}
}

class TcpServer2
{
	public static void main(String[] args) throws Exception
	{
		//建立服務端socket服務,監聽埠
		ServerSocket ss = new ServerSocket(10004);
	
		//獲取連結過來的客戶端物件
		Socket s = ss.accept();
		String ip = s.getInetAddress().getHostAddress();
		System.out.println(ip+" connected...");
		
		//獲取socket的輸入流,讀取傳送過來的資料
		InputStream in = s.getInputStream();
		byte[] buf = new byte[1024];
		int len = in.read(buf);
		System.out.println(new String(buf,0,len));

		//獲取socket的輸出流,向客戶端反饋資料
		OutputStream out = s.getOutputStream();
		out.write("客戶端哥們你好,我收到了!".getBytes());

		s.close();
		ss.close();
	}
}

3.TCP練習

需求:建立一個文字轉換伺服器。客戶端給服務端傳送文字,服務端將文字轉換成大寫再發送回客戶端。可以不斷地進行轉換,直到客戶端輸入"over",轉換結束。

因為操作的是文字資料,所以考慮使用字元流,並加入緩衝。

import java.io.*;
import java.net.*;

class TransTextClient 
{
	public static void main(String[] args) throws Exception
	{
		Socket s = new Socket("192.168.31.1",10005);

		BufferedReader bufr = new BufferedReader(
			new InputStreamReader(System.in));

		//BufferedWriter bufOut = new BufferedWriter(
		//	new OutputStreamWriter(s.getOutputStream()));
		PrintWriter pw = new PrintWriter(s.getOutputStream(),true);

		BufferedReader bufIn = new BufferedReader(
			new InputStreamReader(s.getInputStream()));
		String line = null;
		while((line=bufr.readLine())!=null)//讀取一行資料
		{
			if("over".equals(line))
				break;

			//out.write(line.getBytes());
			//bufOut.write(line);
			//bufOut.newLine();
			//bufOut.flush();
			pw.println(line);//將一行資料傳送到服務端

			//從服務端獲取返回的資料
			String str = bufIn.readLine();
			System.out.println("server:"+str);
		}
		
		s.close();
		bufr.close();

	}
}

class TransTextServer
{
	public static void main(String[] args) throws Exception
	{
		ServerSocket ss = new ServerSocket(10005);

		while(true)//服務端不關閉
		{
			Socket s = ss.accept();
			String ip = s.getInetAddress().getHostAddress();
			System.out.println(ip+" connected...");

			BufferedReader bufIn = new BufferedReader(
				new InputStreamReader(s.getInputStream()));

			//BufferedWriter bufOut = new BufferedWriter(
			//	new OutputStreamWriter(s.getOutputStream()));
			PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
			
			//讀取客戶端傳送過來的資料
			String line = null;
			while((line=bufIn.readLine())!=null)
			{
				System.out.println(line);
				//out.write(data.toUpperCase().getBytes());
				//bufOut.write(line.toUpperCase());
				//bufOut.newLine();
				//bufOut.flush();
				pw.println(line.toUpperCase());//將資料轉成大寫,併發回客戶端
			}
			s.close();
			System.out.println(ip+" disconnected...");
		}

	}
}
以上程式碼可能出現客戶端和服務端都在等待的問題,這是因為客戶端和服務端都有阻塞式的讀取方法,在沒有讀到結束標記的時候就都一直等待。

4.TCP複製檔案

import java.io.*;
import java.net.*;

class UploadTextClient 
{
	public static void main(String[] args) throws Exception
	{
		Socket s = new Socket("192.168.31.1",10007);

		//System.out.println("nimei");

		BufferedReader bufr = new BufferedReader(
			new FileReader("client.txt"));

		PrintWriter pw = new PrintWriter(s.getOutputStream(),true);

		String line = null;
		while((line=bufr.readLine())!=null)
		{
			pw.println(line);
		}
		/*
		  關閉客戶端的輸出流,相當於在流中加入一個結束標記-1
		  否則服務端的讀取流讀不到結束標記而一直處於等待,
		  客戶端讀不到服務端的返回資料也一直處於等待。
		*/
		s.shutdownOutput();

		BufferedReader bufIn = new BufferedReader(
			new InputStreamReader(s.getInputStream()));
		System.out.println(bufIn.readLine());
	
		bufr.close();
		s.close();
	}
}

class UploadTextServer 
{
	public static void main(String[] args) throws Exception
	{
		ServerSocket ss = new ServerSocket(10007);

		Socket s = ss.accept();
		String ip = s.getInetAddress().getHostAddress();
		System.out.println(ip+" connected...");

		BufferedReader bufIn = new BufferedReader(
			new InputStreamReader(s.getInputStream()));
		PrintWriter pw = new PrintWriter(new FileWriter("server.txt"),true);
		
		String line = null;
		while((line=bufIn.readLine())!=null)
		{
			pw.println(line);
		}

		PrintWriter out = new PrintWriter(s.getOutputStream(),true);
		out.println("上傳成功");

		pw.close();
		s.close();
		ss.close();
	}
}

---------------------- ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ----------------------

相關推薦

黑馬程式設計師-JAVA高階網路程式設計PART1

---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ---------------------- 這部分的主要知識點: 1.網路程式設計概述; 2.UDP傳輸; 3.TCP傳輸。 一、網路程式設計概述

黑馬程式設計師-JAVA高階網路程式設計PART2

---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ---------------------- 這部分的知識點主要有: 1.TCP傳輸的幾個應用; 2.瀏覽器訪問伺服器。 一、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.函式的