筆記之_Java整理socket

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();
        }
    }
相關文章
相關標籤/搜索