Lập trình socket

M

minatohokage

[TẶNG BẠN] TRỌN BỘ Bí kíp học tốt 08 môn
Chắc suất Đại học top - Giữ chỗ ngay!!

ĐĂNG BÀI NGAY để cùng trao đổi với các thành viên siêu nhiệt tình & dễ thương trên diễn đàn.

Định nghĩa: Socket là một phương pháp để thiết lập kết nối truyền thông giữa một chương trình yêu cầu dịch vụ ( client) và một chương trình cung cấp dịch vụ (server) trên mạng LAN, WAN hay Internet và đôi lúc là giữa những quá trình ngay bên trong máy tính. Mỗi socket có thể được xem như một điểm cuối trong một kết nối. Một socket trên máy yêu cầu dịch vụ có địa chỉ mạng được cấp sẵn để “gọi” một socket trên máy cung cấp dịch vụ. Một khi socket đã được thiết lập phù hợp, hai máy tính có thể trao đổi dịch vụ và dữ liệu.

Theo ý kiến của một số kỹ sư phần mềm thì Socket trong thế giới lập trình máy tính cũng tương tự như điện thoại, nghĩa là mỗi thiết vị có một địa chỉ riêng để có thể truyền thông hai chiều.
Lập trình viên dùng các nhãn “client” và “server” để phân biệt giữa máy tính đang thực hiện cuộc gọi và phía đang nhận cuộc gọi. Những máy tính có Socket server đảm bảo tính trạng mở của cổng truyền thông, sẵn sàng để nhận bất kỳ cuộc gọi đến nào dù không định trước. Những máy yêu cầu dịch vụ thường xác định số hiệu cổng của server mong muốn bằng cách tìm nó trong cơ sở dữ liệu về Domain Name System.

Có một ít thay đổi sẽ xảy ra ở phía server khi kết nối được hoàn tất: thay vì dùng cổng nguyên thủy cho việc trao đổi, máy chủ sẽ chuyển cuộc đối thoại qua một cổng khác liên quan để giải phóng đường truyền chính đề phòng trường hợp có máy khách khác muốn yêu cầu dịch vụ đối với máy chủ.
Với sự phát triển của Web, socket vẫn tiếp tục đóng vai trò quan trọng trong việc duy trì các luồng truyền thông trên Internet. Các ứng dụng có liên quan đến Internet đều viết ở lớp bên trên socket, ví dụ socket tích hợp một số phẩn của địa chỉ Website, trình duyệt web và công nghệ bảo mật Scure Socket Layer.

Tuy nhiên, các lập trình viên Web hiện nay gần như luôn luôn bị ngăn cản tạo socket riêng bằng cách thủ công. Các socket thực sự không cần thiêt đối với việ phát triển các ứng dụng Web. Dù bạn dùng Java, serlet, hay CGI,PHP,…, có thể bạn sẽ không bao giờ mở được cổng một cách tường minh. Các socket vẫn tồn tại để kết nối người dùng với ứng dụng Web, nhưng các chi tiết của socket được ẩn trong những lớp sâu hơn để mọi người không phải động chạm đến.

Các lập trình viên có thể tránh được những khó khăn của việc tạo socket nhờ thư viện lớp các thế hệ mới, chẳng hạn Microsoft Foundation Clas Csocket và CsocketFile. Lập trình viên Uinix có thể dùng Socket++

Lập trình viên Java có tập hợp công cụ riêng về socket. Java.net.Socket là lớp được dùng rộng rãi trong việc tạo ra các socket phía yêu cầu dịch vụ độc lập hệ thống, trong khi java.net.ServerSocket có thể xây dựng một socket sẵn sàng cho việc nhận các yêu cầu từ máy yêu cầu dịch vụ. Với những công cụ này, các nhà phát triển có thể nhanh chóng tạo ra các socket mà không cần phải “sa lầy “ trong các chi tiết lập trình.

Một chương trình Socket bằng java:

Chương trình được mô tả như sau:
1/ Server:
- Lắng nghe và chập nhận kết nối từ cổng 9999.
- Cho phép nhiều client kết nối đến cùng một lúc.
- Khi client gửi đến 1 chuỗi thì :
+ Nếu chuỗi là "quit" thì ngắt kết nối với client.
+ Tiến hành đảo chuỗi.
+ Gửi chuỗi đã được đảo cho client.
2/ Client:
- Kết nối tới Server qua cổng 9999.
- Nhập chuỗi từ bàn phím.
- Gửi chuỗi tới server.
- Hiển thị chuỗi từ server gửi tới.

Bây giờ là các bước lập trình:

Các thư viện cần thiết:
import java.io.*;
import java.net.*;

1/ Lập trình phía máy chủ:
server.java:
Lập trình socket thì trước hết cần tạo ra một đối tượng socket. Vì là phía server nên phải là ServerSocket.
ServerSocket sk=new ServerSocket(9999); // lắng nghe cổng 9999
Để cho phép cùng một lúc có nhiều client kêt nối đến thì cần có một tiến trình. Mỗi khi có một kết nối thì tương ứng một tiến trình được tạo ra.
boolean listening=true;
while(listening){
new threadServer(sk.accept()).start();
}
Tiến trình được tạo ra ở đây có tên là thread Server. Lớp threadServer có phương thức khởi tạo có tham số là một đối tượng socket. socket này chính là socket được server chấp nhận kết nối. Dướ i đây là mã nguồn của lớp threadServer:
import java.io.*;
import java.net.*;
import java.util.*;
public class threadServer extends Thread {
Socket socket=null;
public threadServer(Socket socket){
this.socket=socket;
}
public void run(){
try{
PrintWriter out=new PrintWriter(socket.getOutputStream(),true);
BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String inLine;
while(true){
inLine=in.readLine();
Calendar cal =new GregorianCalendar();
if(inLine.equalsIgnoreCase("quit"))break;
else {
out.println(daochuoi(inLine));
}
}
}catch(IOException e){
e.printStackTrace();
}
}
public String daochuoi(String st){
int j=0;
Char[] c=st.toCharArray();
for(int i=st.length();i>=0;i--){
c[j]=st.charAt(i);
++j;
}
String st2= String(c);
return st2;
}
}
Như vậy là xong phía máy chủ.

2/ Lập trình phía máy khách:
Class client.java:
import java.io.*;
import java.net.*;
public class client {
public static void main(String[] args)throws Exception{
Socket cSk=null;
PrintWriter out=null;
BufferedReader in=null;
try{
cSk=new Socket("127.0.0.1",9999);// khởi tạo một socket
// out : đưa chuỗi lên server
out=new PrintWriter(cSk.getOutputStream(),true);
// in: nhận chuỗi được gửi từ server
in=new BufferedReader(new InputStreamReader(cSk.getInputStream()));
}catch(IOException e){
e.printStackTrace();
}
String inLine;
// uIn: cho phép nhập một chuỗi từ bàn phím.
BufferedReader uIn=new BufferedReader(new InputStreamReader(System.in));
while(true){
inLine=uIn.readLine();// tiến hành đọc từ bàn phím và gán chuỗi đọc được cho inLine
if(inLine.equalsIgnoreCase("quit")){
break;
}
out.println(inLine);// gửi chuỗi lên server
out.flush();
System.out.println(in.readLine());// in ra màn hình chuỗi nhận về từ server
}
}
}
** Chạy chương trình:
- chạy file server.java trước sau đó là client.java. Bạn có thể dùng telnet thay cho client cũng được. Để dùng telnet: vào DOS đánh dòng lệnh telnet 127.0.0.1 9999. Bây giờ nhập vào một chuỗi sẽ nhận được ngay một chuỗi mới là đảo của chuỗi vừa nhập vào.
Trên là chương trình rất nhỏ. Với socket bạn có thể viết hẳn một ứng dụng có tính thực tế như: chương trình chat peer - to - peer, hoặc một chương trình gửi thư đơn giản sử dụng SMTP.
 
Last edited by a moderator:
H

haiphongit_cntt

Trời em post thế ai mà nhìn cho đc , những đoạn mã em phải cho vào thẻ
Mã:
 nhé . Chứ ko post thế đc đâu . Chú ý rút kinh nghiệm
 
Top Bottom