Chương 5

Lập trình socket

NỘI DUNG

• Tổng quan • Lập trình Socket với TCP • Lập trình Socket với UDP

Tổng quan

application transport network data link physical

Viết chương trình

– Chạy trên các hệ thống đầu

cuối

– Truyền thông qua mạng – Ví dụ web server giao tiếp

với browser

application transport network data link physical

Viết chương trình trên các thiết bị mạng ngoài phạm vi này

application transport network data link physical

Lập trình socket

Mục tiêu: biết cách xây dựng một ứng dụng

client/server giao tiếp bằng socket

Socket API • Được giới thiệu trong BSD4.1

UNIX, 1981

• Được khởi tạo, sử dụng và hủy một cách tường minh bởi ứng dụng

• Mô hình client/server • Hai loại dịch vụ truyền tải qua

socket Một giao tiếp cục bộ trên host, được tạo bởi ứng dụng và được điều khiển bởi hệ điều hành, qua đó quá trình ứng dụng có thể truyền (hay nhận) đến (hay từ) quá trình khác

socket API: – Datagram không bảo đảm – connection-oriented bảo

đảm

Giao tiếp giữa các quá trình trên hai host khác nhau

• process truyền/nhận

thông điệp đến/từ socket của nó

host hay server host hay server

• socket tương tự như cửa

Kiểm soát bởi người lập trình process process

ra vào – Quá trình truyền thông

socket socket

điệp ra cửa

Internet

TCP với Buffer và các biến TCP với Buffer và các biến

– Quá trình truyền dựa vào hạ tầng truyền tải trên phía kia của cánh cửa, thông tin được chuyển đến socket của quá trình thu

• API: (1) chọn giao thức truyền tải ; (2) khả năng sửa một vài

thông số

Kiểm soát bởi hệ điều hành

NỘI DUNG

• Tổng quan • Lập trình Socket với TCP • Lập trình Socket với UDP

Lập trình socket với TCP

Socket: Như là cửa thông giữa các quá trình ứng

dụng và giao thức truyền tải end-to-end (UCP hay TCP)

TCP service: truyền tải bảo đảm cho các byte từ một

process đến một process khác

process

process

Được kiểm soát bởi người lập trình ứng dụng

Được kiểm soát bởi người lập trình ứng dụng

Được kiểm soát bởi hệ điều hành

Được kiểm soát bởi hệ điều hành

socket TCP với Buffer và các biến

internet

socket TCP với Buffer và các biến

host hay server

host hay server

Lập trình socket với TCP

Client phải liên lạc với server • Trước hết quá trình trên

server phải chạy

• server phải tạo socket để

đón tiếp client

• Khi được liên hệ bởi client, server TCP tạo socket mới để quá trình server giao tiếp với client – Cho phép server giao tiếp với nhiều quá trình client – Các chỉ số port được dùng để phân biệt các client

Client liên lạc server bằng: • Tạo TCP socket • Chỉ ra IP address, port

number của quá trình trên server

Từ góc độ ứng dụng

• Khi client tạo socket: client TCP thiết lập kết nối đến server TCP

TCP cung cấp dịch vụ truyền tải có trật tự vàbảo đảm giữa client và server

Server

Tương tác giữa client socket và server socket qua TCP Client

Tạo socket, port=x, để đón yêu cầu:

welcomeSocket = ServerSocket()

TCP Thiết lập kết nối

Tạo socket, connect to hostid, port=x clientSocket = Socket()

Đợi yêu cầu kết nối đến connectionSocket = welcomeSocket.accept()

Gửi yêu cầu dùng clientSocket

Đọc yêu cầu từ connectionSocket

Ghi phản hồi ra connectionSocket

Đọc phản hồi từ clientSocket

close connectionSocket

close clientSocket

Thuật ngữ Stream

keyboard

monitor

• Stream là một tuần tự

input stream

các ký tự đi vào hay đi ra một quá trình.

r e s U m o r F n

i

Client Process process

• Một input stream được kết với một nguồn nhập của quá trình, ví dụ bàn phím hay socket.

output stream

input stream

t

r e v r e S o T u o

r e v r e S m o r F n

i

client TCP clientSocket socket

TCP socket

• Một output stream được kết với một đích đến của quá trình, ví dụ màn hình hay socket.

to network

from network

Ví dụ ứng dụng client-server

1) client đọc dòng ký tự từ đầu vào chuẩn

(inFromUser stream), rồi gửi đến server qua socket (outToServer stream)

2) server đọc dòng ký tự từ socket 3) server đổi các dòng ký tự thành chữ hoa, gửi

ngược lại cho client

4) client đọc và in dòng ký tự từ socket

(inFromServer stream)

Ví dụ: Java client (TCP)

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

public static void main(String argv[]) throws Exception {

String sentence; String modifiedSentence;

BufferedReader inFromUser =

Tạo input stream

new BufferedReader(new InputStreamReader(System.in));

Socket clientSocket = new Socket("hostname", 6789);

DataOutputStream outToServer =

new DataOutputStream(clientSocket.getOutputStream());

Tạo client socket, kết nối đến server Tạo output stream gắn vào socket

Ví dụ: Java client (TCP) (tiếp theo).

BufferedReader inFromServer =

Tạo input stream gắn vào socket

new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

sentence = inFromUser.readLine();

outToServer.writeBytes(sentence + '\n');

Gửi dòng ký tự đến server

modifiedSentence = inFromServer.readLine();

Đọc dòng ký tự từ server

System.out.println("FROM SERVER: " + modifiedSentence);

clientSocket.close();

}

}

Ví dụ: Java server (TCP)

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

class TCPServer {

public static void main(String argv[]) throws Exception

{

String clientSentence; String capitalizedSentence;

Tạo welcoming socket Tại port 6789

ServerSocket welcomeSocket = new ServerSocket(6789);

Đợi client liên hệ

while(true) {

Socket connectionSocket = welcomeSocket.accept();

BufferedReader inFromClient =

Tạo input stream, gắn vàosocket

new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));

Ví dụ: Java server (TCP) (tiếp theo)

DataOutputStream outToClient =

new DataOutputStream(connectionSocket.getOutputStream());

clientSentence = inFromClient.readLine();

Đọc dòng ký tự từ socket

capitalizedSentence = clientSentence.toUpperCase() + '\n';

outToClient.writeBytes(capitalizedSentence);

Ghi dòng ký tự ra socket

}

}

}

Kết thúc vòng lặp while, trở lại chờ kết nối khác từ client

Tạo output stream, gắn vào socket

NỘI DUNG

• Tổng quan • Lập trình Socket với TCP • Lập trình Socket với UDP

Lập trình socket với UDP

UDP: không có kết nối giữa

client và server

Từ góc độ ứng dụng

• Không bắt tay • sender gắn địa chỉ IP và port của đích vào mỗi gói

UDP cung cấp dịch vụ truyền tải không bảo đảm giữa clientvàserver

• server phải tách địa chỉ IP và port của client từ gói nhận được

UDP: data có thể không

đúng thứ tự ở máy thu hay mất

Tương tác giữa client socket và server socket qua UDP

Server

Client

Tạo socket, clientSocket = DatagramSocket()

Tạo socket, port= x. serverSocket = DatagramSocket()

Tạo datagram với server IP và port=x; gửi datagram qua clientSocket

Đọc datagram từ serverSocket

Đọc datagram từ clientSocket

Ghi phản hồi ra serverSocket chỉ ra client address, port number

close clientSocket

Ví dụ: Java client (UDP)

keyboard

monitor

input stream

r e s U m o r F n

i

Client Process process

Input: nhận packet

UDP packet

UDP packet

i

t e k c a P d n e s

t e k c a P e v e c e r

client UDP clientSocket socket

UDP socket

to network

from network

Output: truyền packet (TCP gửi dòng byte)

Ví dụ: Java client (UDP)

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

class UDPClient {

Tạo input stream

public static void main(String args[]) throws Exception {

BufferedReader inFromUser =

Tạo client socket

new BufferedReader(new InputStreamReader(System.in));

DatagramSocket clientSocket = new DatagramSocket();

Thông dịch hostname sang IP address dùng DNS

InetAddress IPAddress = InetAddress.getByName("hostname");

byte[] sendData = new byte[1024]; byte[] receiveData = new byte[1024];

String sentence = inFromUser.readLine();

sendData = sentence.getBytes();

Ví dụ: Java client (UDP) (tiếp theo)

DatagramPacket sendPacket =

Tạo datagram với data, length, IP addr, port

new DatagramPacket(sendData, sendData.length, IPAddress, 9876);

Gửi datagram đến server

clientSocket.send(sendPacket);

DatagramPacket receivePacket =

new DatagramPacket(receiveData, receiveData.length);

Đọc datagram từ server

clientSocket.receive(receivePacket);

String modifiedSentence =

new String(receivePacket.getData());

System.out.println("FROM SERVER:" + modifiedSentence); clientSocket.close(); }

}

Vi dụ: Java server (UDP)

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

class UDPServer {

public static void main(String args[]) throws Exception

{

Tạo datagram socket tại port 9876

DatagramSocket serverSocket = new DatagramSocket(9876);

byte[] receiveData = new byte[1024]; byte[] sendData = new byte[1024];

while(true)

{

Tạo chỗ cho datagram nhận

DatagramPacket receivePacket =

new DatagramPacket(receiveData, receiveData.length);

Nhận datagram

serverSocket.receive(receivePacket);

Ví dụ: Java server (UDP) (tiếp theo)

String sentence = new String(receivePacket.getData());

Lấy IP addr port #, của sender

InetAddress IPAddress = receivePacket.getAddress();

int port = receivePacket.getPort();

String capitalizedSentence = sentence.toUpperCase();

sendData = capitalizedSentence.getBytes();

Tạo datagram để gửi cho client

DatagramPacket sendPacket =

new DatagramPacket(sendData, sendData.length, IPAddress,

port);

serverSocket.send(sendPacket);

ghi datagram Ra socket

}

}

Kết thúc vòng lặp while, trở lại chờ datagram khác

}