Dịch vụ Echo được thiết kế theo kiến trúc Client-Server sử dụng Socket làm phương tiện giao tiếp. Cổng mặc định dành cho Echo Server là 7, bao gồm cả hai chế độ có nối kết và không nối kết.
Chương
trình TCPEchoClient sẽ nối kết đến EchoServer ở chế độ có nối kết, lần lượt gửi
đến Echo Server 10 ký tự từ ‘0’ đến '9', chờ nhận kết quả trả về và hiển thị
chúng ra màn hình.
1. Lớp
TCPEchoClient.java
import java.io.*;
import java.net.Socket;
public class TCPEchoClient{
public
static void main(String args[]){
try{
Socket
s = new Socket(args[0],7);
InputStream
is = s.getInputStream();
OutputStream
os = s.getOutputStream();
for(int
i='0';i<='9';i++){
os.write(i);
int
ch = is.read();
System.out.print((char)ch);
}
}
catch(IOException
ie){
System.out.print("Error:
" +ie);
}
}
}
Chương
trình STCPEchoServer cài đặt một Echo
Server phục vụ tuần tự ở chế độ có nối kết. Server lắng nghe trên cổng mặc
định số 7.
2. Lớp
STCPEchoServer.java (Server phục vụ tuần tự)
import java.net.*;
import java.io.*;
public class STCPEchoServer{
public
final static int defaultPort = 7;
public
static void main(String[] args){
try{
ServerSocket ss = new
ServerSocket(defaultPort);
while (true) {
try {
Socket s = ss.accept();
OutputStream os = s.getOutputStream();
InputStream is = s.getInputStream();
int ch=0;
while(true) {
ch = is.read();
if(ch == -1) break;
os.write(ch);
}
s.close();
}
catch (IOException ie) {
System.err.println("Connection Error: "+ie);
}
}
}
catch
(IOException ie) {
System.err.println("Server
Creation Error:"+ie);
}
}
}
Hai
chương trình này có thể nằm trên hai máy khác nhau. Trong trường hợp đó khi thực
hiện chương trình TCPEchoClient phải chú ý nhập đúng địa chỉ IP của máy tính
đang chạy chương trình STCPEchoServer. Xem địa chỉ IP của một máy tính Windows
bằng lệnh ipconfig.
3. Lớp
PTCPEchoServer.java (Server phục
vụ song song)
import java.net.*;
import java.io.*;
public class PTCPEchoServer {
public final
static int defaultPort = 7; // Cong mac dinh
public
static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(defaultPort); //Tao socket cho server
while (true) {
try {
Socket s = ss.accept(); // Lang nghe cac yeu cau ket noi
RequestProcessing rp = new RequestProcessing(s); // Tao phan xu ly
rp.start(); // Khoi dong phan xu ly cho Client hien tai
}
catch (IOException e) {
System.out.println("Connection Error: "+e);
}
}
}
catch
(IOException e) {
System.err.println("Create
Socket Error: "+e);
}
}
}
class RequestProcessing extends Thread {
Socket
channel; //Socket cua kenh ao noi voi Client hien tai
public
RequestProcessing(Socket s){
channel
= s; // Nhan Socket cua kenh ao noi voi Client
}
public void
run() {
try {
OutputStream os = channel.getOutputStream();
InputStream is = channel.getInputStream();
while (true) {
int n = is.read(); // Nhan
ky tu tu Client
if (n == -1) break; // Thoat
neu kenh ao bi xoa
os.write(n); // Gui ky tu nhan duoc ve Client
}
}
catch
(IOException e) {
System.err.println("Request Processing Error: "+e);
}
}
}
Biên dịch
và thực thi chương trình. Sau đó mở
thêm 2 của sổ DOS khác để thực thi chương trình TCPEchoClient nối kết tới
PTCPEchoServer. Ta sẽ nhận thấy rằng PTCPEchoServer có khả năng phục vụ đồng thời
nhiều Client.