Java – Lập trình mạng với Socket

1. Client

Phần này chúng ta sẽ xem thử 1 ví dụ cách tạo kết nối đến một chương trình server sử dụng lớp Socket, và sau đó là cách máy khách gửi và nhận dữ liệu từ server thông qua socket.

Ví dụ này chúng ta sẽ hiện thực 1 máy khách gọi là YinClient. Client này sẽ kết nối đến máy chủ YinServer. Máy chủ YinServer sẽ nhận sữ liệu và trả lời nó.

YinClient sẽ tạo 1 socket kết nối đến Yin server, đọc dữ liệu do người dùng nhập vào và gửi đến Yin server thông qua socket. Server sẽ trả lời thông điệp và gửi lại client thông qua socket. Chương trình client sẽ đọc và hiển thị dữ liệu nhận lại được server:

import java.io.IOException;

import java.io.PrintWriter;

import java.net.Socket;

import java.net.UnknownHostException;

import java.util.Scanner;

public class YinClient {

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

Socket inComing = null; //Đối tượng socket

PrintWriter out = null; //Đối tượng gửi dữ liệu qua socket

Scanner in = null; //Đối tượng nhận dữ liệu từ socket

try {

/*

* Tạo một socket mới kết nối đến máy có tên là “localhost” thông qua cổng 9999

* Ở đây localhost chính là tên địa chỉ cục bộ máy của bạn

* Nếu kết nối đến máy khác bạn hãy gõ đúng tên địa chỉ của máy đó

*/

inComing = new Socket(“localhost”,9999);

System.out.println(“Client: Đã kết nối máy chủ”);

// Tạo đối tượng PrintWriter, tham số truyền vào là luồng Output của socket

// Tham số true để PrintWrite tự động flush

out = new PrintWriter(inComing.getOutputStream(), true);

in = new Scanner(inComing.getInputStream());

// Tạo đối tượng Scanner đọc thông tin từ bàn phím

Scanner sc = new Scanner(System.in);

// Chuỗi người dùng nhập vào

String userInput=“”;

// Hiển thị lời chào của Server

System.out.println(“Server: “ + in.nextLine());

// Vòng lặp nhập xuất

while (!userInput.equals(“exit”)) {

System.out.print(“Client: “);

userInput = sc.nextLine();

out.println(userInput);

System.out.println(in.nextLine());

}

// Đóng các kết nối

out.close();

in.close();

inComing.close();

} catch (UnknownHostException e) {

System.err.println(“Không tìm thấy máy chủ.”);

System.exit(1);

} catch (IOException e) {

System.err.println(“Không thế kết nối máy chủ”);

System.exit(1);

}

}

}

Chú ý rằng YinClient sẽ thực hiện cả 2 tác vụ là gửi và nhận dữ liệu từ YinServer thông qua socket.

Chúng ta bắt đầu xem xét cách hoạt động của chương trình. Hãy chú ý đến 4 dòng lệnh đầu tiên trong khối try của phương thức main. Nhiệm vụ của chúng là tạo một socket kết nối giữa client và server, sau đó tạo PrintWriter và Scanner để đọc và ghi dữ liệu thông qua luồng của socket.

inComing = new Socket(“localhost”,9999);
System.out.println(“Client: Đã kết nối máy chủ”);

// Tạo đối tượng PrintWriter, tham số truyền vào là luồng Output của socket

// Tham số thứ 2 là true để PrintWrite tự động flush

out = new PrintWriter(inComing.getOutputStream(), true);
in = new Scanner(inComing.getInputStream());

Dòng lệnh đầu tiên sẽ tạo 1 Socket với tên là inComing. Phương thức khởi tạo của Socket yêu cầu tên của máy chủ và số hiệu cổng cần kết nối. Trong ví dụ này chúng ta đã sử dụng chính máy của mình để thực hiện nên tên mặc định sẽ là “localhost”.

Dòng lệnh thứ 2 sẽ lấy luồng xuất và tạo một PrintWriter trên nó. Cũng thế, bạn có thể đoán ra được công dụng của dòng lệnh thứ 3 là tạo một đối tượng Scanner trên luồng nhập của socket để đọc dữ liệu (Nếu bạn chưa quen với các đối tượng nhập xuất (I/O) của java, bạn có thể đọc thêm các tài liệu nói về vấn đề này, chúng khá phổ biến.).

// Hiển thị lời chào của Server

System.out.println(“Server: “ + in.nextLine());

 

Dòng lệnh trên sẽ hiển thị lời chào của Server và in ra màn hình xuất. Dĩ nhiên chúng ta sẽ làm điều này khi bắt tay vào làm Server. Server sẽ tự động xuất ra lời chào khi có máy khách kết nối đến nó.

Phần thú vị của chương trình nằm trong vòng lặp while phía sau. Vòng lặp này sẽ đọc 1 dòng dữ liệu 1 lần từ luồng nhập chuẩn từ người dùng, sau đó ngay lập tức gửi chúng đến server bằng PrintWriter thông qua socket. Tôi tạm gọi nó là vòng lặp nhập xuất:

 

// Vòng lặp nhập xuất

while (!userInput.equals(“exit”)) {

System.out.print(“Client: “);

userInput = sc.nextLine();

out.println(userInput);

System.out.println(in.nextLine());

}

 

Trong thân vòng lặp, chương trình sẽ đọc 1 dòng nhập từ bàn phím sau đó gửi đến server. Dòng cuối cùng của vòng lặp là in thông điệp trả lời của máy chủ. Chú ý rằng để ngừng vòng lặp, ta đã kiểm tra điều kiện cho vòng lặp là dòng thông điệp người dùng gõ vào phải khác “exit”. Nghĩa là việc gõ vào từ exit trong khi bạn nhập thông điệp sẽ đưa bạn thoát ra khỏi vòng lặp.

Một khi đã thoát khỏi vòng lặp, ta sẽ thực hiện đóng các kết nối lại thông qua các câu lệnh sau:

 

// Đóng các kết nối

out.close();

in.close();

inComing.close();

 

Hãy nhớ việc đóng các luồng này lại khi bạn thực hiện xong việc kết nối giữa các máy. Một chương trình tốt luôn cố gắng dọn dẹp những thứ nó đã tạo ra khi kết thúc. Những dòng lệnh trên sẽ đóng luồng đọc và ghi kết nối của socket, sau đó là đóng socket kết nối đến server. Thứ tự này là cần thiết. Bạn nên đóng các luồng kết nối đến socket trước khi đóng socket lại.

Chương trình này sẽ kết nối đơn giản thẳng đến server vì nó sử dụng một giao thức đơn giản. Client gửi text đến server, và server gửi trả lại thông điệp. Các bước tiến hành chung cho quá trình này có thể tóm lại như sau:

1. Mở socket

2. Mở luồng nhập và xuất đến socket.

3. Đọc và ghi thông tin qua luồng theo giao thức của server.

4. Đóng các luồng

5. Đóng socket.

 

2. Server

Bạn đã tạo xong 1 client, bước tiếp theo chúng ta sẽ tạo 1 server để client có thể kết nối vào. Cách thức hoạt động của Server chúng ta sắp tạo ra  không khác Client là mấy. Ngoại trừ việc thêm vào một đối tượng ServerSocket.
Đây là mã nguồn của YinServer:

import java.io.IOException;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.Scanner;

public class YinServer {

private static ServerSocket server=null;

public static void main(String[] args) {

try {

server = new ServerSocket(9999);

System.out.println(“Server: Đã khởi động máy chủ”);

Socket soc = server.accept();

PrintWriter out = new PrintWriter(soc.getOutputStream(), true);

Scanner in = new Scanner(soc.getInputStream());

String inputLine;

// Gửi lời chào đến Client

out.println(“Xin chào”);

// Vòng lặp nhập xuất

while (true){

if(!in.hasNextLine())

break;

inputLine=in.nextLine();

if(inputLine.equalsIgnoreCase(“exit”))

{

out.println(“Server: Ngắt kết nối máy khách”);

break;

}else

out.println(“Server: Đã nhận được thông điệp”);

}

out.close();

in.close();

server.close();

} catch (IOException e) {

System.out.println(“Không thể tạo kết nối”);

System.exit(1);

}

}

}

Lp ServerSocket có đ mi th ta cn đ viết các server bng Java. Nó có các constructor đ to các đi tượng ServerSocket mi, các phương thc đ lng nghe các liên kết trên mt cng xác đnh, và các phương thc tr v mt Socket khi liên kết được thiết lp, vì vy ta có th gi và nhn d liu.

Vòng đời của một server

1. Một ServerSocket mới được tạo ra trên một cổng xác định bằng cách sử dụng một constructor ServerSocket.

2. ServerSocket lắng nghe liên kết đến trên cổng đó bằng cách sử dụng phương thức accept(). Phương thức accept() phong tỏa cho tới khi một client thực hiện một liên kết, phương thức accept() trả về một đối tượng Socket mà liên kết giữa client và server.

3. Tùy thuộc vào kiểu server, hoặc phương thức getInputStream(), getOutputStream() hoặc cả hai được gọi để nhận các luồng vào ra để truyền tin với client.

4. server và client tương tác theo một giao thức thỏa thuận sẵn cho tới khi ngắt liên kết.

5. Server, client hoặc cả hai ngắt liên kết

6. Server trở về bước hai và đợi liên kết tiếp theo.

 

Mt đi tượng ServerSocket hot đng trong mt vòng lp chp nhn các liên kết. Mi ln lp nó gi phương thc accept(). Phương thc này tr v mt đi tượng Socket biu din liên kết gia client và server. Tương tác giữa client và server được tiến hành thông qua socket này. Khi giao tác hoàn thành, server gi phương thc close() ca đi tượng socket. Nếu client ngt liên kết trong khi server vn đang hot đng, các lung vào ra kết ni server vi client s đưa ra ngoi l InterruptedException trong ln lp tiếp theo

· public Socket accept() throws IOException

Khi bước thiết lập liên kết hoàn thành, và ta sẵn sàng để chấp nhận liên kết, cần gọi phương thức accept() của lớp ServerSocket. Phương thức này sẽ phong tỏa, nó dừng quá trình xử lý và đợi cho tới khi client được kết nối. Khi client thực sự kết nối, phương thức accept() trả về đối tượng Socket. Ta sử dụng các phương thức getInputStream() và getOutputStream() để truyền tin với client.

Bây giờ bạn hãy thử chạy chương trình server này trước, sau đó chạy Client và thử gõ thông điệp trong Client xem sao. Nếu không dùng YinClient, bạn có thể dùng chương trình Telnet có sẵn trong Windows để thực hiện.
Trong telnet, bạn sử dụng lệnh sau để kết nối vào YinServer:


localhost 9999


Để phát triển ứng dụng này, bạn có thể tạo 1 server có khả năng trò chuyện với client thông qua thông điệp người dùng nhập vào. TƯơng tự như các chương trình chat thông qua mạng nhưng ở một mức cơ bản nhất.


Chúc thành công!

 

 

 

http://yinyang-it.tk

3/12/2009

 

 

Dòng lệnh đầu tiên sẽ tạo 1 Socket với tên là inComing. Phương thức khởi tạo của Socket yêu cầu tên của máy chủ và số hiệu cổng cần kết nối. Trong ví dụ này chúng ta đã sử dụng chính máy của mình để thực hiện nên tên mặc định sẽ là “localhost”.

Dòng lệnh thứ 2 sẽ lấy luồng xuất và tạo một PrintWriter trên nó. Cũng thế, bạn có thể đoán ra được công dụng của dòng lệnh thứ 3 là tạo một đối tượng Scanner trên luồng nhập của socket để đọc dữ liệu (Nếu bạn chưa quen với các đối tượng nhập xuất (I/O) của java, bạn có thể đọc thêm các tài liệu nói về vấn đề này, chúng khá phổ biến.).

46 thoughts on “Java – Lập trình mạng với Socket

  1. Chào bạn, xin lỗi vì hôm qua ko vào blog nên chưa làm được, mình vừa coi và viết thêm vài đoạn mã trong bài của bạn.
    Server của bạn ko cần sửa nhiều, chỉ cần sử dụng thêm Thread để ứng dụng không bị “treo”. Phần client bạn phải có một vòng lặp nhận thông điệp và hiển thị lên jTextArea, không nên mỗi lần gửi dữ liệu là phải tạo kết nối mới.
    Sự kiện nhấn nút gửi chỉ dùng để gửi dữ liệu lên server chứ ko để vòng lặp nào trong đó hết.
    Trong bài này mình để phương thức kết nối trong constructor của client, nên trước khi chạy client bạn phải chạy server trước. Nếu không bạn hãy tạo một button để gọi hàm connectToServer().

    Link tải:
    http://uploading.com/files/c191a89e/newsocket.rar/

    Thân!

    Trả lời
  2. Sửa thêm hộ mình cái threads trong code bạn sửa đc ko ?
    mình test mới chỉ kết nối đc với mỗi 1 client chứ ko đc nhiều client cùng 1 lúc :(…tự sửa lỗi tùm lum cả ^^…
    thanks trc nhé 🙂

    Trả lời
  3. Bạn thông cảm hiện tại mình đang trong thời gian bận nên không giúp được. Về phương pháp làm thì cũng không có gì phức tạp, bạn chỉ cần dùng Thread cho quá trình server đợi kết nối là được, như thế ứng dụng sẽ không bị “treo” mỗi lần server đang trong trạng thái chờ. Bạn có thể tham khảo các bài viết hướng dẫn căn bản link sau:

    http://java.sun.com/developer/onlineTraining/Programming/BasicJava2/socket.html

    Trả lời
  4. YinYang ơi !! cho mình hỏi , mình muốn gửi một danh sách các file đã share ở client lên server thì làm thế nào ah? và làm thế nào để server có thể scan file và tìm các file trùng nhau ( tên , kích thước , kiểu, … ) và gửi 1 thông điệp đến client để hỏi có muốn xóa file trùng đó ko ?? , mong bạn trả lời sớm nhất 🙂 , cảm ơn bạn !!

    Trả lời
  5. YinYang cho mình hỏi là mình có 1 bài là Client gửi lên Server chuỗi biểu thức tính toán và Server trả lại kết quả cho Client , mình dùng kí pháp Ba Lan chuyển trung tố sang hậu tố nhưng vấn đề mình gặp phải là nó in kết quả sai khi phân tích từ trung tố sang hậu tố trong 1 số trường hợp có dấu đóng mở ngoặc , bạn xem giúp mình chỗ này với .Thanks nhìu
    [CODE]
    import java.util.ArrayList;
    import java.util.Scanner;
    import java.util.Stack;

    public class Poland {
    Stack stack = new Stack();
    ArrayList list = new ArrayList();

    public void changeToSuffix(String str) {
    String s[] = str.split(” “);
    String operator = null;
    for (int i = 0; i 0) {
    operator = (String) stack.pop();
    if (operator.equals(“-“)
    || operator.equals(“*”)
    || operator.equals(“/”)) {
    list.add(operator);
    } else {
    stack.push(operator);
    stack.push(s[i]);
    break;
    }
    } else {
    stack.push(s[i]);
    break;
    }
    }
    } else if (s[i].equals(“-“)) {
    while (true) {
    if (stack.size() > 0) {
    operator = (String) stack.pop();
    if (operator.equals(“+”) || operator.equals(“*”)
    || operator.equals(“/”)
    ) {
    list.add(operator);
    } else {
    stack.push(operator);
    stack.push(s[i]);
    break;
    }
    } else {
    stack.push(s[i]);
    break;
    }
    }
    } else if (s[i].equals(“*”)) {
    while (true) {
    if (stack.size() > 0) {
    operator = (String) stack.pop();
    if (operator.equals(“/”)) {
    list.add(operator);
    } else {
    stack.push(operator);
    stack.push(s[i]);
    break;
    }
    } else {
    stack.push(s[i]);
    break;
    }
    }
    } else if (s[i].equals(“/”)) {
    while (true) {
    if (stack.size() > 0) {
    operator = (String) stack.pop();
    if (operator.equals(“*”)) {
    list.add(operator);
    } else {
    stack.push(operator);
    stack.push(s[i]);
    break;
    }
    } else {
    stack.push(s[i]);
    break;
    }
    }
    } else if (s[i].equals(“)”)) {
    while (stack.size() > 0) {
    operator = (String) stack.pop();
    if (!operator.equals(“(“))
    list.add(operator);
    }
    }
    }
    }
    while (stack.size() > 0) {
    operator = (String) stack.pop();
    list.add(operator);
    }
    System.out.print(list);
    System.out.println(stack);
    }
    public boolean checkNumber(String s) {
    int i;
    try {
    i = Integer.parseInt(s);
    return true;
    } catch (Exception e) {
    return false;
    }
    }

    public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.print(“Nhap phep toan : “);
    String s = input.nextLine();
    Poland p = new Poland();
    p.changeToSuffix(s);
    }
    }
    [/CODE]
    Ví dụ như là thế này 5 + ( (1 + 2 ) * 4 ) + 3 thì nó ra là
    [5, 2, +, +, 4, *, 3, +] trong khi phải ra đúng là thế này
    5 1 2 + 4 * + 3 +
    Toán hạng và toán tử cách nhau dấu cách nha bạn

    Trả lời
      • Mỗi client kết nối qua 1 socket mới vậy làm sao có thể lưu lại danh sách các socket đó vậy YinYang .Đây là code khi có 1 client kết nối đến server :
        class server extends Thread
        {
        @Override
        public void run()
        {
        try
        {
        int port=Integer.parseInt(txt_Port.getText());
        ServerSocket ss=new ServerSocket(port);
        lbl.setText(“Server start”);
        btn_start.setEnabled(false);
        btn_send.setEnabled(true);
        while(true)
        {
        obj2=new sv(ss.accept());
        obj2.start();
        }
        }
        catch(Exception ex){lbl.setText(“cannot start”);}
        }
        }
        Làm sao có thể lưu lại danh sách các socket đó .

  6. giúp mình với!! thank nhìu
    Viết 1 server cho phép nhiều client kết nối cùng lúc với các yêu cầu sau:
    Client có thể gửi yêu cầu là đường dẫn đến 1 ổ điã hoặc 1 thư mục nào đó bất kỳ trên server. Nếu
    đường dẫn đó tồn tại thị sẽ gửi về danh sách các thư mục con và các tập tin trong ổ đĩa / đường dẫn đó.
    Thiết kế client với cơ chế GUI nhận kết quả từ server và biểu diễn kết quả nhận được lên 1 JTree.

    lable Server textbox localhost
    lable Request Url textbox C:\
    1 khung lon chua Jtree

    Trả lời
  7. giúp mình với!! thank nhìu
    Viết 1 server cho phép nhiều client kết nối cùng lúc với các yêu cầu sau:
    Client có thể gửi yêu cầu là đường dẫn đến 1 ổ điã hoặc 1 thư mục nào đó bất kỳ trên server. Nếu
    đường dẫn đó tồn tại thị sẽ gửi về danh sách các thư mục con và các tập tin trong ổ đĩa / đường dẫn đó.
    Thiết kế client với cơ chế GUI nhận kết quả từ server và biểu diễn kết quả nhận được lên 1 JTree.

    lable Server textbox localhost
    lable Request Url textbox C:\
    1 khung lon chua Jtree

    Trả lời
  8. Mọi người cho mình hỏi. Mình cũng đang học lập trình mạng. Bây giờ mình muốn ứng dụng đa luồng vào để viết 1 ứng dụng chát đơn giản giữa server và client. Để mổi bên có thể gửi và nhận liên tiếp mà không phải chờ nhận xong mới gửi đi được.

    Đầu tiên mình tạo LuongVao://=====================================

    import java.awt.TextArea;
    import java.awt.TextField;
    import java.io.DataInputStream;
    import java.util.Scanner;
    public class LuongVao extends Thread{
    static TextArea hienthi=null;
    Scanner in=new Scanner(System.in);
    DataInputStream inStream=null;
    //Tao contructor
    public LuongVao(DataInputStream in, TextArea hienthi)
    {
    inStream=in;
    this.hienthi=hienthi;
    }
    public void run()
    {
    try{
    String st=inStream.readLine();
    hienthi.setText(st);
    }catch(Exception ex)
    {
    System.out.println(ex);
    }
    }
    }
    //==============================Tao luong ra
    package chat_server_client;
    import java.awt.TextField;
    import java.io.DataOutputStream;
    import java.util.Scanner;
    import javax.swing.JTextArea;
    public class LuongRa extends Thread{
    static TextField nhap=null;
    DataOutputStream outStream=null;
    Scanner in=new Scanner(System.in);
    public LuongRa(DataOutputStream out,TextField nhap)
    {
    outStream=out;
    this.nhap=nhap;
    }
    public void run()
    {
    try{
    String st=nhap.getText();
    outStream.writeBytes(st);
    outStream.write(13);
    outStream.write(10);
    outStream.flush();
    }catch(Exception ex)
    {
    System.out.println(ex);
    }
    }
    }

    //Sau đó ở Jframe client thì hàm main mình tạo kết nối vs server thành công rồi.
    Nhưng vấn đề là ở button gửi mình gọi 2 Luongra va luongvao ở trên không được
    Ở buttom sent mình viết như sau:
    //====================================
    String nhap=txtNhap.getText();
    txtNhap.setText(“”);
    String hienthi=txtHienthi.getText();
    txtHienthi.setText(txtHienthi.getText()+” \n “+nhap);
    try{
    new LuongVao(inStream,hienthi);//===========lỗi ở đây
    new LuongRa(outStream,nhap); //===========lỗi ở đây
    }catch(Exception ex)
    {
    System.out.println(“Khong the gui cho Server”+ex);
    }
    }

    //============Tuong tu o button sent cua server minh viet như sau:

    try{
    String nhap=txtNhap.getText();
    txtNhap.setText(“”);
    String hienthi=txtHienthi.getText();
    txtHienthi.setText(txtHienthi.getText()+”\n “+nhap);
    new LuongRa(outStream,nhap);//===========lỗi ở đây
    new LuongVao(inStream,hienthi);//===========lỗi ở đây

    }catch(Exception ex)
    {
    System.out.println(“Khong the gui cho client”+ex);
    }
    Mọi người hướng dẫn mình với. Cảm ơn mọi người nhiều

    Trả lời
  9. Yinyang ơi,,,
    Mình chưa bik gì về socket hết,,,,nhưng cái đề tài của mình là phải có socket để giúp client và server giao tiếp,,,,,
    Client là vi điều khiển,,,,sẽ gửi gói data lên server thông qua ,,, GPRS (lên tên miền,,,)
    server,,,,sẽ tách gói tin,,,để lấy những data cần thiết rùi hiển thị lên WEB,,,

    Mình ko rành về socket,,,để viết chương trình như thế này,,,,
    Bạn nào có thể giúp mình,,,,được không?

    mail của mình: huuhungbk0201@gmail.com
    Mong được giúp đỡ,

    Trả lời
  10. quên mất mình chép code ra đây bạn xem giùm mình nha.
    —phía máy tính
    package socketSever;

    import java.awt.Color;
    import java.awt.FileDialog;
    import java.awt.FlowLayout;
    import java.awt.Font;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JTextField;

    public class MayServerTransfer extends JFrame {

    String strFileName=””, filePath=””;
    ServerSocket socketserver;
    Socket clientSocket;
    ObjectOutputStream oos;
    ObjectInputStream ois;
    FileInputStream fis;

    JPanel p=new JPanel(new FlowLayout(FlowLayout.CENTER,10,10));
    JPanel p2=new JPanel(new FlowLayout(FlowLayout.CENTER,40,30));
    JPanel p3=new JPanel(new FlowLayout(FlowLayout.CENTER,20,20));
    JPanel pHoTenSV=new JPanel(new FlowLayout(FlowLayout.CENTER,50,40));
    JLabel lblTieuDe;
    JLabel lblDuongDanFile;
    JTextField otextFile;
    JButton btnBrowser;
    JButton btnSend;
    JButton btnDelete;
    JButton btnThoat;
    JLabel lblHoTen;
    JLabel lblMSSV;
    byte[] buffer;
    Thread th;
    public final int cong=8989;

    public void hamchinh()
    {
    setTitle(“Chương trình truyen File phía Server”);
    setSize(620, 320);
    setResizable(true);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    lblTieuDe=new JLabel(“Chương trình truyền file qua mạng dựa trên Socket”);
    lblTieuDe.setFont(new Font(“Times New Roman”,Font.BOLD,20));
    lblTieuDe.setForeground(Color.red);
    lblDuongDanFile=new JLabel(“Đường dẫn File”);
    otextFile=new JTextField(“”, 35);
    btnBrowser=new JButton(“Chọn File”);
    btnSend=new JButton(“Gửi”);
    btnDelete=new JButton(“Xóa”);
    btnThoat=new JButton(“Thoát”);
    lblHoTen=new JLabel(“Thực hiện đề tài : Nguyễn Trọng Tuyên”);
    lblMSSV=new JLabel(“MSSV : 12106681”);

    p2.add(lblTieuDe);
    p.add(p2);
    p.add(lblDuongDanFile);
    p.add(otextFile);
    p.add(btnBrowser);
    p3.add(btnSend);
    p3.add(btnDelete);
    p3.add(btnThoat);
    p.add(p3);
    pHoTenSV.add(lblHoTen);
    pHoTenSV.add(lblMSSV);
    p.add(pHoTenSV);
    this.add(p);

    th = new Thread(new Runnable() {

    @Override
    public void run() {
    try {
    socketserver = new ServerSocket(cong);
    System.out.println(“ready”);
    while(true)
    {

    clientSocket=socketserver.accept();
    JOptionPane.showMessageDialog(null, “Client ket noi”);
    fis=new FileInputStream(filePath);
    buffer=new byte[fis.available()];
    fis.read(buffer);
    ObjectOutputStream oos=new ObjectOutputStream(clientSocket.getOutputStream());
    oos.writeObject(buffer);
    oos.flush();
    //oos.close();
    //clientSocket.close();
    }
    } catch (IOException e) {
    e.printStackTrace();
    }

    }
    });
    th.start();

    btnBrowser.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    filePath=showDialog();
    otextFile.setText(filePath);
    int index=filePath.lastIndexOf(“\\”);
    strFileName=filePath.substring(index+1);
    }
    });
    btnSend.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
    try
    {
    fis = new FileInputStream(filePath);
    buffer=new byte[fis.available()];
    fis.read(buffer);
    ObjectOutputStream oos=new ObjectOutputStream(clientSocket.getOutputStream());
    oos.writeObject(buffer);
    oos.flush();
    oos.writeObject(strFileName);
    oos.flush();

    JOptionPane.showMessageDialog(null, “Gửi thành công tới Client”, “Xác nhận”, JOptionPane.INFORMATION_MESSAGE);
    oos.close();
    clientSocket.close();
    }
    catch(IOException ex1)
    {
    JOptionPane.showMessageDialog(null, “Chưa chọn File cần gửi!”, “Thông báo”,JOptionPane.INFORMATION_MESSAGE);
    }
    catch(Exception ex2)
    {
    JOptionPane.showMessageDialog(null, “Chưa có Client kết nối đến Server!”, “Thông báo”,JOptionPane.INFORMATION_MESSAGE);
    }
    }
    });
    btnDelete.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
    otextFile.setText(“”);
    }
    });
    btnThoat.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
    System.exit(0);
    }
    });

    setVisible(true);
    }

    private String showDialog() {
    FileDialog dl=new FileDialog(new JFrame(),”Select File”,FileDialog.LOAD);
    dl.setVisible(true);
    return dl.getDirectory()+dl.getFile();
    }

    public static void main(String[] args) {
    MayServerTransfer obj=new MayServerTransfer();
    obj.hamchinh();
    }
    }

    — phía điện thoại
    package client;

    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.net.Socket;
    import java.net.UnknownHostException;

    import clien.receive.com.R;
    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;

    @SuppressLint(“SdCardPath”) public class MainActivityClass extends Activity {

    TextView tuade;
    TextView socong;
    EditText editportnum;
    TextView ipadd;
    EditText editipadd;
    Button ketnoi;
    TextView ten;
    TextView ms;
    Socket socketclient;
    Thread th;
    int cong=8989;
    byte[] buffer;
    FileOutputStream fos;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_layout);
    tuade=(TextView) findViewById(R.id.lblTieuDe);
    socong=(TextView) findViewById(R.id.lblPort);
    editportnum=(EditText) findViewById(R.id.txtPort);
    ipadd=(TextView) findViewById(R.id.lblIPAddress);
    editipadd=(EditText) findViewById(R.id.txtIPAddress);
    ketnoi=(Button) findViewById(R.id.btnKetNoi);
    ten=(TextView) findViewById(R.id.svthuchien);
    ms=(TextView) findViewById(R.id.mssv);
    ketnoi.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v)
    {
    // TODO Auto-generated method stub
    th=new Thread(){

    @Override
    public void run() {
    // TODO Auto-generated method stub
    try {
    socketclient=new Socket(editipadd.getText().toString(),cong);

    ObjectInputStream ois=new ObjectInputStream(socketclient.getInputStream());
    try {
    buffer=(byte[]) ois.readObject();

    fos=new FileOutputStream(“/sdcard/DCIM/”);
    fos.write(buffer);
    } catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    socketclient.close();
    } catch (UnknownHostException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }};
    th.start();
    }
    });
    }
    }

    Trả lời
  11. Pingback: Java – Lập trình mạng với Socket | Lập Trình Pro

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s