Hàm tạo public ServerSocket() throws IOException // Java 1

Một phần của tài liệu chương 1 lập trình socket (Trang 28 - 31)

Hàm tạo này tạo ra một ServerSocket, tuy nhiên nó chưa thực sự lắng nghe trên cổng nào cả. Thế nên bạn cũng chưa thể gọi phương thức accept để chấp nhận các kết nối. Để thự sự liên kết với một cổng nào đó bạn cần gọi phương thức bind(),

đây là phương thức chỉ có trong java 1.4 trở lên.

public void bind(SocketAddress endpoint) throws IOException // Java 1.4 public void bind(SocketAddress endpoint, int queueLength) // Java 1.4 throws IOException

Hàm tạo này cũng rất hữu dụng khi bạn cần đặt một số thuộc tính cho ServerSocket trước khi nó thực sự chấp nhận các kết nối.

Thông thường bạn sử dụng mẫu sau:

//Tạo ra một ServerSocket chưa thực sự liên kết với một cổng nào đó. ServerSocket ss = new ServerSocket( );

// Thiết đặt một số thuộc tính cho Socket...

//Tạo ra một đối tượng SocketAddress để liên kết SocketAddress http = new InetSocketAddress(80); //Liên kết ServerSocket với cổng 80

ss.bind(http);

4.2. Chấp nhận và đóng kết nốia) Chấp nhận kết nối a) Chấp nhận kết nối

Việc tạo ra một ServerSocket chưa thực sự chấp nhận các kết nối đến. Để chấp nhận kết nối đến ta cần gọi đến phương thức accept() phương thức này sẽ tạm ngưng tuyến thi hành hiện tại cho đến khi có một yêu cầu kết nối đến. Khi có yêu cầu kết nối đến thì tuyến được tiếp tục và hàm này trả về cho ta một đối tượng Socket. Việc giao tiếp với máy khách được tiến hành thông qua Socket này.

Chú ý: Phương thức accept() chỉ chấp nhận một kết nối đến mà thôi. do vậy để có thể chấp nhận nhiều kết nối đến bạn cần phải lặp lại việc gọi đến phương thức accept() bằng cách đưa chúng vào một vòng lặp như sau:

Ví du:

Chương trình trên máy chủ //Server.java

import java.net.*; import java.io.*; class Server {

public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(3456);

while (true) {

Socket connection = server.accept(); OutputStreamWriter out

= new OutputStreamWriter(connection.getOutputStream()); out.write("You've connected to this server. Bye-bye now.\r\n"); out.flush();

connection.close(); }

} }

//Client.java import java.net.*; import java.io.*; class Client {

public static void main(String[] args) throws IOException { Socket sk = new Socket();

SocketAddress sv = new InetSocketAddress("theht1", 3456); sk.connect(sv); InputStream in = sk.getInputStream(); int c; do { c = in.read(); if (c == -1)break; System.out.print( (char) c); } while (true); } }

Với chương trình trên bạn chạy Server một lần sau đó bạn có thể chạy nhiều chương trình máy khách.

b) Đóng kết nối

Khi kết nối không còn được sử dụng đến nữa thì ta cần đóng lại để giải phóng các tài nguyên. Kết nối cũng tự động được đóng lại trong một số trường hợp như: Chương trình kết thúc, bộ thu rác được tiến hành..., Tuy nhiên một phong cách lập trình tốt là luôn đóng lại một cách tường minh khi không còn sử dụng đến nó nữa. Ví dụ:

ServerSocket server = new ServerSocket(port); //Làm một số việc

server.close( );

Trong java 1.4 bổ sung thêm hai phương thức:

- public boolean isClosed( ) //Nếu kết nối đang mở thì trả về tru và ngược lại, tuy nhiên nếu kết nối chưa được mở thì nó cũng trả về false (adsbygoogle = window.adsbygoogle || []).push({});

- public boolean isBound( ) // Trả về true nếu nó đã từng được liên kết với một cổng nào đó.

Thế nên để kiểm tra xem ServerSocket có đang mở hay không ta phải làm như sau:

public static boolean isOpen(ServerSocket ss) { return ss.isBound( ) && ! ss.isClosed( ); }

5. Lớp DatagramSocket

Lớp này dùng để tạo ra một Socket để liên lạc bằng giao thức UDP.

6. Lớp DatagramPacket

Lớp này thể hiện cho một gói dữ liệu được gửi đi bằng giao thức UPD. Nó được sử dụng với lớp DatagramSocket.

Một phần của tài liệu chương 1 lập trình socket (Trang 28 - 31)