Lập trình Socket trong Java

Một socket là một điểm kết nối truyền thông (đầu cuối) mà bạn cần 1 tên(name) và địa chỉ(address) trên mạng. Socket có thể sử dụng trên các hệ thống giống nhau hoặc các hệ thống khác nhau trên các mạng khác nhau. Socket hữu dụng cho cả ứng dụng độc lập và ứng dụng mạng. Socket cho phép bạn thay đổi thông tin giữa việc xử lý các trên các máy giống nhau và hai bên đầu cuối trên một mạng va cho phép truy xuất một cách dễ dàng tới các dữ liêu trung tâm.

pdf21 trang | Chia sẻ: diunt88 | Lượt xem: 6753 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Lập trình Socket trong Java, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Tìm hiểu về lập trình socket trong java Manlivo at3akma – 1 I, Socket 1. Socket: Một socket là một điểm kết nối truyền thông (đầu cuối) mà bạn cần 1 tên(name) và địa chỉ(address) trên mạng. Socket có thể sử dụng trên các hệ thống giống nhau hoặc các hệ thống khác nhau trên các mạng khác nhau. Socket hữu dụng cho cả ứng dụng độc lập và ứng dụng mạng. Socket cho phép bạn thay đổi thông tin giữa việc xử lý các trên các máy giống nhau và hai bên đầu cuối trên một mạng va cho phép truy xuất một cách dễ dàng tới các dữ liêu trung tâm. Socket application program interfaces (APIs): là một mạng chuẩn TCP/IP. Phần lớn các hệ điều hành đều hỗ trợ APIs. OS/400 socket hỗ trợ đa truyền tải và các giao thức mạng. Các hàm socket system và socket network có hỗ trợ bảo mật. Một chương trình Socket chỉ cho ta thấy làm thế nào để sử dụng Socket APIs để thiết lập liên kết truyền thông giữa cách thức truy xuất từ xa và cục bộ. Programers là những người sử dụng Integrated Language Environment (ILE) (dịch tạm là môi trường hợp ngữ ) để phát triển các ứng dụng Socket. Bạn có thể lập trình Socket thông qua nhiều ngôn ngữ lập trình (ILE) khác nhau. Java là một trong những ngôn ngữ lập trình dùng để lập trình các ứng dụng Socket. Java còn hỗ trợ giao diện (Socket programing interface). 2. Socket làm việc như thế nào? Sockets phần lớn được sử dụng cho việc truyền thông giữa client và server. Điển hình là cấu hình server trên 1 máy và clients trên 1 máy khác. Clients kết nối tới server, trao đổi thông tin và sau đó kết thúc việc truyên thông, chúng sẽ ngắt kết nối. Một socket có một loạt các khả năng. Trong một kết nối kiểu client-to-server, Socket trên server sẽ đợi xử lý các yêu cầu từ một client Để làm điều này, server đầu tiên phải thiết lập một địa chỉ mà các clients dựa vào đó để tìm server. Khi địa chỉ server được thiết lập, server sẽ đợi cho các clients gửi yêu cầu về 1 dịch vụ. Dữ liệu lúc đó sẽ được trao đổi thông qua socket. Server thực hiện yêu cầu từ các Client và gửi phản hồi lại cho Client. Hình vẽ b miêu tả một phiên kết nối Socket. Tìm hiểu về lập trình socket trong java Manlivo at3akma – 2 Bước 1: Hàm socket() tạo một điểm kết nối (endpoint – đầu cuối) cho việc kết nối và trả lại một ký hiệu nhận diện socket tương ứng với điểm kết nối (endpoint). Bước 2: Khi một ứng dung có một ký hiệu nhận diện socket, nó có thể gán 1 tên duy nhất cho socket. Server phải gán 1 tên để có thể truy xuất tới mạng. Bước 3: Hàm listen() cho thấy sự sẵn sàng để chấp nhận yêu cầu kết nối từ phía client. Bước 4: Ứng dụng Client sử dụng hàm connect() trên một stream socket để thực hiện kết nối tới server. Bước 5: Ứng dụng server sử dụng hàm accept() đẻ chấp nhận yêu cầu kết nối từ 1 client. Server phải thực hiện hàm bind() và listen() thành công trước khi nó có thể thực hiện hàm accept(). Bươc 6: Khi một kết nối được thực hiện giữa Client và Server, chúng ta có thể dùng một số hàm truyền dữ liệu Socket API. Các Client và Server có nhiều hàm truyền dữ liệu để lựa chọn như send(), recv(), read(), write()... Bước 7: Khi Server hoặc Client muốn ngừng việc truyền thông, nó thực hiện hàm close() để để giải phóng tài nguyên mà hệ thống bỏ ra cho socket. Note: Socket APIs được xác đinh trong mô hình truyền thông giữa lớp ứng dụng và tầng vận chuyển. Socket APIs không phải một tầng của mô hình truyền thông. Socket APIs cho phép ứng dụng tác động với tầng vạn chuyển và tầng mạng của một mô hình truyền thông diển hình. Mũi tên trong hình sau đây chỉ ra vị trí của mọt socket và lớp truyền thông mà socket cung cấp. Điển hình, một cấu hình mạng không cho phép kết nối giữa một mạng bảo mật trong và một mạng bảo mật thấp bên ngoài. Tuy nhiên bạn có thể cho phép truyền thông giữa chương trình của server chạy trên một hệ thống ngoài firewall. 3. Socket characteristics Tìm hiểu về lập trình socket trong java Manlivo at3akma – 3 Khi một ứng dụng tạo 1 socket với hàm socket(), nó phải định dạng socket với 3 tham số - Socket adddress family là một dạng của cấu trúc địa chỉ của socket. - Socket type xác định form của truyền thông của socket - Socket-supported protocols: giao thức mà socket sử dụng Bảng tóm tắc socket characteristics Address family Socket type Socket protocol AF_UNIX SOCK_STREAM N/A SOCK_DGRAM N/A AF_INET SOCK_STREAM TCP SOCK_DGRAM UDP SOCK_RAW IP,ICMP AF_INET6 SOCK_STREAM TCP SOCK_DGRAM UDP SOCK_RAW IP6, ICMP6 AF_TELEPHONY SOCK_STREAM N/A SOCK_STREAM N/A SOCK_DGRAM N/A SOCKET address family: Tham số địa chỉ address family trên một socket() là dạng của cấu trúc địa chỉ sử dụng trên hàm socket. Giao thức address family cung cấp sự truyền các dữ liệu ứng dụng từ một ứng dụng tới 1 ứng dụng khác. Các địa chỉ address family - AF_INET address family - AF_INET6 address family - AF_UNIX address family - AF_UNIX_CCSID address family - AF_TELEPHONY address family II, Các loại socket 1. Phân loại Tham số thứ 2 trên một socket quyết định loại Socket. Socket cung cấp sự nhận diện loại và đặc điểm mà sẽ thực hiện việc chuyển dữ liệu từ máy này sang máy khác. Danh sách miêu tả các loại socket mà iSeries hỗ trợ: a. Stream(SOCK_STREAM) Loại Socket này là một kết nối định hướng. Thiết lập một kết nối điểm nối điểm bằng việc sử dụng hàm bind(), listen(), accept(), và connect(). SOCKET_STREAM gửi Tìm hiểu về lập trình socket trong java Manlivo at3akma – 4 dữ liệu và nhận dữ liệu trong một danh sách. SOCK_TREAM xem xét dữ liệu trở thành các luồn các byte. Trong một iSeries implementation, bạn có thể sử dụng nhiều luồng socket qua TCP (Hay còn gọi là TCP socket) b. Datagram(SOCK_TREAM) Trong thuật ngữ Internet Protocol, đơn vị cơ bản của dữ liệu là datagram. Datagram Socket là kết nối thấp. Nó thiết lập kết nối không phải điểm với điểm và với giao thức. Socket gửi các datagramnhư các gói tin độc lập mà không cần sự dảm bảo hay chuyển tiếp. Bạn có thể bị mất hoặc bị sao chép dữ liệu. Dữ liệu có thể tới mà ko theo một thứ tự nào. Kích cỡ của các datagram bị giới bạn bởi kích cỡ của dữ liệu. Bạn có thể sử dụng hàm connect() trên loại socket này. Tuy nhiên hàm connect(), bạn phải chỉ rõ địa chỉ đích mà chương trình có thể gửi và nhận dữ liệu từ nó. Trong iSeries implementation, bạn có thể sử dụng qua UDP. (Hay còn gọi là UDP socket) c. Raw (SOCK_RAW) Loại socket này cho phép truy xuất tới các giao thức ở tầng dưới, như giao thức IP (Ipv4, Ipv6) và ICMP(ICMP hoặc ICMP6). SOCK_RAW yêu cầu lập trình thành thạo bởi vì bạn quản lý thông tin protocol header được sử dụng bởi transport provider. 2, Socket protocols Các giao thức cung cấp việc vận chuyển các dữ liệu của ứng dụng trên mạng từ 1 máy đến 1 máy khác. Các ứng dụng chỉ rõ giao thức trên tầng transport với các tham số giao thức của hàm socket(). III. Nội dung của socket Asynchronous I/O: đồng bộ vào ra. Secure sockets: Bảo mật socket Client SOCKS support: Hỗ trợ Client SOCKS Thread safety Non-blocking I/O Signals: Các tín hiệu IP multicasting File data transfer – send_file() and accept_and_recv() Out-of-band data I/O multiplexing-select() Socket network functions Domain name system(DNS) support BSD compatibility Pass descriptors between processes-sendmsg() and recvmsg() 1. AsynchronousI/O (Đồng bộ vào ra) Tìm hiểu về lập trình socket trong java Manlivo at3akma – 5 Đồng bộ vào ra APIs cung cấp các phương thức cho các mô hình client-server để tạo sự tương đồng giữa client và server và hiệu suất vào ra bộ nhớ cao nhất. Trong mô hình Client/Server, điển hình là hai mô hình vào ra. Một là một luồng có 1 client kết nối. Mô hình này tiêu tốn quá nhiều luồng và và làm cho các trạng thái không được sử dụng một cách hiệu quả và đẩy chi phí lên cao. Hai là tối thiểu só lượng các luồng bằng việc dùng hàm select() cấp cho mỗi một client kết nối và ủy quyền cho client đã sẵn sàng kết nối hoặc yêu cầu một luồng. Trong mô hình thứ 2 bạn phải lựa chọn hay đánh dấu cho mỗi lựa chọn tiếp theo, mà có thể nguyên nhân của lượng lớn dư thưa công việc. Asynchronouns I/O advantages Sử dụng tài nguyên hệ thống hiệu quả. Dữ liệu được sao chép từ người dùng là sự đồng bộ từ ứng dụng khi bắt đầu yêu cầu. Tối thiểu hóa xử lý, luồng và thời gian đợi cung cấp ứng dụng ngay lập tức khi client yêu cầu Chỉ ra lỗi của ứng dụng Cung cấp phần lơn các phương thưc hiệu quả trong việc xử lý lượng lớn các dữ liệu di chuyển. Tối thiểu số luồng cần sử dụng. Tùy chọn thơi gian chỉ ra thơi gian tối đa cho phép hoàn tất một đồng bộ. Server sẽ đóng một kết nối Client nếu nó không có hoạt động trong khoảng thời gian đã được đặt trước. Đồng bộ thời gian sẽ cho phép server thiết lập giơi hạn thời gian. Đồng bộ phiên bảo mật với hàm gsk_secure_soc_startInit() API Bảng đồng bộ I/O APIs Function Description gsk_secure_soc_startInit() Starts an asynchronous negotiation of a secure session, using the attributes set for the SSL environment and the secure session. Note: This API only supports sockets with address family AF_INET or AF_INET6 and type SOCK_STREAM. gsk_secure_soc_startRecv() Starts an asynchronous receive operation on a secure session. Note: This API only supports sockets with address family AF_INET or AF_INET6 and type SOCK_STREAM. Tìm hiểu về lập trình socket trong java Manlivo at3akma – 6 gsk_secure_soc_startSend() Start an asynchronous send operation on a secure session. Note: This API only supports sockets with address family AF_INET or AF_INET6 and type SOCK_STREAM. QsoCreateIOCompletionPort() Create a common wait point for completed asynchronous overlapped I/O operations. The QsoCreateIOCompletionPort() function returns a port handle that represents the wait point. This handle is specified on the QsoStartRecv(), QsoStartSend(), QsoStartAccept(), gsk_secure_soc_startRecv(), or gsk_secure_soc_startSend() functions to initiate asynchronous overlapped I/O operations. Also this handle can be used with QsoPostIOCompletion() to post an event on the associated I/O completion port. QsoDestroyIOCompletionPort() Destroys an I/O completion port. QsoWaitForIOCompletionPort() Waits for completed overlapped I/O operation. The I/O completion port represents this wait point. QsoStartAccept() Starts an asynchronous accept operation. Note: This API only supports sockets with address family AF_INET or AF_INET6 and type SOCK_STREAM. QsoStartRecv() Starts an asynchronous receive operation. Note: This API only supports sockets with address family AF_INET or AF_INET6 and type SOCK_STREAM. QsoStartSend() Starts an asynchronous send operation. Note: This API only supports sockets with the AF_INET or AF_INET6 address families with the SOCK_STREAM socket type. QsoPostIOCompletion() Allows an application to notify a completion port that some function or activity has occurred. Tìm hiểu về lập trình socket trong java Manlivo at3akma – 7 Đồng bộ vào ra làm việc thế nào? Một ứng dụng sẽ tạo một cổng vào ra sử dụng hàm QsoCreateIOCompletionPort() API. API sẽ trả về một phương thức mà có thể sử dụng để lên kế hoạch và đợi một một yêu cầu đồng bộ vào ra. Ứng dụng bắt đâu một hàm input và outputt, chỉ ra một công vào ra. Khi vào ra I/O hoàn tất, thông tin trạng thái và một phương thức ứng dụng định sẽ sẽ gửi tới cổng vào ra, và sẽ khởi động một trong những cổng đang đợi. Ứng dụng sẽ nhận: - Một vùng đệm được cung cấp bởi yêu cầu gốc. - Dữ liệu sẽ được xử lý tới và từ vùng đệm. - Một chỉ số của loại điều khiển vào ra mà đã được hoàn thành. 2. Secure sockets Hiện tại, OS/400 hỗ trợ 2 phương thức của bảo mật ứng dụng socket trên iSeries. Đó là SSL_APIs và Global Secure Toolkit (GSKit) APIs cung cấp khả năng truyền thông riêng tư qua một mạng truyền thông mở như internet. APIs cho phép ứng dụng client/server truyền trên một đường mà được thiết kế để ngăn chặn sự can thiệp, xâm nhập và giả mạo thông điệp.Cả hai đều hỗ trợ xác xác thực cho cả server và client và cho phép sử dụng giao thức SSL (Secure Sockets Layer). Tuy nhiên, Gskit APIs hỗ trợ và là nền tảng cho các máy IBM server. Khái quát chung về bảo mật socket: Khởi đầu được phát triển bởi Netscape, Giao thức secure Socket Layer (SSL) là giao thức được sử dụng trên một cung cấp sự chuyển phát tin cậy như TCP để cung cấp khả năng truyên thông tin cậy cho một ứng dụng. Một vài ứng dụng yêu truyền thông tin cậy như HTTPs, FTPs, SMTP và TELNETs. Khi một ứng dụng đc đặt trong chế độ SSL thì nó thường xuyên cần sử dụng một cổng khác so với ứng dụng không tích hợp SSL. Một trình duyệt tích hợp SSL truy xuất một server HTTP tích hợp SSL và 1 đường dẫn URL như HTTPs. Trong phần lớn các trường hợp, một URL của HTTPs cố gắng mở một kết nối ở cổng 443 của hệ thống server thay vì cổng 80 của một server HTTP chuấn sử dụng. Có rất nhiều phiên bản của giao thức SSL được định nghĩa. Và phiên bản mới nhất là TLS (Transport Layer Security) version 1.0 cung cấp sự thay đổi nâng cấp tứ SSL version 3.0. Cả iSerises-native SSL_APIs và GSKit API hỗ trợ TLS version 1.0, TLS version 1.0 tương thích với SSL version 3.0, SSL version 3.0 tương thích với SSL version 2.0. Global Secure ToolKit (GSKit) APIs GSKit là một tập hợp giao diên chương trình có thể lập trình được cho phép môt ứng dụng tích hợp SSL. Giống như SSL_APIs, GSKit APIs cho phép ban có thể truy xuất tới hàm SSL và TLS từ chương trình ứng dụng socket. Ngoài ra, một GSKit API mới có Tìm hiểu về lập trình socket trong java Manlivo at3akma – 8 thể thêm để tạo mới một đồng bộ trường hợp của 1 phiên bảo mật socket. API cung cấp kết nối tin cây cho nhiều client hoặc nếu số yêu đến cao và và yêu cầu nhiều công việc. Chú ý: APIs chỉ hỗ trợ socket với địa chỉ address family của À_INET hoặc AF_INET6 và loại SOCK_STREAM (TCP) Bảng sau miêu tả các hàm Function Description gsk_attribute_get_buffer() Obtains specific character string information about a secure session or an SSL environment, such as certificate store file, certificate store password, application ID, and ciphers. gsk_attribute_get_cert_info() Obtains specific information about either the server or client certificate for a secure session or an SSL environment. gsk_attribute_get_enum_value() Obtains specific information about either the server or client certificate for a secure session or an SSL environment. gsk_attribute_get_enum_value() Obtains values for specific enumerated data for a secure session or an SSL environment. gsk_attribute_get_numeric_value() Obtains specific numeric information about a secure session or an SSL environment. gsk_attribute_set_buffer() Sets a specified buffer attribute to a value inside the specified secure session or an SSL environment. gsk_attribute_set_enum() Sets a specified enumerated type attribute to an enumerated value in the secure session or SSL environment. gsk_attribute_set_numeric_value() Sets specific numeric information for a secure session or an SSL environment. gsk_environment_close() Closes the SSL environment and releases all storage associated with the environment. gsk_environment_init() Initializes the SSL environment after any required attributes are set. gsk_environment_open() Returns an SSL environment handle that must be saved and used on subsequent gsk calls. gsk_secure_soc_close() Closes a secure session and free all the associated resources for that secure session. gsk_secure_soc_init() Negotiates a secure session, using the attributes set for the SSL environment and the secure session. gsk_secure_soc_misc() Performs miscellaneous functions for a Tìm hiểu về lập trình socket trong java Manlivo at3akma – 9 secure session. gsk_secure_soc_open() Obtains storage for a secure session, sets default values for attributes, and returns a handle that must be saved and used on secure session-related function calls. gsk_secure_soc_read() Receives data from a secure session. gsk_secure_soc_startInit() Starts an asynchronous negotiation of a secure session, using the attributes set for the SSL environment and the secure session. gsk_secure_soc_write() Writes data on a secure session. gsk_secure_soc_startRecv() Initiates an asynchronous receive operation on a secure session. gsk_secure_soc_startSend() Initiates an asynchronous send operation on a secure session. gsk_strerror() Retrieves an error message and associated text string which describes a return value that was returned from calling a GSK API. Một ứng dụng sử dụng GSKit APIs bao gồm: - Một hàm socket() dùng để nhận diện socket - Một hàm gsk_environment_open() - Một hoặc nhiều hàm gsk_attribute_set_xxxxx() để lập thuộc tính cho SSL environment - Một hàm gsk_environment_init() khởi tạo environment cho xử lý processing và thiếp lập thông tin bảo mật SSL cho tất cả các phiên SSL chạy sử dụng environment - Socket sử dụng hàm connect() để kich hoạt kết nối cho một chương trình client hoặc sử dụng bind(), listen() và accept() để chấp nhấn nhận yêu cấu kết nối. - Một hàm gsk_secure_soc_open() để khởi động phiên bảo mật - Một hoặc nhiều hàm gsk_attribute_set_xxxxx() để lập thuộc tính của các phiên bảo mật.Như hàm gsk_attribute_set_numeric_value() để kết hợp một socket riêng biệt với phiên bảo mật. ……….. SSL_APIs SSL_APIs cung cấp và cho phép các lập trình viên tạo ứng dụng bảo mật socket trên iSeries. Không giống như GSKit_APIs, SSL_APIs chỉ được tích hợp tới hệ thống OS/400. Bảng sau miêu tả 9 SSL_APIs hỗ trợ bổ sung cho OS/400. Function Description SSL_Create() Enable SSL support for the specified socket descriptor. SSL_Destroy() End SSL support for the specified SSL Tìm hiểu về lập trình socket trong java Manlivo at3akma – 10 session and socket. SSL_Handshake() Initiate the SSL handshake protocol. SSL_Init() Initialize the current job for SSL and establish the SSL security information for the current job. Note: Either an SSL_Init() or SSL_Init_Application() API must be executed in a process before SSL can be used. SSL_Init_Application() Initialize the current job for SSL and establish the SSL security information for the current job. Note: Either an SSL_Init() or SSL_Init_Application() API must be executed in a process before SSL can be used. SSL_Read() Receive data from an SSL-enabled socket descriptor. SSL_Write() Write data to an SSL-enabled socket descriptor. SSL_Strerror() Retrieve SSL runtime error message. SSL_Perror() Print SSL error message. 3. Client SOCKs support iSeries sử dụng SOCKs version 4 cho thực thi các chương trình sử dụng địa chỉ AF_INET address family với loại socket SOCK_STREAM để truyền với 1 các chương trình đóng vai trò như server chạy trên các hệ thống ko chịu ảnh hưởng của firewall. Một firewall là một host bảo mật mà người quản trị mạng đặt giữa một mạng bảo mật nội bộ và một mạng ngoài kém bảo mật. Điển hình là cấu hình mạng không cho phép truyền thông bắt đầu từ host bảo mật trỏ tới mạng bảo mật kém hơn. Một sever Proxy tồn tại trên firewall giúp quản lý các yêu câu truy xuất giữa host bảo mật và mạng kém bảo mật. Ứng dụng chạy tren các host trong mạng bảo mật nội bộ phải gửi các yêu cầu tới firewall proxy server để tìm đường đi trên firewall. Proxy server có thể chuyển tiếp yêu cấu tới server thật trên mạng bảo mật kém hơn và trả lới lại cho ứng dụng trên các host đầu tiên. Một vd phổ biến của một proxy server là HTTP proxy server. Proxy server thực hiện một số các công việc cho các HTTP client: - Chúng giấu mạng nội bộ của bạn khỏi các hệ thống bên ngoài - Chúng bảo vệ các host khỏi các truy cập trực tiếp