1. 程式人生 > >JAVA網路程式設計(一)

JAVA網路程式設計(一)

一、概念

Sockets:

使用TCP協議實現的網路通訊Socket相關的類

Datagram:

使用UD協議,將資料儲存在使用者資料報中,通過網路進行通訊。

Socket在應用層之下,傳輸層之上的介面層(作業系統提供給使用者訪問網路的系統介面)

Socket套接字:

網路上具有唯一標識的IP地址和埠組合一起才能構成唯一能識別的識別符號套接字。

       Socket原理機制:

                         通訊的兩端都有Socket

                         網路通訊其實就是Socket間的通訊

                          資料在兩個socket傳送是通過IO流

 

二、TCP程式設計

 java中基於TCP協議實現網路通訊的類

   客戶端: Socket

   服務端:serverSocket

 

2-1:socket通訊的步驟

  1. 建立serverSocket和Socket
  2. 開啟連線到socket的輸入和輸出流
  3. 按照協議對socket進行讀/寫操作
  4. 關閉輸入/輸出流,關閉socket

2-1-1:伺服器端

  1. 建立ServerSocket物件,繼續監聽埠
  2. 通過accept()方法監聽客戶端請求
  3. 連線建立後,通過輸入流讀取客戶端傳送的請求資訊
  4. 通過輸出流向客戶端傳送響應資訊
  5. 關閉相關資源
  6. package com.demo.demo.demo2;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class TcpServer {
    	public static void main(String[] args) throws IOException {
    		//建立一個伺服器端的socket,指定埠,並監聽該埠
    		ServerSocket sc=new ServerSocket(80);
    		try {
    			//
    			Socket scc=sc.accept();
    		   InputStream in= scc.getInputStream();
    		   InputStreamReader inr=new InputStreamReader(in);
    		   BufferedReader br= new BufferedReader(inr);
    		   String info=null;
    		   while((info=br.readLine())!=null){
    			   System.out.println("客戶端:"+info);
    		   }
    		   //socket關閉輸入流
    		  scc.shutdownInput();
    		  OutputStream out=scc.getOutputStream();
    		  PrintWriter ww=new PrintWriter(out);
    		  ww.write("你好啊。客戶端");
    		  ww.flush();
    		  scc.shutdownOutput();
    		  ww.close();
    		  out.close();
    		  br.close();
    		  inr.close();
    		  in.close();
    		  scc.close();
    		  sc.close();
    		  
    			
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    	}
    
    }
    

2-1-2客戶端

  1. 建立socket物件,指明需要連線的伺服器的地址和埠號
  2. 連線建立後。通過輸出流向伺服器端傳送請求資訊
  3. 通過輸入流獲得伺服器相應的資訊
  4. 關閉相關資訊
package com.demo.demo.demo2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class TcpClient {
	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket sc=new Socket("localhost",80);
		OutputStream oo=sc.getOutputStream();
		PrintWriter pr=new PrintWriter(oo);
		pr.write("我是一號客戶端");
		pr.flush();
		sc.shutdownOutput();
		InputStream is=sc.getInputStream();
		InputStreamReader re=new InputStreamReader(is);
		BufferedReader rrr=new BufferedReader(re);
		String info=null;
		while((info=rrr.readLine())!=null){
			System.out.println(info);
		}
		
		sc.shutdownInput();
		rrr.close();
		re.close();
		re.close();
		pr.close();
		oo.close();
		
	}

}

2-1-3:套接字超時(客戶端)

             1. 可為套接字設定超時操作,即:當讀寫操作沒有在規定時間內完成,則會丟擲SocketTimeoutException異常

                           通過方法:  setSoTimeout(毫秒數)   設定

              2. new 出socket(String host,int port),這個socket會一直阻塞,直到建立起初始連線為止。

                           可先建立無連線的套接字,再使用一個超時來連線的方式解決問題。

         

//--------當socket沒有建立起與主機的初始連線,會一直阻塞----------------
Socket s=new Socket("192.168.1.1","80")

//-----------------------解決方式---------------------10s---
Socket s=new Socket();
s.connect(new InetSocketAddress("192.168.1.1","80"),10000 );

2-1-4:關於因特網地址

package com.demo.demo.demo2;

import java.net.InetAddress;
import java.net.UnknownHostException;
public class InternetAdd {
	public static void main(String[] args) throws UnknownHostException {
		InetAddress[] an=InetAddress.getAllByName("www.baidu.com");
		
		for(InetAddress a :an){
			System.out.println(a);
		}
		
		
		
	}
}

2-1-5:應用多執行緒實現伺服器與多客戶端之間的通訊

  1. 伺服器端建立ServerSocket,迴圈呼叫accept()等待客戶端連線
  2. 客戶端建立一個socket並請求與伺服器端連線。
  3. 伺服器接受請求,建立socket與客戶端建立專線連線
  4. 建立連線的兩個socket在一個單獨的執行緒上對話
  5. 伺服器繼續等待新的連線

三、UDP程式設計

UDP協議(使用者資料報協議)是無連線的,不可靠的,無序的,速度的

         進行資料傳輸中,首先將要傳輸的資料定義為資料報,大小限制為64k,在資料報中指明資料所要達到的Socket(主機地址和埠號),然後再將資料報傳送出去

         DatagramPacket類:表示資料報包

         DatagramSocket類 :進行端到端通訊的類

 

3-1:伺服器端實現步驟

         建立DatagramSocket,指定埠號

         建立DatagramSocket

         接收客戶端傳送的資料資訊

         讀取資料

3-2:客戶端實現步驟

定義傳送資訊

建立DatagramPacket,包含將要傳送的資訊

建立DatagramSocket

傳送資料

四、注意