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

chuotfx

Member
4/4/10
365
25
18
URL
Cách đơn giản nhất để 1 chương trình java định vị và tim kiếm dữ liệu là sử dụng 1 đối tượng URL. Cái này bạn kô cần phải lo vì java đã hỗ trợ hết để bạn có thể lấy dữ liệu truyền tin.... nhiệm vụ của bạn là cho biết 1 Url.

Các contructor, để tạo 1 url thì chúng ta cần quản lý ngoại lệ của chúng ( MalformedURLException )là url kô đúng định dạng.

URL(String spec) --> tạo 1 url với 1 chuổi string
URL(String protocol, String host, int port, String file) --> như trên mà chúng ta thêm vào các thông tin về cỗng và file
URL(String protocol, String host, int port, String file, URLStreamHandler handler) --> cái này ít dùng là thêm 1 luồng để lấy dữ liệu từ url
URL(String protocol, String host, String file) --> cái này kô cần giải thích
URL(URL context, String spec) --> tạo ra 1 url từ 1 url khác, thường là url con của nó
URL(URL context, String spec, URLStreamHandler handler)



Bây giờ thì xem có những phương thức nào đáng chú ý là các thông số của url đó , như là tên, cỗng, file

String getFile()
String getHost()
String getPath()
int getPort()
String getProtocol()


code để minh họa các phương thức đó, vì nó nhiều quá nên mình là đại diện, các bạn có thể tự tìm hiểu thêm, cái này kô phải là lập trình j cã :D

PHP:
package TH_MANG;

import java.net.*;

public class testURL {
	public static void main(String[] args) {
		try{
			URL u = new URL(args[0]);
			System.out.println("Name of the file is : "+ u.getFile());
			System.out.println("Host Name is : "+u.getHost());
			System.out.println("Port number is :" + u.getPort());
			System.out.println("Protocol type is :" + u.getProtocol());
		}
		catch (MalformedURLException e) {
			// TODO: handle exception
			System.out.println(e);
		}
	}
}

nếu mà như thế này thì chã có ý nghĩa j hết đúng không các bạn. Tuy nhiên url cung cấp cho chúng ta 1 stream để lấy dữ liệu mà nó chỉ đến

nếu file là text thì ta lấy đc mã ascii của nó, ảnh thì mã nhị phân, html thì các tag....

chúng ta sử dụng ở đây là 2 phương thức:

Object getContent() --> vì trả về 1 object nên chúng ta cần tạo 1 luồng cho nó, và để lấy dữ liệu từ luồng thì phải ép kiểu về luồng

PHP:
package TH_MANG;

import java.io.IOException;
import java.io.InputStream;
import java.net.*;

public class testURL2 {
	public static void main(String[] args) {
		int i;
		try{
			URL u = new URL("http://congdongjava.com");
			
			InputStream in = (InputStream) u.getContent(); 
			
			while((i=in.read())>0){
				System.out.print((char)i);
			}
		}
		catch (MalformedURLException e) {
			// TODO: handle exception
			System.out.println("1");
		}
		catch (IOException e) {
			// TODO: handle exception
			System.out.println("2");
		}
	}
}
Làm cách này rắc rối quá , chúng ta vẫn còn 1 phương thức dễ dùng hơn, đó là :

InputStream openStream() ---> nó trả về cho chúng ta 1 stream, nếu bạn nào muốn dùng tiện hơn thì có thể thêm vào các buffer....
PHP:
try {

  URL u  = new URL("http://congdongjava.com");

  InputStream in = u.openStream( );

  int c;

  while ((c = in.read( )) != -1) System.out.write(c);

}

catch (IOException ex) {

  System.err.println(ex);

}

code để lấy mã nguồn 1 trang web, cái này lấy html thui nghe, chứ đừng mộng lấy những cái khác, đơn giản là vì cái mà hiển thị ở browers là html mà :D

PHP:
package TH_MANG;

import java.net.*;
import java.io.*;

public class SourceViewer {
  public static void main (String[] args) {

    if  (args.length > 0) {
      try {
        //Open the URL for reading
        URL u = new URL(args[0]);
        InputStream in = u.openStream( );

        // buffer the input to increase performance 
        in = new BufferedInputStream(in);       

        // chain the InputStream to a Reader
        Reader r = new InputStreamReader(in);
        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);
      }
    }
  } 
}
Và 2 phương thức hay sử dụng nữa là :

public boolean sameFile(URL other) để kiểm tra xem 2 url có cùng trỏ tới 1 file hay kô

PHP:
try {

  URL u1 = new URL("http://www.ncsa.uiuc.edu/HTMLPrimer.html#GS");

  URL u2 = new URL("http://www.ncsa.uiuc.edu/HTMLPrimer.html#HD");

  if (u1.sameFile(u2)) {

    System.out.println(u1 + " is the same file as \n" + u2);

  }

  else {

    System.out.println(u1 + " is not the same file as \n" + u2);

  }

}

catch (MalformedURLException ex) {

  System.err.println(ex);

}
tiếc là 4rum có 2 địa chĩ kô, để thử xem sao, lấy lạm cái code của họ vậy

còn cái nữa là : public String toExternalForm( ) chuyển đổi 1 đối tượng url thành 1 xâu ký tự trên hộp thoại trình duyệt, cái này chưa thử.

Còn nhiều cái hay nữa, url có thể mở 1 socket tới server và chúng ta có thể post dữ liệu lại web, mà thui để hôm khác làm thử



Với chừng này thì bạn có thể làm 1 ứng dụng java như là : hiển thị giờ , giá vàng , thời tiết...v..v..bằng cách tìm url các web nào cung cấp thông tin , và vấn đề bây giờ là phân tích mã nguồn lấy về để hiển thị, lúc nào rãnh thì demo thử cho vui :D


Tổng hợp JAVA Lập trình mạng (phần 1) : http://congdongjava.com/showthread.php?t=4420
 

HoangLuongNgoc

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

chuotfx ơi, mình có bài tập thế này.
yêu cầu lấy về thông tin kết quả hàng ngày (8 giải ) trong trang ketqua888.com rùi in ra từng giải một hoặc cả 8 giải khi có yêu cầu xem giải
cậu có thể giúp mình được không.
mình tìm hiểu hoài mà ko ra.
 

chuotfx

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

Hình như mình nhớ kô nhầm thì java có hỗ trợ các hớp HttpListener....v...v.. để giúp người lập trình thao tác với các trang web.

Còn kô thì mình làm thủ công, bạn lấy nội dung html của trang web --> chuyển về string ---> phân tích và lọc ---> lấy đc cái bạn cần


Cái này mình cũng có ý định làm rồi, với java và C#, chủ yếu là mình tìm đc câu URL nào đơn giản để nó trả về 1 thẻ html mà chửa đủ nội dung mình cần, chứ lấy nguyên 1 trang web thì phân tích ngu lun. Bạn mình cũng làm thành công với tra từ điển, thông qua java tới Google dịch và trả lại

Bạn thử cố gắn xem, mình chừ hơi bận , đáng lẽ là làm đủ bộ lập trình mạng nhưng cũng kô có time nữa rồi
 

HoangLuongNgoc

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

bạn cố gắng giúp mình vấn đề này nha ,java mình còn kém quá.
mình cảm ơn
 

joe_ddo

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

Nếu mình muốn lấy src code của 1 trang web nhưng kiểu UTF thì sao hã bro ?
 

chuotfx

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

Nếu mình muốn lấy src code của 1 trang web nhưng kiểu UTF thì sao hã bro ?
chỉnh encoding UTF cho cái luồng để lấy đó,chĩ có mỗi cái đó thui, còn kô đc nữa thì dùng các lớp cao hơn
 

joe_ddo

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

chỉnh encoding UTF cho cái luồng để lấy đó,chĩ có mỗi cái đó thui, còn kô đc nữa thì dùng các lớp cao hơn
Theo mình, mình xài DataInputStream để dùng writeUTF nhưng mà với trang web quá dài thì không hiển thị được hết, bạn có cách nào cụ thể hướng dẫn mình được không ?
 

HoangLuongNgoc

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

Hình như mình nhớ kô nhầm thì java có hỗ trợ các hớp HttpListener....v...v.. để giúp người lập trình thao tác với các trang web.

Còn kô thì mình làm thủ công, bạn lấy nội dung html của trang web --> chuyển về string ---> phân tích và lọc ---> lấy đc cái bạn cần


Cái này mình cũng có ý định làm rồi, với java và C#, chủ yếu là mình tìm đc câu URL nào đơn giản để nó trả về 1 thẻ html mà chửa đủ nội dung mình cần, chứ lấy nguyên 1 trang web thì phân tích ngu lun. Bạn mình cũng làm thành công với tra từ điển, thông qua java tới Google dịch và trả lại

Bạn thử cố gắn xem, mình chừ hơi bận , đáng lẽ là làm đủ bộ lập trình mạng nhưng cũng kô có time nữa rồi




mình dùng VietSpider để phân tích trang web đó ra ở ở dạng cây.. nhưng vẫn chưa biết kết hợp với java để lấy thông tin từ cây đó ra.ai bít chỉ mình với nhé.
 

HoangLuongNgoc

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

import java.io.File;
import java.io.FileOutputStream;
import java.net.URL;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import org.vietspider.parser.html.HTMLDocument;
import org.vietspider.parser.html.parser.HTMLParser;
import org.vietspider.parser.html.path.NodePath;
import org.vietspider.parser.html.path.NodePathParser;
import org.vietspider.parser.html.path.NodePathUtil;

/**
* Author : Nhu Dinh Thuan
* Email:nhudinhthuan@yahoo.com
* Dec 5, 2006
*/
public class CrawlNewsDotCom {

public static void main(String[] args) throws Exception {
URL url = new URL("http://news.com.com/Company+accused+of+selling+fake+antispyware+settles+suit/2100-7350_3-6140656.html?tag=nefd.top");
HTMLDocument document = HTMLParser.createDocument(url.openStream(), null);

String [] paths = {
"BODY[0].DIV[0].DIV[0].DIV[4].DIV[0].DIV[0].H1[0]",
"BODY[0].DIV[0].DIV[0].DIV[4].DIV[0].DIV[0].DIV[1].DIV[0].DIV[0]"
};

NodePath [] nodePaths = new NodePath[paths.length];
for(int i=0; i<paths.length; i++){
nodePaths = NodePathParser.toPath(paths);
}

HTMLDocument doc = NodePathUtil.create(document.getRoot(), nodePaths);

paths = new String[]{
"DIV[0].DIV[0]",
"DIV[0].DIV[1]",
"DIV[0].DIV[2]",
"DIV[0].DIV[3]"
};

nodePaths = new NodePath[paths.length];
for(int i=0; i<paths.length; i++){
nodePaths = NodePathParser.toPath(paths);
}

NodePathUtil.remove(doc.getRoot(), nodePaths);


System.out.println(doc.getRoot().getTextValue());

File file = new File("a.html");
file.createNewFile();
FileOutputStream output = new FileOutputStream(file);
FileChannel fchan = output.getChannel();
byte[] data = doc.getTextValue().getBytes();
ByteBuffer buff = ByteBuffer.allocateDirect(data.length);
buff.put(data);
buff.rewind();
fchan.write(buff);
buff.clear();
fchan.close();
output.close();
}

}

chuotfx ơi, bài này chạy thế nào đây, cậu chỉ mình với.mình ko kiếm đâu ra cái thư viện của nó cả, bài này mình search trên goole.