Tổng hợp JAVA Lập trình mạng ( phần 3 )

chuotfx

Member
4/4/10
365
25
18
Chào anh chị em !

Hôm này lại tiếp tục chứ, đáng lẽ là viêt tiếp vào phần 2 , nhưng mà mình thấy nó cũng quan trọng nên tách riêng ra vậy

Các bạn có thể theo dõi các bài khác ở đây:

Phần 1 : IPAddress
Phần 2 : URL

bây giờ tiếp tục với URLConnection
==============================================
URLConnection

Là một lớp trừu tượng biểu diển 1 liên kết tích cực tới 1 tài nguyên xác định bởi 1 URL
Nó có 2 mục đích như thế này :
1) Với nó thì cung cấp cho chúng ta nhiều khả năng điều khiển hơn URL , qua việc tương tác với server. Có thể kiểm tra các headerMINE, download các file nhị phân, gởi dữ liệu trở lại server qua POST​
2) Nó là 1 phần của cơ chế quản lý giao thức, cớ chế này còn bao gôm cả lớp URLStreamHandler.Ý tưởng đằng sau các trình quản trị giao thức rất đơn giản : chúng cho phép bạn phân tách các chi tiết xữ lý một giao thức với việc xử lý các kiểu dữ liệu cụ thể, cung cấp các giao diện người dùng và thực hiện các công việc khác mà một trình duyệt thường làm. Lớp cơ sở URLConnection là 1 lớp trường tượng, để cài đặt một giao thức cụ thể bạn cần phải viết một lớp con, các lớp con này có thể đc tải bởi các ứng dụng của riêng bạn hay bởi các trình duyệt Hotjava; trong tương lai, các ứng dụng java có thể tải về các trình quản lý giao thức khi cần ( cái này hơn giống đám mây điện toán , lúc xưa mà đã nghĩ xâu xa thế này thì cũng phục thật :D )

-------------------------------
Mở 1 URLconnection
1 chương trình sử dụng nó thì thông qua các bước sau đây :

1. Construct a URL object. ( xây dựng 1 đối tượng URL )
2. Invoke the URL object's openConnection( ) method to retrieve a URLConnection object for that URL. ( Gọi phương thức openConnection() của đối tượng URL để tìm kiếm 1 đối tượng URLConnection cho URL đó )
3. Configure the URLConnection. (Cấu hình nó)
4. Read the header fields. (Đọc các trường header, bạn nào thắc mặc header là gì ? , thì đó các các trường cung cấp thông số của 1 tài liệu trên mạng, điển hình là các web nếu bạn nào làm với php thì chắc rõ nhất, phần này sẽ demo ở dưới là hiểu liền)
5. Get an input stream and read data. ( Lấy 1 luồng nhập và đọc dữ liệu )
6. Get an output stream and write data. ( Lấy 1 luồng xuất và ghi dữ liệu )
7. Close the connection ( đóng kết nối )


Cài này thì hù bà con cho vui thui chứu kô ai làm hết các thủ tục này trong cùng 1 chương trình
Code cho kết nối là :

PHP:
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class getUrlConnection {
	public static void main(String[] args) {
		URL u;
		URLConnection uc;
		try {
			u = new URL("http://congdongjava.com");
			uc=u.openConnection();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
---------------------------------------

đọc dữ liệu từ server

Cũng như trên thì ta có các bước sau

1. Construct a URL object.
2. Invoke the URL object's openConnection( ) method to retrieve a URLConnection object for that URL.
3. Invoke the URLConnection's getInputStream( ) method.
4. Read from the input stream using the usual stream API.


Chắc mình kô cần dịch chứ, cái này trả về 1 InputStream thì quá dễ rồi, tương tự với URL vậy :D

Code down mã nguồn của 1 trang web
PHP:
import java.net.*;
import java.io.*;

public class SourceViewer2 {

  public static void main (String[] args) {
    if  (args.length > 0) {
      try {
        //Open the URLConnection for reading
        URL u = new URL(args[0]);
        URLConnection uc = u.openConnection( );
        InputStream raw = uc.getInputStream( );
        InputStream buffer = new BufferedInputStream(raw);       

        // chain the InputStream to a Reader
        Reader r = new InputStreamReader(buffer);
        int c;
        while ((c = r.read( )) != -1) {
          System.out.print((char) c);
        } 
      }

      catch (MalformedURLException ex) {
        System.err.println(args[0] + " is not a parseable URL");
      }
      catch (IOException ex) {
        System.err.println(ex);
      }
    }
  }
}
----------------------------

Đọc các trường Header

HTTP server cung cấp một lượng thông tin thật trong đầu mục cho các phúc đáp từ client. Ví dụ header của 4rum là :

Date: Sat, 26 Mar 2011 07:48:35 GMT
Server: Apache/2.2.3 (CentOS)
X-Powered-By: PHP/5.1.6
Expires: 0
Cache-Control: private, post-check=0, pre-check=0, max-age=0
Pragma: no-cache
X-UA-Compatible: IE=7
Set-Cookie: bbsessionhash=5a3701f09f59a4f7f8cd87d16deaeaef; path=/; HttpOnly
Set-Cookie: bblastvisit=1301125715; expires=Sun, 25-Mar-2012 07:48:35 GMT; path=/
Set-Cookie: bblastactivity=0; expires=Sun, 25-Mar-2012 07:48:35 GMT; path=/
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8
Code để lấy header

PHP:
import java.net.*;
import java.io.*;
import java.util.*;

public class HeaderViewer {

  public static void main(String args[]) {

    for (int i=0; i < args.length; i++) {
      try {
        URL u = new URL(args[i]);
        URLConnection uc = u.openConnection( );

        System.out.println("Content-type: " + uc.getContentType( ));
        System.out.println("Content-encoding: " + uc.getContentEncoding( ));
        System.out.println("Date: " + new Date(uc.getDate( )));
        System.out.println("Last modified: " + new Date(uc.getLastModified( )));
        System.out.println("Expiration date: " + new Date(uc.getExpiration( )));
        System.out.println("Content-length: " + uc.getContentLength( ));
      }
      
      catch (MalformedURLException ex) {
        System.err.println(args[i] + " is not a URL I understand");
      }

      catch (IOException ex) {
        System.err.println(ex);
      }      
      System.out.println( ); 
    }   
  }
}
Bạn cần quan tâm tới các tường này thui :
• Content-type
• Content-length
• Content-encoding
• Date
• Last-modified
• Expires

Ta xét tới các phương thức là :

1) Public String getContentType() trả về nội dung MIME của dữ liệu, nó phụ thuộc vào server gởi 1 header MIME tương ứng, bao gồm kiểu nội dung xác thực.
Các kiểu nội dùng phổ biến là : text/htm, text.plain, image/gif, image/jpeg... nếu kô thì sẽ trả về 1 ngoại lêk
2) Public int getContentLength() lấy chiều dài nội dung header
3) getContentEncoding() cách thức mã hóa dữ liệu, nếu kô có thì trả về null, kô có ngoại lệ
4) public long getDate()
5) public long getExpiration()
6) public long getLastModified()


Các phương thức đó đọc qua cũng hiểu nó làm già rồi chứ
6 cái trên là các phương thức cở bản để lấy mấy cái cơ bản của 1 header, nhưng mà header còn có nhiều thức khác nữa, vấn đề này đc giải quyết như sau :

Chúng ta có phương thức :

String getHeaderField(String name) trả về giá trị của header với tham số truyền vào là tên của nó

Vidu :
PHP:
String contentType = uc.getHeaderField("content-type");

String contentEncoding = uc.getHeaderField("content-encoding"));

String data = uc.getHeaderField("date");

String expires = uc.getHeaderField("expires");

String contentLength = uc.getHeaderField("Content-length");

Các bạn nên nhớ là nó đề trả về string, với 1 số trường như Date thì bạn phải ép kiểu về, bây giờ thì thấy sự khác biệt ở trên kô :D

Nếu làm như thế thì bạn phải nhớ tên của từng trường, thế thì cũng mệt nên có thêm 1 phương thức nữa :

String getHeaderField(int n) -> nội dung của header thứ n
String getHeaderFieldKey(int n) -> tên của header thứ n


Code lấy tất cả header

PHP:
import java.net.*;
import java.io.*;

public class AllHeaders {

  public static void main(String args[]) {

    for (int i=0; i < args.length; i++) {
      try {
        URL u = new URL(args[i]);
        URLConnection uc = u.openConnection( );
        for (int j = 1; ; j++) {
          String header = uc.getHeaderField(j);
          if (header == null) break;
          System.out.println(uc.getHeaderFieldKey(j) + ": " + header);
        }
      }

      catch (MalformedURLException ex) {
        System.err.println(args[i] + " is not a URL I understand.");
      }
      catch (IOException ex) {
        System.err.println(ex);
      }
      System.out.println( );
    }
  }
}
Các phương thức RequestProperty :
Bốn phương thức sau kô thực hiện bất kỳ công việc gì có trong lớp cơ sở URLConnectuin, cũng kô đc cài đặt trong các lớp con là FileURLConnection hoặc HttpConnection. Thật sự phần này kô hiểu lắm, nhưng viết ra luôn cho đủ sãnh vậy.
1) Public String getRequestProperty( string property_name)
2) Public static void setDefaultRequestProperty( String property_name, String property_value)
3) Public String setRequestProperty( string property_name,String property_value)
4) Public String getDefaultRequest ( string property_name)
5) Protected URL Connection(URL u)
Còn lại là các phương thức khác, nó quá dài các bạn có thể tự tìm hĩu vậy.

Mệt quá đi, thui bửa sau là tới lập trình rồi đó, :D
 
  • Like
Reactions: 1102hero

minhtanbk

New Member
20/9/10
10
0
1
Ðề: Tổng hợp JAVA Lập trình mạng ( phần 3 )

Bác tiến ơi giúp xem cái bài về URLconnection giùm với ,mình đang làm bài upload 1 file lên server ,ở đây dùng httpURLconnection, mình cũng tìm hiểu trên mạng rồi ,rất nhiều code , nhưng gặp phải vấn đề là nó đẩy hết các post đi mà trên server không tạo dc file vừa up lên ,bác xem giúp với .

đây là code :

PHP:
 public synchronized boolean uploadFileHTTP ()
  {
        String url = "http://localhost/maychu";
        String docPath = "D:\\doc file.txt";    // Document

        try
        {
        HttpURLConnection httpcon = (HttpURLConnection) ((new URL(url).openConnection()));
        httpcon.setDoOutput(true);
        httpcon.setUseCaches(false);
        httpcon.setRequestProperty("Content-Type", "multipart/form-data");
        httpcon.connect();

        System.out.println("Posting " +docPath +"...");
        File file = new File(docPath);
        FileInputStream is = new FileInputStream(file);
        OutputStream os = httpcon.getOutputStream();

        // POST
        // Read bytes until EOF to write
        byte[] buffer = new byte[4096];
        int bytes_read;    // How many bytes in buffer
        while((bytes_read = is.read(buffer)) != -1) {
            os.write(buffer, 0, bytes_read);
        }
        os.close();
        is.close();
        
        System.out.println("Done...");
        return true;
      }
        catch(IOException e){
            System.out.println(e);
            return false;
        }
    }
 

chuotfx

Member
4/4/10
365
25
18
Ðề: Tổng hợp JAVA Lập trình mạng ( phần 3 )

ác,mới hết bệnh xong, cái này chĩ là tìm hiễu sơ qua, vì mình chú tâm vào tcp và udp, còn http thì kô có.
Mà http hình như là kô có truyền file còn về post hay get thì học php cũng hĩu rồi, nó chĩ gởi lên server các biến và các yêu cầu thui, còn truyền file bằng http thì chừ mới thấy :(
 

minhtanbk

New Member
20/9/10
10
0
1
Ðề: Tổng hợp JAVA Lập trình mạng ( phần 3 )

hic vậy cái đề tài mình upload file bằng http làm sao đây trời :((
 

jCoder

New Member
18/4/11
2
0
0
Ðề: Tổng hợp JAVA Lập trình mạng ( phần 3 )

về phần đọc dữ liệu từ server, các bác cho em hỏi làm thế nào để đọc được các file có chứa các kí tự unicode như Tiếng Việt.
Như ví dụ đọc code HTML của trang http://m.news.zing.vn/ dưới đây,
với mấy từ chỉ có một kí tự đặc biệt bị chuyển thành dấu ? (VD: Âm Nhạc -> ?m Nhạc, Giải Trí -> Gi?i Trí)
Làm thế nào để đọc được Tiếng Việt nguyên vẹn vậy ạ?
Đây là code của em:
PHP:
mport java.net.*; 
import java.io.*; 

public class SourceViewer { 

	// get URL Content method
	private static CharSequence getURLContent(String _url) { 

		StringBuilder string = new StringBuilder(1000000);
		try{
			URL url = new URL(_url);
			URLConnection urlConn = url.openConnection();

			BufferedReader in = new BufferedReader (new InputStreamReader(urlConn.getInputStream(),"utf8"));

	    	String line;
	    	while((line = in.readLine()) != null){
	    		string.append(line);
	    		System.out.println(line);
	    		string.append("\n");
	    	}

	    	in.close();

		} catch(MalformedURLException e){
			System.err.printf("MalformedURLException: %s\n", e.getMessage());
		} catch(IOException e){
			System.err.printf("IOLException: %s\n", e.getMessage());
		}

        return string;

	} // end method getURLContent
	
	public static void main(String[] args){
				System.out.println(getURLContent("http://m.news.zing.vn/"));				
	}	
}
 

chuotfx

Member
4/4/10
365
25
18
Ðề: Tổng hợp JAVA Lập trình mạng ( phần 3 )

vấn đề này đi ra khỏi lập trình mạng rồi, pác nào biết tạo stream hay buffer mà encoding là utf-8 thì chĩ đi.

do đang bận làm đồ án + bị đau nên kô tiếp tục đc, sau đợt đồ án này thì làm lun sãnh về lập trình với tcp,udp, multicast....