代码之家  ›  专栏  ›  技术社区  ›  Ashutosh

java:将文件传输到服务器,并从服务器获取大写文件

  •  0
  • Ashutosh  · 技术社区  · 6 年前

    我想发封信。txt文件从客户端发送到服务器,并以大写形式返回。 但这段代码什么都不做。谁能告诉我这里出了什么问题。。?

    服务器:从客户端获取文件,并将其以大写形式发送回客户端。

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Arrays;
    
    public class Assignment4_Server {
    
        public static void main(String[] args) throws IOException {
            byte[] bytearray = new byte[4096];
            try (ServerSocket ss = new ServerSocket(4444)) {
                Socket s = ss.accept();
                InputStream is = s.getInputStream();
                OutputStream os = s.getOutputStream();
                int count;
                String data = null ;
                while((count = is.read(bytearray))>0){
                    data = Arrays.toString(bytearray).toUpperCase();
                    byte[] bytearrayout = data.getBytes();
                    os.write(bytearrayout);
                }
                s.close();
            }
        }
    }
    

    客户:发送短信。txt文件发送到服务器,并在转换后以大写形式返回文件。

    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    
    
    public class Assignment4_client {
        public static void main(String[] args) throws IOException {
            File file = new File("test.txt");
            byte[] bytearray = new byte[4096];
            Socket sc = new Socket("localhost",4444);
            //send file
            int countS , countR;
            FileInputStream fis = new FileInputStream(file);
            BufferedInputStream bis = new BufferedInputStream(fis);
            OutputStream os = sc.getOutputStream();
            while((countS = bis.read(bytearray))>0){
            os.write(bytearray);
            }
            //recieve file in uppercase from server
            InputStream is = sc.getInputStream();
            byte[] bytearray2 = new byte[4096];
            FileOutputStream fos = new FileOutputStream(file);
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            while((countR = is.read(bytearray2))>0){
                bos.write(bytearray2);
            }
        }   
    }
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   Alex C.    6 年前

    这里有一个代码可以帮助你。但在阅读之前,你应该意识到发生了什么:

    1. 您的客户端没有向服务器发送“停止读取”信息(请阅读下面的客户端代码)。这就是服务器在试图读取客户端发送的数据时陷入while循环的原因。这可能就是您试图将数据直接发送回客户机的原因。关闭客户端的套接字输出,以遵守套接字约定,并正确释放套接字(请参阅TCP/IP)。
    2. 给出的解决方案没有考虑到服务器在完成任务后应该保持正常工作。然后,服务器将不能同时为多个客户机提供服务。这个服务器提供一次性服务,这是毫无意义的。为了克服这个问题,你应该把所有的东西都放在一个while循环中,并将每个新的服务器进程绑定到一个新的线程中(我允许你这么做,这很有趣)。
    3. 服务器没有考虑数据的全部大小,如果数据太重,可能会出现内存不足错误。您应该找到一种方法,在实际实现中避免这个问题。
    4. 这两个程序都应该捕获异常并将其记录在某个地方,这样您就可以发现任何错误。
    5. 编写服务器并不是那么简单。通常情况下,你应该写一些带有标题和其他类似内容的协议。为了避免这种情况,可以使用ObjectOutputStream和ObjectInputStream之类的对象,但它有一些限制,比如在Java世界中限制服务器。

    客户

    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.net.Socket;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.IOException;
    
    public class Client {
    
    
        public void send(File file)
        {
            Socket sc = null;
            try
            {
                byte[] bytearray = new byte[4096];
                sc = new Socket("localhost", 4444);
    
                // 1. Read the file, send its content, close it. 
                int count;
                FileInputStream fis = new FileInputStream(file);
                BufferedInputStream bis = new BufferedInputStream(fis);
                OutputStream os = sc.getOutputStream();
    
                while((count = bis.read(bytearray))>0)
                {
                    os.write(bytearray);
                }
                fis.close();
                sc.shutdownOutput();
    
                // 2. Delete old file, receive data, write it to new File.
                InputStream is = sc.getInputStream();
                bytearray = new byte[4096];
                // Eventually do what you want with the file: new one, append, etc.
                file.delete();
                file.createNewFile();
                FileOutputStream fos = new FileOutputStream(file);
                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
                count = 0;
                while((count = is.read(bytearray)) > 0)
                {
                    bos.write(bytearray, 0, count);
                }
                fos.close();
                bos.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            finally
            {
                if (sc != null)
                {
                    try
                    {
                        sc.close();
                    } catch (IOException e) {}
                }
            }
        }
    }
    

    服务器

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Server
    {
        Server()
        {
            Socket s = null;
            byte[] bytearray = new byte[4096];
            try (ServerSocket ss = new ServerSocket(4444))
            {
                s = ss.accept();
                InputStream is = s.getInputStream();
    
                // 1. Recieve data and put it to UpperCase.
                String data = "";
                int count;
                while((count = is.read(bytearray)) > 0)
                {
                    data += new String(bytearray, 0, count);
                }
                data = data.toUpperCase();
                System.out.println(data);
    
                // 2. Send back data.
                OutputStream os = s.getOutputStream();
                os.write(data.getBytes());
                os.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }
    

    测试程序

    这将帮助您在IDE中测试同一项目中的两个程序。

    import java.io.File;
    
    public class Test
    {
        public static void main(String[] args)
        {
            Client c = new Client();
            (new Thread()
            {
                public void run()
                {
                    Server s = new Server();
                }
            }).start();
            c.send(new File("test.txt"));
        }
    }
    
        2
  •  0
  •   user207421    6 年前

    这里的问题是两件简单的事情。

    1. 服务器在一个必须用于回复的套接字上读取数据,直到流结束。因此,客户端在发送请求以提供EOS后无法关闭它,因此必须在发送请求后关闭套接字以进行输出。

    2. 你的复制循环是错误的。一般形式为:

      while ((count = in.read(buffer)) > 0)
      {
           out.write(buffer, 0, count);
      }
      

      写入时忽略了读取计数,所以将在流的末尾或其他任何时间写入垃圾 read() 不能填满 buffer ,可以是任何时间。