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