2016-09-29 38 views
0

我已经编写了以下代码,用于使用套接字从客户端向服务器发送文本文件。我对JAVA和Socket编程都很陌生。我觉得我有套接字的概念,但Java Streams很混乱。 以下代码的任何帮助将非常有帮助。 请提及推理的错误和解决方案。Java套接字编程和流

数据似乎发送得很好。但是在另一端没有收到。

服务器代码:

import java.io.*; 
import java.net.*; 

public class Server { 
    public static void main(String[] args) throws Exception { 
     ServerSocket serverSocket = new ServerSocket(3000); 
     while(true) 
     { 
      Socket convSocket = serverSocket.accept(); 
      System.out.println("connection accepted"); 

      BufferedReader in = new BufferedReader(new InputStreamReader(convSocket.getInputStream())); 
      FileWriter fileOut = new FileWriter("/Users/aakashmalhotra/a.txt"); 

      int c; 
      while((c = in.read()) != -1){ 
       fileOut.write(c); 
      } 
      System.out.println("Transfer Done"); 
     } 


    } 
} 

客户端代码:

import java.io.*; 
import java.net.Socket; 

public class Client { 
    public static void main(String[] argv) throws Exception { 
     Socket clientSocket = new Socket("localhost", 3000); // create a socket 

     PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); 
     BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

     BufferedReader fileIn = new BufferedReader(new FileReader("/Users/aakashmalhotra/s.txt")); 

     int c; 
     while ((c = fileIn.read()) != -1) { 
      out.write(c); 
     } 

    } 
} 
+1

其中之一,你似乎并没有关闭你的读者或作家。 –

+0

...和另一个“抛出异常”,而不是你的问题的原因,只是不应该做的。至少,捕捉异常和打印堆栈跟踪。 –

+0

如果你不使用阅读器,而是使用Streams,它会更有效率,更普遍化。如果您只是复制字节,则不需要将字节转换为字符的麻烦 – MeBigFatGuy

回答

2

你需要.flush()或.close()在客户端的出作家。

+1

或者更好的是使用try-with资源语句。 – flakes

+0

@ flkes:如果你使用线程和帮助类来处理你的流,那么存在一个危险。 –

+0

@HovercraftFullOfEels当然,在这种情况下,稍后手动关闭它不会过早地杀死流 – flakes

0

IO对象,特别是流,总是需要关闭。这是因为操作系统针对这些类型的操作进行了优化,并决定何时应该在管道上发送数据。关闭资源确保发送剩余的数据。例如,对于服务器端:

import java.io.*; 
import java.net.*; 

public class Server { 
    public static void main(String[] args) throws Exception { 
     ServerSocket serverSocket = new ServerSocket(3000); 
     while (true) { 
      Socket convSocket = serverSocket.accept(); 
      System.out.println("connection accepted"); 

      try (BufferedReader in = new BufferedReader(new InputStreamReader(convSocket.getInputStream()))) { 
       try (FileWriter fileOut = new FileWriter("/Users/aakashmalhotra/a.txt")) { 
        int c; 
        while ((c = in.read()) != -1) { 
         fileOut.write(c); 
        } 
        System.out.println("Transfer Done"); 
       } 
      } 
     } 
    } 
} 

必须注意的一个尝试,与资源语句的使用,这确保了流将不管你申请的结果而结案是很重要的。这可以确保您的流将始终关闭,并且没有资源会泄漏。