Java中取得當前項目的根目錄: TestPath.class.getResoure(「/template.html」).getPath(); TestPath.class.getResoure(「/template.html」).getFile(); UDP只能在局域網傳輸數據,傳輸到外網須要打洞穿透 打洞:內網到外網的穿透 手機聯網:紅外線或者無線網 Interrupt()中止線程 Socket:若是要實現實時通信,必須使用socket網絡編程 分類: TCP: UDP: 計算機硬件有七層網絡傳輸協議 Java實現Socket: serverSocket(端口號):表明服務器 Socket(服務器Ip,端口號):表明客戶端 Socket分爲2大類: 1)、TCP 傳輸控制協議 是面向鏈接的協議安全,可靠的. 也就是說,在收發數據前,必須和對方創建可靠的鏈接。 一個TCP鏈接必需要通過三次「對話」才能創建起來,其中的過程很是複雜,只簡單的描述下這三次對話的簡單過程: 主機A向主機B發出鏈接請求數據包:「我想給你發數據,能夠嗎?」,這是第一次對話; 主機B向主機A發送贊成鏈接和要求同步(同步就是兩臺主機一個在發送,一個在接收,協調工做)的數據包:「能夠,你何時發?」,這是第二次對話; 主機A再發出一個數據包確認主機B的要求同步:「我如今就發,你接着吧!」,這是第三次對話。三次「對話」的目的是使數據包的發送和接收同步,通過三次「對話」以後,主機A才向主機B正式發送數據 2)、UDP 用戶數據報協議 (1) UDP是一個非鏈接的協議,傳輸數據以前源端和終端不創建鏈接,當它想傳送時就簡單地去抓取來自應用程序的數據,並儘量快地把它扔到網絡上。在發送端,UDP傳送數據的速度僅僅是受應用程序生成數據的速度、計算機的能力和傳輸帶寬的限制;在接收端,UDP把每一個消息段放在隊列中,應用程序每次從隊列中讀一個消息段。 (2) 因爲傳輸數據不創建鏈接,所以也就不須要維護鏈接狀態,包括收發狀態等,所以一臺服務機可同時向多個客戶機傳輸相同的消息。 (3) UDP信息包的標題很短,只有8個字節,相對於TCP的20個字節信息包的額外開銷很小。 (4) 吞吐量不受擁擠控制算法的調節,只受應用軟件生成數據的速率、傳輸帶寬、源端和終端主機性能的限制。 (5)UDP使用盡最大努力交付,即不保證可靠交付,所以主機不須要維持複雜的連接狀態表(這裏面有許多參數)。 (6)UDP是面向報文的。發送方的UDP對應用程序交下來的報文,在添加首部後就向下交付給IP層。既不拆分,也不合並,而是保留這些報文的邊界,所以,應用程序須要選擇合適的報文大小。 咱們常用「ping」命令來測試兩臺主機之間TCP/IP通訊是否正常,其實「ping」命令的原理就是向對方主機發送UDP數據包,而後對方主機確認收到數據包,若是數據包是否到達的消息及時反饋回來,那麼網絡就是通的。 TCP服務器端代碼示例: public class Server { private static ServerSocket server=null; private static PrintWriter out=null; private static BufferedReader reader=null; private static Map<String,Socket> userMessages=new Hashtable<String, Socket>(); private static void first(){ try { //服務器啓動 server=new ServerSocket(1888); while(true){ //有客戶鏈接時 Socket client=server.accept(); //保存客戶端信息,ip、socket userMessages.put(client.getInetAddress().getHostAddress(), client); //開闢線程處理數據 new Thread(new Runnable() { @Override public void run() { try { //取得輸出流 out=new PrintWriter(client.getOutputStream(),true); //取得輸入流 reader=new BufferedReader(new InputStreamReader(client.getInputStream(),"utf-8")); out.println("歡迎登錄"); String message=reader.readLine(); } catch (IOException e) { e.printStackTrace(); } } }).start(); } } catch (IOException e) { e.printStackTrace(); }finally{ if(server!=null){ try { server.close(); } catch (IOException e) { e.printStackTrace(); } } } } public static void main(String[] args) { first(); } } TCP客戶端代碼示例: public class Client { private static Socket client = null; private static PrintWriter out = null; private static BufferedReader reader = null; public static void main(String[] args) { try { client=new Socket("192.168.1.102",1888); out=new PrintWriter(client.getOutputStream().true); reader=new BufferedReader(new InputStreamReader(client.getInputStream())); //向服務器發送信息 out.println(""); //服務器發送過來的數據保存到變量 String message=reader.readLine(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } UDP服務器實例: public static void main(String[] args) { // 一、建立一個服務器 套接字 DatagramSocket server = null; try { server = new DatagramSocket(18899); // 二、定一個字節 數組來接收數據 byte[] data = new byte[1024]; // 三、定義一個數據包對象 DatagramPacket recePacket = new DatagramPacket(data, data.length); // 四、阻塞式的接收 server.receive(recePacket); System.out.println("*************客戶端來消息了***********"); // 五、打印消息 String msg = new String(recePacket.getData(), 0, recePacket.getLength()); // 六、向發過來的那個客戶端回覆點消息 InetAddress addr = recePacket.getAddress(); // 客戶端的IP int port = recePacket.getPort(); // 客戶端的端口號 System.out.println(addr.toString()+"-"+port+":客戶端發過來的消息是:" + msg); // 七、回覆 :收到了 String str = "收到了"; byte[] buf = str.getBytes(); // 八、建立一個發送的報文 DatagramPacket sendPacket = new DatagramPacket(buf, buf.length, addr, port); server.send(sendPacket); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (server != null) { server.close(); } } } UDP客戶端實例: public static void main(String[] args) { //建立一個客戶端 DatagramSocket client=null; try { client=new DatagramSocket(); //向服務器發送消息 String str="客戶端測試消息!"; byte[] buf=str.getBytes(); //三、定義服務器的IP InetAddress addr=InetAddress.getByName("192.168.16.171"); //四、建立一個數據報對象 DatagramPacket sendPacket=new DatagramPacket(buf, buf.length, addr, 18899); //五、發送消息 client.send(sendPacket); //六、客戶端等待服務器發送過來的消息 byte[] data=new byte[1024]; DatagramPacket recePacket=new DatagramPacket(data, data.length); //七、客戶阻止式的接收消息 client.receive(recePacket); //八、把消息轉換成字符串 String msg=new String(recePacket.getData(),0,recePacket.getLength() ); System.out.println("服務器回覆的消息是:"+msg); } catch (SocketException e) { e.printStackTrace(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ if(client!=null){ client.close(); } } } XML讀取文件實例: public static void main(String[] args) { String xmlPath="c:\\1.xml"; //一、建立一個SAXReader SAXReader sax=new SAXReader(); try { //二、讀取文件 Document document=sax.read(new File(xmlPath)); //三、取得doucumet文檔的根節點 ( document.getElement????) Element root= document.getRootElement(); //四、獲得根節點下面的子節點 List allEntry= root.elements("entry"); //五、循環遍歷每個節點 for(Object obj : allEntry){ Element ele=(Element) obj; System.out.println("編號:"+ele.elementTextTrim("id")); System.out.println("標題:"+ele.elementTextTrim("title")); //做者的節點 Element authorElement=ele.element("author"); System.out.println("做者:"+authorElement.elementTextTrim("name")); //取得連接地址的屬性 Element linkElement=ele.element("link"); String link=linkElement.attributeValue("href"); System.out.println("鏈接地址:"+link); System.out.println("推薦次數:"+ele.elementTextTrim("diggs")); System.out.println("瀏覽次數:"+ele.elementTextTrim("views")); System.out.println("回覆次數:"+ele.elementTextTrim("comments")); System.out.println("\n--------------------------------------------------------"); } } catch (DocumentException e) { e.printStackTrace(); } }