2012-11-11 44 views
0

这是一项任务。使用java套接字从客户端发送文本文件到服务器

我在寻找一些建议,以便我在这里出错。我的目标是从文件中读取文本,将其发送到服务器并将该文本写入新文件。

问题是即时通讯不完全确定如何做到这一点,我看了很多例子,其中没有太多的帮助。

按原样解释程序。用户将被要求输入一个与该代码的if语句相关的代码。我想要关注的是代码200,它是服务器代码的上传文件。

当我运行代码我有我得到下面的这个错误。有人可以向我解释我哪里会出错,我会很感激。

Connection request made 
Enter Code: 100 = Login, 200 = Upload, 400 = Logout: 
200 
java.net.SocketException: Connection reset 
     at java.net.SocketInputStream.read(Unknown Source) 
     at java.net.SocketInputStream.read(Unknown Source) 
     at sun.nio.cs.StreamDecoder.readBytes(Unknown Source) 
     at sun.nio.cs.StreamDecoder.implRead(Unknown Source) 
     at sun.nio.cs.StreamDecoder.read(Unknown Source) 
     at java.io.InputStreamReader.read(Unknown Source) 
     at java.io.BufferedReader.fill(Unknown Source) 
     at java.io.BufferedReader.readLine(Unknown Source) 
     at java.io.BufferedReader.readLine(Unknown Source) 
     at MyStreamSocket.receiveMessage(MyStreamSocket.java:50) 
     at EchoClientHelper2.getEcho(EchoClientHelper2.java:34) 
     at EchoClient2.main(EchoClient2.java:99) 

和服务器上此错误:

Waiting for a connection. 
connection accepted 
message received: 200 
java.net.SocketException: Socket is not connected 
     at java.net.Socket.getInputStream(Unknown Source) 
     at EchoServer2.main(EchoServer2.java:71) 

回答

3

MyStreamSocket类并不需要扩展插槽。神秘的错误信息是因为由MyStreamSocket表示的Socket永远不会连接到任何东西。其socket成员引用的套接字是连接的套接字。因此,当你从MyStreamSocket获得输入流时,它确实没有连接。这会导致错误,这意味着客户端关闭。这导致套接字关闭,服务器正确地报告

使用BufferedReader会导致您的问题。它总是读取尽可能多的数据到缓冲区中,所以在文件传输开始时,它将读取“200”消息,然后发送文件的前几个Kb,它将被解析为字符数据。结果将是一堆错误。

我建议你现在摆脱BufferedReader并改用DataInputStream和DataOutputStream。您可以使用writeUTF和readUTF方法发送您的文本命令。要发送文件,我会建议一个简单的块编码。

这可能是最简单的,如果我给你的代码。

首先你的客户类。

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

public class EchoClient2 { 

    public static void main(String[] args) { 
     InputStreamReader is = new InputStreamReader(System.in); 
     BufferedReader br = new BufferedReader(is); 

     File file = new File("C:\\MyFile.txt"); 

     try { 
      System.out.println("Welcome to the Echo client.\n" 
        + "What is the name of the server host?"); 
      String hostName = br.readLine(); 
      if(hostName.length() == 0) // if user did not enter a name 
       hostName = "localhost"; // use the default host name 
      System.out.println("What is the port number of the server host?"); 
      String portNum = br.readLine(); 
      if(portNum.length() == 0) portNum = "7"; // default port number 
      MyStreamSocket socket = new MyStreamSocket(
        InetAddress.getByName(hostName), Integer.parseInt(portNum)); 
      boolean done = false; 
      String echo; 
      while(!done) { 

       System.out.println("Enter Code: 100 = Login, 200 = Upload, 400 = Logout: "); 
       String message = br.readLine(); 
       boolean messageOK = false; 

       if(message.equals("100")) { 
        messageOK = true; 
        System.out.println("Enter T-Number: (Use Uppercase 'T')"); 
        String login = br.readLine(); 
        if(login.charAt(0) == 'T') { 
         System.out.println("Login Worked fantastically"); 
        } else { 
         System.out.println("Login Failed"); 
        } 
        socket.sendMessage("100"); 
       } 

       if(message.equals("200")) { 
        messageOK = true; 
        socket.sendMessage("200"); 
        socket.sendFile(file); 
       } 
       if((message.trim()).equals("400")) { 
        messageOK = true; 
        System.out.println("Logged Out"); 
        done = true; 
        socket.sendMessage("400"); 
        socket.close(); 
        break; 
       } 

       if(! messageOK) { 
        System.out.println("Invalid input"); 
        continue; 
       } 

       // get reply from server 
       echo = socket.receiveMessage(); 
       System.out.println(echo); 
      } // end while 
     } // end try 
     catch (Exception ex) { 
      ex.printStackTrace(); 
     } // end catch 
    } // end main 
} // end class 

那么你的服务器类:

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

public class EchoServer2 { 
    static final String loginMessage = "Logged In"; 

    static final String logoutMessage = "Logged Out"; 


    public static void main(String[] args) { 
     int serverPort = 7; // default port 
     String message; 

     if(args.length == 1) serverPort = Integer.parseInt(args[0]); 
     try { 
      // instantiates a stream socket for accepting 
      // connections 
      ServerSocket myConnectionSocket = new ServerSocket(serverPort); 
      /**/System.out.println("Daytime server ready."); 
      while(true) { // forever loop 
       // wait to accept a connection 
       /**/System.out.println("Waiting for a connection."); 
       MyStreamSocket myDataSocket = new MyStreamSocket(
         myConnectionSocket.accept()); 
       /**/System.out.println("connection accepted"); 
       boolean done = false; 
       while(!done) { 
        message = myDataSocket.receiveMessage(); 

        /**/System.out.println("message received: " + message); 

        if((message.trim()).equals("400")) { 
         // Session over; close the data socket. 
         myDataSocket.sendMessage(logoutMessage); 
         myDataSocket.close(); 
         done = true; 
        } // end if 

        if((message.trim()).equals("100")) { 
         // Login 
         /**/myDataSocket.sendMessage(loginMessage); 
        } // end if 

        if((message.trim()).equals("200")) { 

         File outFile = new File("C:\\OutFileServer.txt"); 
         myDataSocket.receiveFile(outFile); 
         myDataSocket.sendMessage("File received "+outFile.length()+" bytes"); 
        } 

       } // end while !done 
      } // end while forever 
     } // end try 
     catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } // end main 
} // end class 

然后StreamSocket类:

public class MyStreamSocket { 
    private Socket socket; 

    private DataInputStream input; 

    private DataOutputStream output; 


    MyStreamSocket(InetAddress acceptorHost, int acceptorPort) 
      throws SocketException, IOException { 
     socket = new Socket(acceptorHost, acceptorPort); 
     setStreams(); 
    } 


    MyStreamSocket(Socket socket) throws IOException { 
     this.socket = socket; 
     setStreams(); 
    } 


    private void setStreams() throws IOException { 
     // get an input stream for reading from the data socket 
     input = new DataInputStream(socket.getInputStream()); 
     output = new DataOutputStream(socket.getOutputStream()); 
    } 


    public void sendMessage(String message) throws IOException { 
     output.writeUTF(message); 
     output.flush(); 
    } // end sendMessage 


    public String receiveMessage() throws IOException { 
     String message = input.readUTF(); 
     return message; 
    } // end receiveMessage 


    public void close() throws IOException { 
     socket.close(); 
    } 


    public void sendFile(File file) throws IOException { 
     FileInputStream fileIn = new FileInputStream(file); 
     byte[] buf = new byte[Short.MAX_VALUE]; 
     int bytesRead;   
     while((bytesRead = fileIn.read(buf)) != -1) { 
      output.writeShort(bytesRead); 
      output.write(buf,0,bytesRead); 
     } 
     output.writeShort(-1); 
     fileIn.close(); 
    } 



    public void receiveFile(File file) throws IOException { 
     FileOutputStream fileOut = new FileOutputStream(file); 
     byte[] buf = new byte[Short.MAX_VALUE]; 
     int bytesSent;   
     while((bytesSent = input.readShort()) != -1) { 
      input.readFully(buf,0,bytesSent); 
      fileOut.write(buf,0,bytesSent); 
     } 
     fileOut.close(); 
    }  
} // end class 

沟的 “助手” 类。它并没有帮助你。

相关问题