Lập trình socket

Mục ñích: làm thế nào ñể xây dựng các ứng dụng client/server truyền dữ liệu qua socket Socket API
Ì ðưa ra trong BSD4.1 UNIX,

socket
Là giao diện (cửa) do ứng dụng tạo ra trên máy trạm, quản lý bới OS qua ñó các ứng dụng có thể gửi và nhận thông ñiệp ñến/từ các ứng dụng khác

1981 Ì Cho phép ứng dụng tạo ra và sử dụng socket Ì Nguyên lý client/server Ì Có hai dạng socket Truyền gói tin, không tin c ậy Truyền dòng bytes, tin cậy

1

Các biến ðiều khiển bới Lập trình viên ðiều khiển bởi Hệ ñiều hành internet Máy trạm. Các biến Tiến trình socket TCP với Bộ ñệm. máy chủ 2 .Lập trình socket vớiTCP Socket: cửa giao tiếp giữa các tiến trình và giao thức giao vận (UCP hoặc TCP) Dịch vụ TCP: truyền các bytes tin cậy từ một tiến trình ñến các tiến trình khác ðiều khiển bới Lập trình viên ðiều khiển bởi Hệ ñiều hành Tiến trình socket TCP với Bộ ñệm. máy chủ Máy trạm.

Lập trình socket với TCP Client phải gửi yêu cầu tới server Ì khi ñược client liên lạc. server TCP tạo socket mới ñể tiến Ì Tiến trình máy chủ phải ñang trình máy chủ giao tiếp với ñược thực hiện client Ì máy chủ phải mở socket cho phép nói chuyện với (cổng) ñể nhận yêu cầu từ nhiều clients client phân biệt client bằng số Client yêu cầu server bằng cách: hiệu cổng (chương 3…) Ì Tạo một socket TCP trên máy Ì Chỉ rõ IP address & port number của tiến trình máy chủ ðối với ứng dụng Ì Khi client tạo socket: client TCP cung cấp dịch vụ truyền dòng TCP tạo liên kết tới server bytes tin cậy và có thứ tự TCP giữa client và server 3 .

kết nối tới hostid.Tương tác giữa client/server qua socket TCP Server Client (máy hostid) tạo socket. port=x. cho yêu cầu tới: welcomeSocket = ServerSocket() chờ yêu cầu tới connectionSocket = welcomeSocket.accept() nhận yêu cầu từ connectionSocket trả lời tại connectionSocket ñóng socket connectionSocket Tạo liên kết TCP tạo socket. port=x clientSocket = Socket() gửi yêu cầu từ clientSocket ñọc trả lời tại clientSocket ñóng clientSocket 4 .

bàn phím. màn hình socket.g. e.. Ì input stream ñược gắn với một nguồn vào. socket Ì output stream ñược gắn với một nguồn ra. input stream Client Process process inFromUser output stream inFromServer outToServer input stream client TCP clientSocket socket to network TCP socket from network 5 . e.Stream keyboard monitor Ì stream một chuỗi ký tự vào/ra một tiến trình.g.

gửi tới server qua socket (outToServer stream) 2) server ñọc các dòng gửi từ socket 3) server chuyển sang chữ hoa và gửi trả lại cho client 4) client ñọc và in lại dòng văn bản nhận ñược từ socket (inFromServer stream) 6 .Lập trình socket với TCP Ví dụ về ứng dụng client-server: 1) client ñọc các dòng văn bản do người dùng gõ từ bàn phím (inFromUser stream) .

io. nối tới server Tạo output stream nối tới socket BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System. Tạo input stream Tạo client socket. 7 . String modifiedSentence.*. class TCPClient { public static void main(String argv[]) throws Exception { String sentence.getOutputStream()).in)). import java. DataOutputStream outToServer = new DataOutputStream(clientSocket.net. 6789). Socket clientSocket = new Socket("hostname".*.Ví dụ: Java client (TCP) import java.

clientSocket. sentence = inFromUser. System. Gửi tới server ñọc tin từ server outToServer.close(). } } 8 .println("FROM SERVER: " + modifiedSentence). cont.Ví dụ: Java client (TCP).readLine(). tạo input stream nối tới socket BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())).out.writeBytes(sentence + '\n'). modifiedSentence = inFromServer.readLine().

Ví dụ: Java server (TCP) import java. ServerSocket welcomeSocket = new ServerSocket(6789).net.io. 9 .*. while(true) { Tạo socket chờ tại port 6789 chờ yêu cầu từ client tạo input stream. nối tới socket Socket connectionSocket = welcomeSocket.accept(). import java.getInputStream())). BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket. String capitalizedSentence.*. class TCPServer { public static void main(String argv[]) throws Exception { String clientSentence.

readLine(). 10 . capitalizedSentence = clientSentence. ghi ra socket } } } kết thúc while loop và chờ yêu cầu từ client khác outToClient.Ví dụ: Java server (TCP).writeBytes(capitalizedSentence).toUpperCase() + '\n'.getOutputStream()). clientSentence = inFromClient. cont tạo output stream nối tới socket ñọc thông tin từ socket DataOutputStream outToClient = new DataOutputStream(connectionSocket.

1 Nguyên lý của các Ì 2.6. Lập trình socket với ứng dụng mạng Ì 2. IMAP Ì 2.4 Electronic Mail SMTP. POP3.5 DNS TCP Ì 2.3 FTP – File Transfer Protocol Ì 2.7.2 Web và HTTP Ì 2. Lập trình socket với UDP 11 .Chương 2: Tầng ứng dụng Ì 2.

Lập trình socket với UDP UDP: không có liên kết giữa client và Ì không có giai ñoạn bắt tay Ì bên gửi chỉ rõ IP address và port number của phía nhận trên mỗi gói tin Ì server sẽ tìm ñịa chỉ IP và số hiệu cổng tương ứng bên trong gói tin UDP: các gói tin có thể bị mất hoặc ñến không theo thứ tự ðối với ứng dụng UDP cung cấp dịch vụ truyền dữ liệu không tin cậy giữa client và server 12 .

port=x. clientSocket = DatagramSocket() tạo gói tin. gửi gói tin từ clientSocket ñọc y/c từ serverSocket ghi trả lời lên serverSocket chỉ rõ ñ/c. ñ/c (hostid. cho các y/c ñến: serverSocket = DatagramSocket() Client tạo socket.Tương tác client/server qua UDP socket Server (máy hostid) tạo socket. cổng của client ñọc trả lời tại clientSocket ñóng clientSocket 13 . port=x.

Ví dụ: Java client (UDP) keyboard monitor input stream inFromUser Process Output: gửi gói tin Client process Input: ñọc gói tin (nhắc lại: TCP gửi “byte stream”) UDP packet receivePacket sendPacket (nhắc lại: TCP gửi “byte stream”) UDP packet client UDP clientSocket socket to network UDP socket from network 14 .

class UDPClient { public static void main(String args[]) throws Exception { BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System. byte[] receiveData = new byte[1024].*.readLine(). 15 Tạo input stream Tạo client socket chuyển ñổi hostname ->IP sử dụng DNS . DatagramSocket clientSocket = new DatagramSocket().in)). String sentence = inFromUser.*.Ví dụ: Java client (UDP) import java. import java.getBytes(). byte[] sendData = new byte[1024].getByName("hostname").io.net. InetAddress IPAddress = InetAddress. sendData = sentence.

length).out.receive(receivePacket).length. clientSocket. Tạo datagram với data-to-send. receiveData. 9876). clientSocket. System. DatagramPacket receivePacket = new DatagramPacket(receiveData.close(). IPAddress. clientSocket.send(sendPacket). String modifiedSentence = new String(receivePacket. port Gửi datagram tới server ñọc datagram từ server DatagramPacket sendPacket = new DatagramPacket(sendData. IP addr.Ví dụ: Java client (UDP). length. cont.getData()). } } 16 .println("FROM SERVER:" + modifiedSentence). sendData.

byte[] receiveData = new byte[1024]. import java. byte[] sendData = new byte[1024]. 17 . while(true) { Tạo datagram socket tại cổng 9876 Tạo vùng ñệm nhận datagram Nhận datagram DatagramPacket receivePacket = new DatagramPacket(receiveData.receive(receivePacket).io. receiveData.*. class UDPServer { public static void main(String args[]) throws Exception { DatagramSocket serverSocket = new DatagramSocket(9876).*.Ví dụ: Java server (UDP) import java.net.length). serverSocket.

toUpperCase().getAddress().length.send(sendPacket).getBytes().getPort(). } Kết thúc vòng while. int port = receivePacket. port). Tạo datagram ñể gửi tới client Ghi datagram ra socket } } DatagramPacket sendPacket = new DatagramPacket(sendData.getData()). String capitalizedSentence = sentence. sendData. sendData = capitalizedSentence. IPAddress. chờ datagram khác 18 . Lấy IP addr port # của người gửi InetAddress IPAddress = receivePacket.Ví dụ: Java server (UDP). cont String sentence = new String(receivePacket. serverSocket.

Sign up to vote on this title
UsefulNot useful