java網絡編程基本知識
java網絡編程的基本知識不少,下面yjbys小編為大家分享最新最全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:瀏覽器和服務器,只需要維護一方代碼即可。
-
java工程師認證考試考點:數據庫服務區考點彙總
關於java認證考試,同學們知道數據庫及服務器的知識點有哪些?下面跟yjbys小編一起來複習一下吧!(一)服務器1、web服務器nginx和apache的對比分析①nginx相對於apache的優點:輕量級,同樣起web服務,比apache佔用更少的內存及資源,抗併發,nginx處理請求是異步非阻塞的,而a...
-
2016年Java考試精選程序閲讀題
1.寫出以下程序的運行結果。classFirst{First(){tln("inFirst");}}publicclassSecondextendsFirst{Second(){tln("inSecond");}publicstaticvoidmain(String[]args){Secondmine=newSecond();}}程序運行的結果:inFirstinSecond2.解釋程序中語句的'含義純文本文...
-
java有哪幾種認證
Sun認證Java程序員考試內容涉及Java所有相關知識、編程概念及applet開發技巧。以下是小編整理的關於java的認證種類,希望大家認真閲讀!Java程序員認證一、怎樣可以獲得Sun公司的Java認證?如果你希望取得Sun公司Java認證,那麼必須通過Java程序員(SCJP)的考試。授...
-
java網絡編程基本知識
java網絡編程的基本知識不少,下面yjbys小編為大家分享最新最全java中網絡程序基本知識,歡迎參考學習!網絡基本知識:在java中網絡程序有兩種協議:TCP和UDP,TCP通過握手協議進行可靠的連接,UDP則是不可靠連接。IP地址:用於標記一台計算機的身份證。IP地址由網絡地址(確...