Posted for Schoolboy_Hy: Help me java socket tcp

Joe

Thành viên VIP
21/1/13
2,704
1,246
113
I don't answer privately anyone because this Congdongjava.com is for everyone and with everyone who wants to learn , to help or to discuss about JAVA.
____________________________________________________________________________________
The principle of CS communication is exactly like a phone communication. The one speaks, the other hears and vice-versa. Client sends, server receives and vice-versa. And that's the rule. Your codes don't care about this rule. Your client and server work unsynchronized and won't listen each other. That's the problem you encountered. I commented the superfluous code lines and amended the codes...
____________________________________________________________________________________
Đề Bài:
Viết chương trình trao đổi file giữa Client – Server, client có thể send
file lên server hoặc get file xuống từ server, yêu cầu cụ thể:
– Server có thể đáp ứng được nhiều client đồng thời.
– Client có thể gửi request sendFile(filename) để gửi một file bất kỳ lên server:
o Nếu trên server đã tồn tại 1 file trùng tên, server sẽ gửi response từ chối nhận file tới client
o Nếu trên server không có file trùng tên server sẽ gửi reponse OK thông báo chấp nhận file xuống client và bắt đầu nhận dữ liệu file được truyền từ client và lưu trữ dữ liệu dưới tên file nhận được từ client (trong lệnh
sendFile request) vào thư mục hiện thời.
– Client có thể gửi request getFile(filename) với 1 filename cụ thể để yêu cầu get dữ liệu file từ server, server sẽ kiểm tra tên file trong thư mục hiện thời:
o Nếu trên server không tồn tại file với tên yêu cầu, server gửi response từ chối truyền file.
o Nếu tồn tại file với tên được yêu cầu server sẽ gửi response OK và thực hiện truyền dữ liệu file xuống client.

Bài của em bị vài lỗi
1.File gửi lên Server không gửi hết file -> lỗi
2.Chưa xử lý được các yêu cầu ngoại lệ như: trùng tên file, chọn file từ server để gửi,..
Mong anh giúp đỡ


PHP:
public class Server {

        public void serve() {
                System.out.println("Server is ready...");
                int tmp = 0;
                try {
                        ServerSocket myServer = new ServerSocket(1992);
                        while (true) {
                                System.out.println("Client " + ++tmp);
                                Socket mySocket = myServer.accept();
                                new ThreadServer(mySocket).start();
                        }

                } catch (IOException ex) {
                        Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
                }
        }

        public static void main(String[] args) {
                Server sv = new Server();
                sv.serve();
        }
}
---------
PHP:
public class ThreadServer extends Thread {

        private Socket mySocket;

        public ThreadServer(Socket mySocket) {
                this.mySocket = mySocket;
        }

        @Override
        public void run() {
                //FileInputStream fis = null;
                try {
/*
                        //super.run();
                        //nhan tin hieu tu client
                        File myFile = new File("D://Dreamweaver5.rar");//
                        fis = new FileInputStream(myFile);
                        byte[] mybytearray = new byte[1024 * 1024 * 10];
                        BufferedInputStream bis = new BufferedInputStream(fis);
                        bis.read(mybytearray, 0, mybytearray.length);
*/
                        OutputStream os = mySocket.getOutputStream();
                        InputStream  is = mySocket.getInputStream();
                        byte[] buf = new byte[256];
                        int n = is.read(buf); // read the file name
                        if (n > 0) {
                                int rn = 0;
                                FileInputStream fis = new FileInputStream(new String(buf,0,n));
                                buf = new byte[fis.available()];
                                while ((n = fis.read(buf)) > 0) {
                                        System.out.println("Sending..." + n);
                                        os.write(buf, 0, n);
                                        rn += n;
                                }
                                fis.close();
                        } else {
                                buf = ("Something goes wrong!").getBytes();
                                os.write(buf);
                        }
                        os.flush();
                        is.close();
                        mySocket.close();
                // enough with this catch. Don't confuse with details you don't need or
                // have interest.
                } catch (Exception ex) {
                        Logger.getLogger(ThreadServer.class.getName()).log(Level.SEVERE, null, ex);
                }
/*
                } catch (FileNotFoundException ex) {
                        Logger.getLogger(ThreadServer.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IOException ex) {
                        Logger.getLogger(ThreadServer.class.getName()).log(Level.SEVERE, null, ex);
                } finally {
                        try {
                                fis.close();
                        } catch (IOException ex) {
                                Logger.getLogger(ThreadServer.class.getName()).log(Level.SEVERE, null, ex);
                        }
                }
*/
        }

}
-------
PHP:
public class Client {

        //public void connect() {
        public void connect(String fname) {
                try {
                        Socket mySocket = new Socket("localhost", 1992);
/*
                        //DataOutputStream dos=new DataOutputStream(mySocket.getOutputStream());
                        byte[] mybytearray = new byte[1024 * 1024 * 10];
                        // nơi chứa file
                        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\eclipse.rar"));
*/
                        InputStream is = mySocket.getInputStream();
                        OutputStream os = mySocket.getOutputStream();
                        os.write(fname.getBytes()); // ask for the file
                        FileOutputStream fos = new FileOutputStream(fname);
                        //
                        byte[] buf = new byte[1024 * 1024 * 10];
                        int n = 0;
                        int rn = 0;
                        while ((n = is.read(buf)) > 0) {
                                fos.write(buf, 0, n);
                                rn += n;
                        }
                        //bos.flush();
                        //bos.close();
                        is.close();
                        os.close();
                        fos.flush();
                        fos.close();
                        mySocket.close();

                //} catch (IOException ex) {
                } catch (Exception ex) {
                        Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
                }

        }

        public static void main(String[] args) {
                Client client = new Client();
                String fname = (args.length > 0)?args[0]:"E:\\eclipse.rar";
                //client.connect();
                client.connect(fname);
        }
}
 
Sửa lần cuối: