當前位置:才華齋>IT認證>JAVA認證>

java網路程式設計基本知識

JAVA認證 閱讀(2.52W)

java網路程式設計的基本知識不少,下面yjbys小編為大家分享最新最全java中網路程式基本知識,歡迎參考學習!

java網路程式設計基本知識

  網路基本知識:

在java中網路程式有兩種協議:TCP和UDP,TCP通過握手協議進行可靠的連線,UDP則是不可靠連線。

IP地址:用於標記一臺計算機的身份證。

IP地址由網路地址(確定網路)和主機地址(網路中的主機)組成。

子網掩碼:為了區分網路地址和主機地址。

IP地址分為A類地址、B類地址、C類地址(常用)、D類地址、E類地址。

(localhost)是本機地址。

  IPV4和IPV6

IPV4使用4個十進位制數表示,即32位二進位制。

SMTP是簡單郵件傳輸協議,埠號是25.

telnet用於連線遠端計算機或者因特網計算機提供的服務。每個服務都會設定一個埠。

給出類似 telnet ip port 即可和特定的服務進行通訊

如果要連線因特網的服務,不僅要給出埠,還要給出計算機的名稱,只有給出IP地址和埠號時,才能夠請求服務,並接收到應答。

  URL和URI

URI:統一資源識別符號,用於標識一個web資源,包含了兩個部分。

(1)URL:統一資源定位符。能夠精確的定位資料的URI

(2)URN:統一資源名稱。除了URL的URI

在java中URI和URL是分開的兩個類,URI類專門用於解析,URL用於通訊。

  URL

分類

絕對和相對:

(1)絕對URI是指有確定的協議。比如http,ftp。後面以/進行分隔

(2)相對URI是沒有scheme的。

透明和不透明:

(1)不透明URI是不能夠被解析的URI。不透明URI是絕對URI。scheme後面的部分不是以/進行分割。

分層和不分層:

(1)分層是絕對透明URI或相對URI。

所有的網頁埠都是80.

的作用:

(1)解析

URI的格式

[scheme:]scheme-specific-part[#fragment]

scheme表示用的協議,可以是httphttpsftpfile等。

scheme-specific-part是其餘部分。

進一步細分:

[scheme:][//authority][path][?query][#fragment]

常用方法:

getScheme()獲得scheme;

getSchemeSpecificPart()

getPath()

getAuthority()

(2)相對識別符號和絕對識別符號的轉換

resolve和relative函式。

  URL和URLConnection

  URL的作用

1.如果想要獲取某個網頁的原始碼,比如 則只需要:

(1)URL url = new URL("");

(2)Scanner in = new Scanner(Stream());

即可.

2.獲取訊息頭資訊

URLConnection connection = Connection();

eaderFields()返回一個Map>

ontentLength();

ontentType();

oOutput(true)獲得輸出流

utputStream();

nputStream();

在網頁中如果要提交資料給web伺服器,通常要把資料傳送給web伺服器,然後web伺服器委派一個指令碼對資料進行處理,返回一個相應。

通常傳送資料的方法有兩種:get和post。

(1)get方法是直接把資料跟在url的後面,以name=value進行傳輸,

每個資料之間用&進行分割,value中的空格用+替換,非字母數字用%替換,並後跟兩個16進位制數,這種編碼方式稱為URL編碼。URLEncoder和URLDecoder

(2)post方法是通過URLConnection傳送給伺服器,編碼方式和get一樣。de(VALUE,"UTF-8");

一般在傳輸中文時會運用編碼和解碼。

示例:通過URLEncoder和URLDecoder編碼和解碼

InetAddress 根據域名得到IP地址或名稱

沒有構造方法,通過:

(1)InetAddress i1 = yName(String)返回一個InetAddress例項。

(2)如果一個地址有多個ip地址,比如google,有3個ip地址,就呼叫InetAddress[] i2 = llByName(String);

ocalhost()獲得本機的InetAddress例項。

Socket(TCP)

Socket是一個用於機器之間通訊的類。

Socket客戶端:

(1)Socket s = new Socket(ip,port);開啟一個套接字,傳送請求

(2)InputStream istream = nputStream();接收資料

(3)OutputStream ostream = utputStream();傳送資料

需要用PrintWriter和Scanner進行包裝,並且注意PrintWriter的自動緩衝。

Socket伺服器:注意多個客戶端同時訪問伺服器的問題:多執行緒

(1)ServerSocket server = new ServerSocket(port);建立一個埠

(2)Socket s = pt(); 只有當有客戶端請求並連線,函式才會返回

(3)InputStream istream = nputStream();接收資料

(4)OutputStream ostream = utputStream();傳送資料

需要用PrintWriter和Scanner進行包裝,並且注意PrintWriter的自動緩衝。

我們在使用PrintWriter時需要使用println()函式;

當伺服器或客戶端任意一方請求結束通訊,則立刻停止。

問題1:在套接字中會發生阻塞的地方:

(1)例項化Socket時,會阻塞。

(2)在Line()類似操作時會阻塞。

解決方法:

(1)對於第一個問題,解決方法:

Socket s = new Socket();建立無連線socket

ect(new InetSocketAddress(host,port),timeout);設定超時。

(2)對於第二個問題,解決方法是設定oTimeout(long)設定超時時間

問題2:當客戶端想要關閉套接字時,但卻不能確定伺服器是否還在傳送資料,但是隻要一關閉就立刻斷開。

解決方法:

downOutput()關閉輸出流

downInput()關閉輸入流

  綜合程式碼舉例:實現一個簡單的對等通訊程式,通過多執行緒,一個執行緒接收資料,一個執行緒傳送資料。

  使用者1:

[java] view plain copy

import .*;

import .*;

import .*;

public class Client{

public static void main(String[]args)throws Exception{

Socket s = new Socket("localhost",8819);

PrintWriter out = new PrintWriter(utputStream(),true);

Thread t = new Thread(new Receive(s));

t();

//以下程式碼用於傳送資料

Scanner in = new Scanner();//鍵盤輸入

while(extLine()){ //一直不斷

tln(Line()); //傳送鍵盤輸入資料

}

}

}

class Receive implements Runnable //這個類用於接收資料

{

private Socket s;

public Receive(Socket s)

{

this.s = s;

}

public void run()

{

try{

Scanner in = new Scanner(nputStream()); //in:接收資料

String str = null;

while(true)

{

str = Line();

tln("伺服器說:"+str); //列印接收資料

}

}

catch(Exception e){}

}

}

  使用者2:

[java] view plain copy

import .*;

import .*;

import .*;

public class Server{

public static void main(String[]args)throws Exception{

ServerSocket server = new ServerSocket(8819);

Socket s = pt();

PrintWriter out = new PrintWriter(utputStream(),true);

Thread t = new Thread(new Receive1(s));

t();

//以下程式碼用於傳送資料

Scanner in = new Scanner();//鍵盤輸入

while(extLine()){ //一直不斷

tln(Line()); //傳送鍵盤輸入資料

}

}

}

class Receive1 implements Runnable //這個類用於接收資料

{

private Socket s;

public Receive1(Socket s)

{

this.s = s;

}

public void run()

{

try{

Scanner in = new Scanner(nputStream()); //in:接收資料

String str = null;

while(true)

{

str = Line();

tln("客戶端說:"+str); //列印接收資料

}

}

catch(Exception e){}

}

}

以上的程式屬於C/S,需要同時維護客戶端和伺服器的程式碼。

B/S:瀏覽器和伺服器,只需要維護一方程式碼即可。