Tải bản đầy đủ (.pdf) (23 trang)

Chương 5 lập trình socket

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (216.14 KB, 23 trang )

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
Viết chương trình

application
transport
network
data link
physical

– 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

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

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 API:
– Datagram không bảo đảm
– connection-oriented bảo
đảm

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


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ó
• socket tương tự như cửa
ra vào
– Quá trình truyền thông
điệp ra cửa
– 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

host hay
server

host hay
server

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

process

process
socket

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

Internet

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

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

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


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
Đượ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

process

process

socket

socket

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

host hay
server

internet


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

host hay
server

Đượ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


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
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
• Khi client tạo socket: client
TCP thiết lập kết nối đến
server TCP


• 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

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

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


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

Client

Tạo socket,
port=x, để đón yêu cầu:
welcomeSocket =
ServerSocket()
Đợi yêu cầu
Thiết
kết nối đến
connectionSocket =

welcomeSocket.accept()
Đọc yêu cầu từ
connectionSocket
Ghi phản hồi ra
connectionSocket
close
connectionSocket

TCP
lập kết nối

Tạo socket,
connect to hostid, port=x
clientSocket =
Socket()
Gửi yêu cầu dùng
clientSocket

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


Thuật ngữ Stream

Client
Process
process


output
stream

inFromServer

input
stream

outToServer

• Stream là một tuần tự
các ký tự đi vào hay đi ra
một quá trình.
• 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.
• 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.

monitor

inFromUser

keyboard

input
stream


client
TCP
clientSocket
socket
to network

TCP
socket

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;
Tạo
input stream
Tạo
client socket,
kết nối đến server
Tạo
output stream
gắn vào socket

BufferedReader inFromUser =
new BufferedReader(new InputStreamReader(System.in));
Socket clientSocket = new Socket("hostname", 6789);
DataOutputStream outToServer =
new DataOutputStream(clientSocket.getOutputStream());


Ví dụ: Java client (TCP) (tiếp theo).
Tạo
input stream
gắn vào socket

BufferedReader inFromServer =
new BufferedReader(new
InputStreamReader(clientSocket.getInputStream()));
sentence = inFromUser.readLine();

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


outToServer.writeBytes(sentence + '\n');
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 {

Tạo
welcoming socket
Tại port 6789

public static void main(String argv[]) throws Exception
{
String clientSentence;
String capitalizedSentence;
ServerSocket welcomeSocket = new ServerSocket(6789);
while(true) {

Đợi client liên hệ


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

Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient =
new BufferedReader(new
InputStreamReader(connectionSocket.getInputStream()));


Ví dụ: Java server (TCP) (tiếp theo)
Tạo output stream,
gắn vào socket

DataOutputStream outToClient =
new DataOutputStream(connectionSocket.getOutputStream());

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

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

Ghi dòng
ký tự ra socket

outToClient.writeBytes(capitalizedSentence);
}
}


}

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


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
• Không bắt tay
• sender gắn địa chỉ IP và
port của đích vào mỗi
gói
• 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ừ góc độ ứng dụng

UDP cung cấp dịch vụ
truyền tải không bảo đảm

giữa client và server


Tương tác giữa client socket và server
socket qua UDP
Server
Tạo socket,
port= x.
serverSocket =
DatagramSocket()

Đọc datagram từ
serverSocket
Ghi phản hồi ra
serverSocket
chỉ ra
client address,
port number

Client
Tạo socket,
clientSocket =
DatagramSocket()

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

Đọc datagram từ
clientSocket

close
clientSocket


Ví dụ: Java client (UDP)
input
stream

Client
process

monitor

inFromUser

keyboard

Process

Input: nhận packet

UDP
packet

receivePacket

packet (TCP gửi
dòng byte)

sendPacket


Output: truyền
UDP
packet

client
UDP
clientSocket
socket
to network

UDP
socket

from network


Ví dụ: Java client (UDP)
import java.io.*;
import java.net.*;

Tạo
input stream
Tạo
client socket
Thông dịch
hostname sang IP
address dùng DNS

class UDPClient {

public static void main(String args[]) throws Exception
{
BufferedReader inFromUser =
new BufferedReader(new InputStreamReader(System.in));
DatagramSocket clientSocket = new DatagramSocket();
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)
Tạo datagram với
data,
length, IP addr, port
Gửi datagram
đến server

DatagramPacket sendPacket =
new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
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.*;

Tạo
datagram socket
tại port 9876

class UDPServer {
public static void main(String args[]) throws Exception
{
DatagramSocket serverSocket = new DatagramSocket(9876);
byte[] receiveData = new byte[1024];
byte[] sendData = new byte[1024];
while(true)
{

Tạo chỗ cho
datagram nhận
Nhận
datagram

DatagramPacket receivePacket =

new DatagramPacket(receiveData, receiveData.length);
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);

ghi
datagram
Ra socket

serverSocket.send(sendPacket);
}
}


}

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



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×