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

LẬP TRÌNH MẠNG DÙNG SOCKET potx

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 (696.37 KB, 35 trang )

Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 1
Trường Đại Học Bách Khoa Tp.HCM
CHƯƠNG 1
LẬP TRÌNH MẠNG DÙNG SOCKET
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 2
KHÁI NIỆM VỀ SOCKET
z Socket API
– Ðượcgiớithiệu ở BSD4.1 UNIX, 1981
– Ðược ứng dụng khởitạo, sử dụng và hủybỏ.
– Dùng cơ chế client/server
– Cung cấphaidịch vụ chuyểndữ liệuthơngqua
socket API:
• unreliable datagram
• reliable, byte stream-oriented
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 3
KHÁI NIỆM VỀ SOCKET
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 4
THIẾT KẾ GIẢI THUẬT CLIENT/SERVER
z Thiếtkế giảithuật cho client
– Giảithuậtchochương trình client dùng UDP
z Xác định địachỉ server.
z Tạo socket.
z Gởi/nhậndữ liệutheogiaothứclớp ứng dụng đãthiếtkế.
z Đóng socket.


– Giảithuậtchochương trình client dùng TCP
z Xác định địachỉ server
z Tạo socket.
z Kếtnối đếnserver.
z Gởi/nhậndữ liệutheogiaothứclớp ứng dụng đãthiếtkế.
z Đóng kếtnối.
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 5
THIẾT KẾ GIẢI THUẬT CLIENT/SERVER
z Thiếtkế giảithuật cho Server
– Chương trình server có hai loại:
z Lặp(iterative)
z Đồng thời (concurrent).
– Hai dạng giao thứcchương trình server:
z Connection-oriented
z Connectionless.
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 6
THIẾT KẾ GIẢI THUẬT CLIENT/SERVER
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 7
THIẾT KẾ GIẢI THUẬT CLIENT/SERVER
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 8
THIẾT KẾ GIẢI THUẬT CLIENT/SERVER
Trường Đại Học Bách Khoa Tp.HCM

Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 9
THIẾT KẾ GIẢI THUẬT CLIENT/SERVER
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 10
THIẾT KẾ GIẢI THUẬT CLIENT/SERVER
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 11
THIẾT KẾ GIẢI THUẬT CLIENT/SERVER
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 12
LẬP TRÌNH MẠNG TRÊN JAVA
z Gói java.net
– InetAddress
– ServerSocket
– Socket
– URL
– URLConnection
– DatagramSocket
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 13
LẬP TRÌNH MẠNG TRÊN JAVA
z InetAddress class
– Class mơ tả vềđịachỉ IP (Internet Protocol)
– Các phương thức getLocalHost, getByName, hay
getAllByName để tạomột InetAddress instance:

z public static InetAddess InetAddress.getByName(String hostname)
z public static InetAddess [] InetAddress.getAllByName(String
hostname)
z public static InetAddess InetAddress.getLocalHost()
– Để lấy địachỉ IP hay tên dùng các phương thức:
z getHostAddress()
z getHostName()
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 14
LẬP TRÌNH MẠNG TRÊN JAVA
z In địachỉ IP củalocalhost
import java.net.*;
public class HostInfo {
public static void main(String args[]) {
HostInfo host = new HostInfo();
host.init();
}
public void init() {
try {
InetAddress myHost = InetAddress.getLocalHost();
System.out.println(myHost.getHostAddress());
System.out.println(myHost.getHostName());
} catch (UnknownHostException ex) {
System.err.println("Cannot find local host");
}
}
}
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin

Trang 15
LẬP TRÌNH MẠNG TRÊN JAVA
z In địachỉ IP của proxy.hcmut.edu.vn
import java.net.*;
class kku{
public static void main (String args[]) {
try {
InetAddress[] addresses =
InetAddress.getAllByName(“proxy.hcmut.edu.vn");
for (int i = 0; i < addresses.length; i++) {
System.out.println(addresses[i]);
}
}
catch (UnknownHostException e) {
System.out.println("Could not find proxy.hcmut.edu.vn");
}
}
}
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 16
LẬP TRÌNH MẠNG TRÊN JAVA
z Các chương trình đọcthêm
– Tạomột địachỉ IP từ mảng byte, chuỗi String.
z InetAddressFactory.java
– Cho một địachỉ tìm tên máy.
z ReverseTest.java
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 17

LẬP TRÌNH MẠNG TRÊN JAVA
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 18
LẬP TRÌNH MẠNG TRÊN JAVA
z Socket class
– Class mơ tả về socket
– Tạomột socket
z Socket(InetAddress address, int port)
z Socket(String host, int port)
z Socket(InetAddress address, int port, InetAddress, localAddr, int
localPort)
z Socket(String host, int port, InetAddress, localAddr, int localPort)
z Socket()
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 19
LẬP TRÌNH MẠNG TRÊN JAVA
z Socket class (tiếptheo)
– Lấy thơng tin về một socket
z InetAddress getInetAddress() : trả vềđịachỉ mà socket kếtnối
đến.
z int getPort() : trả vềđịachỉ mà socket kếtnối đến.
z InetAddress getLocalAddress() : trả vềđịachỉ cụcbộ.
z int getLocalPort() : trả vềđịachỉ cụcbộ.
– Sử dụng Streams
z public OutputStream getOutputStream() throws IOException
Trả về một output stream cho việcviếtcácbyte đến socket này.
z public InputStream getInputStream() throws IOException
Trả về một input stream cho việc đọc các byte từ socket này.

Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 20
LẬP TRÌNH MẠNG TRÊN JAVA
z Kếtnối đên 1 số webserver
import java.net.*;
import java.io.*;
public class getSocketInfo {
public static void main(String[] args) {
for (int i = 0; i < args.length; i++) {
try {
Socket theSocket = new Socket(args[i], 80);
System.out.println("Connected to " +
theSocket.getInetAddress() +
" on port " + theSocket.getPort() + " from port " +
theSocket.getLocalPort() + " of " +
theSocket.getLocalAddress());
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 21
LẬP TRÌNH MẠNG TRÊN JAVA
z Kếtnối đên 1 số webserver (tiếptheo)
} catch (UnknownHostException e) {
System.err.println("I can't find " + args[i]);
} catch (SocketException e) {
System.err.println("Could not connect to " + args[i]);
} catch (IOException e) {
System.err.println(e);
}
} // end for

} // end main
} // end getSocketInfo
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 22
LẬP TRÌNH MẠNG TRÊN JAVA
z ServerSocket class
– Class mơ tả về ServerSocket
– Tạomột ServerSocket
z ServerSocket(int port) throws IOException
z ServerSocket(int port, int backlog) throws IOException
z ServerSocket(int port, int backlog, InetAddress bindAddr) throws
IOException
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 23
LẬP TRÌNH MẠNG TRÊN JAVA
z ServerSocket class
– Các phương thức trong ServerSocket
z Socket accept() throws IOException : Lắng nghe mộtkếtnối đến
socket này và chấpnhận nó.
z void close() throws IOException : Đóng socket.
z InetAddress getInetAddress() : trả vềđịachỉ cụcbộ củasocket
z int getLocalPort() : Trả về port mà server đang lắng nghe.
z void setSoTimeout(int timeout) throws SocketException
z Enable/disable SO_TIMEOUT với khai báo timeout (milliseconds)
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 24
LẬP TRÌNH MẠNG TRÊN JAVA

z DateTime Server
import java.net.*;
import java.io.*;
import java.util.Date;
public class DayTimeServer {
public final static int daytimePort = 5000;
public static void main(String[] args) {
ServerSocket theServer;
Socket theConnection;
PrintStream p;
try {
theServer = new ServerSocket(daytimePort);
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 25
LẬP TRÌNH MẠNG TRÊN JAVA
z DateTime Server (tiếptheo)
while (true) {
theConnection = theServer.accept();
p =
new PrintStream(theConnection.getOutputStream());
p.println(new Date());
theConnection.close();
theServer.close();
}
}catch (IOException e) {
System.err.println(e);
}
}
}

Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 26
LẬP TRÌNH SOCKET VỚI UDP
z Cung cấpcơ chế truyền khơng tin cậygiữa các nhóm
các byte (datagrams) giữa client và server.
z Khơng cầnthiếtlậpkếtnốigiữa client và server.
z Sender phảigởikèmđịachỉ IP và port đích
z Server khi nhậndữ liệusẽ phân tích địachỉ của
sender để truyềnlại.
z Có thể server chấpnhậnnhiều client tạimộtthời
điểm.
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 27
LẬP TRÌNH SOCKET VỚI UDP
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 28
VÍ DỤ (UDP Client)
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 29
VÍ DỤ (UDP Client)
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 30
VÍ DỤ (UDP Server)
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin

Trang 31
VÍ DỤ (UDP Server)
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 32
LẬP TRÌNH SOCKET VỚI TCP
z Server
– Server process phảichạytrước.
– Server phảitạomột socket để lắng nghe và chấpnhậncáckếtnốitừ
client.
z Client
– Khởitạo TCP socket.
– Xác định IP address, port number củaserver.
– Thiếtlậpkếtnối đếnserver.
z Khi server nhậnucầukếtnối, nó sẽ chấpnhậnucầuvà
khởitạo socket mới để giao tiếpvới client.
– Có thể server chấpnhậnnhiều client tạimộtthời điểm.
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 33
LẬP TRÌNH SOCKET VỚI TCP
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 34
VÍ DỤ (TCP Client)
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 35
VÍ DỤ (TCP Client tiếp theo)
Trường Đại Học Bách Khoa Tp.HCM

Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 36
VÍ DỤ (TCP Server)
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 37
VÍ DỤ (TCP Server – tiếp theo)
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 38
BÀI TẬP
z Viếtchương trình trên Java/C tương tự như
nslookup:
– Cho 1 tên tìm ra địachỉ IP.
– Cho 1 địachỉ IP tìm ra tên.
– Giao diệntương tự như sau:
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 39
BÀI TẬP
z Viếtchương trình echo client trên Java.
– echo : 7/tcp, 7/udp.
z Viếtchương trình finger client trên Java.
– Finger: 79/tcp.
z Viếtchương trình echo server trên Java.
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 40
LẬP TRÌNH SOCKET TRÊN UNIX
Release the connectionCLOSE

Receive some data from the connectionRECEIVE
Send some data over the connectionSEND
Actively attempt to establish a connectionCONNECT
Block the caller until connection attempt arrivesACCEPT
Announce willingness to accept connections; give queue sizeLISTEN
Attach a local address to a socketBIND
Create a new communication end pointSOCKET
MeaningPrimitives
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 41
LẬP TRÌNH SOCKET TRÊN UNIX
z Một so sánh tương tự
– socket: Điệnthoại
– bind: Gán mộtsố cho điệnthoại
– listen: Bậtchếđộchng
– connect: quay số
– accept: trả lời điệnthoại
– read/write: nói chuyện
– close: kết thúc
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 42
LẬP TRÌNH SOCKET TRÊN UNIX
z Để gởi
– socket, connect, write
z Để nhận
– socket, bind, listen, accept, read
z Endpoint
– Địachỉ IP + chỉ số port

Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 43
LẬP TRÌNH SOCKET TRÊN UNIX
z Hàm socket
int socket(int domain, int type, int protocol);
Trong đó:
– domain : họđịachỉ, thường sử dụng là AF_INET
– type : Kiểu socket (SOCK_STREAM,
SOCK_DGRAM, …)
– protocol : giao thức được dùng, default = 0
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 44
LẬP TRÌNH SOCKET TRÊN UNIX
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 45
LẬP TRÌNH SOCKET TRÊN UNIX
z Ví dụ (ex1.c)
#include <sys/types.h>
#include <sys/socket.h>
int main(void)
{
int sockfd;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) ==
-1) {
perror("socket");
exit(1);
}

printf("Sockfd : %d \n", sockfd);
}
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 46
LẬP TRÌNH SOCKET TRÊN UNIX
z Hàm bind
int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
Trong đó:
– sockfd: socket file descriptor trả về từ hàm socket
– my_addr: Một con trỏđếnmộtcấu trúc sockaddr ???
– addrlen = sizeof(struct sockaddr).
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 47
LẬP TRÌNH SOCKET TRÊN UNIX
struct sockaddr_in {
short sin_family;
// e.g. AF_INET
unsigned short sin_port; // e.g. htons(3490)
struct in_addr sin_addr; // see struct in_addr,
below
char sin_zero[8]; // zero this if you want to
};
struct in_addr {
unsigned long s_addr;
// load with inet_aton()
};
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin

Trang 48
LẬP TRÌNH SOCKET TRÊN UNIX
z Ví dụ 2 (ex2.c)
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(void)
{
struct sockaddr_in myaddr;
int sockfd;
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(3490);
// you can specify an IP
address:
//inet_aton("63.161.169.137",
&myaddr.sin_addr.s_addr);
// or you can let it automatically
select one:
myaddr.sin_addr.s_addr = INADDR_ANY;
if ((sockfd =
socket(AF_INET,SOCK_STREAM,0)) == -1)
{
perror("socket");
exit(1);
}
if(bind(sockfd, (struct sockaddr
*)&myaddr, sizeof myaddr)== -1) {
perror("bind");
exit(1);
}

printf("socket, bind \n");
}
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 49
LẬP TRÌNH SOCKET TRÊN UNIX
z Hàm listen
int listen(int sockfd, int backlog);
Trong đó:
- backlog: Số kếtnối cho phép củahàngđợi. Các u cầukếtnốicủa đối
tác sẽđượclưu trong queue cho tớikhiđược accept.
z Hàm accept
int accept(int sockfd, void *addr, int *addrlen);
Trong đó:
- addr: con trỏ trỏ tới sockaddr_in (Xác định từđâu kếtnốitới?)
- addrlen: biếnint= sizeof(struct sockaddr_in)
Trường Đại Học Bách Khoa Tp.HCM
Bản quyền ®2005- Khoa Công Nghệ Thông Tin
Trang 50
LẬP TRÌNH SOCKET TRÊN UNIX
z Hàm connect
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
Trong đó:
- serv_addr: struct sockaddr chứa port & IP address đích
- addrlen = sizeof(struct sockaddr)
z Các hàm gởinhận
int send(int sockfd, const void *msg, int len, int flags);
int recv(int sockfd, void *buf, int len, unsigned int flags);
int read(int sockfd, const void *buf, int len);
int write(int sockfd, const void *buf, int len);

×