2016-04-28 43 views
0

我不能使用扫描仪或printwriters如何发送双从客户端到服务器和使用I/O回到客户端

我有一个客户端和一台服务器。

我运行服务器和输出,

Creating Server Socket 5095 . . . 
SUCCESS!!! 
in while loop 
Waiting for connection. 

然后我运行在客户端和输出,

Creating Client Socket 
SUCCESS!!! 
initializing variables 
variables flushed 
initializing input 
java.io.EOFException 
at java.io.DataInputStream.readFully(Unknown Source) 
at java.io.DataInputStream.readLong(Unknown Source) 
at java.io.DataInputStream.readDouble(Unknown Source) 
at Client.runClient(Client.java:38) 
at Client.main(Client.java:51) 

我想初始化客户端的一些双打,并发送他们到服务器,在那里他们将被解析和操纵,并将结果发送回客户端。

客户端无法与EOFException和服务器失败,并ClassCastException

我到底做错了什么?

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

public class Client { 

static void pStr(String p) { 
    System.out.println(p); 
} 

static void runClient() { 

    Socket client; 
    DataOutputStream output; 
    DataInputStream input; 

    try { 
     pStr("Creating Client Socket "); 
     client = new Socket("127.0.0.1", 5095); 
     pStr("SUCCESS!!!"); 

     input = new DataInputStream(client.getInputStream()); 
     output = new DataOutputStream(client.getOutputStream()); 

     System.out.println("initializing variables"); 
     double arg1 = 5; 
     output.writeDouble(arg1); 
     output.flush(); 

     double arg2 = 3; 
     output.writeDouble(arg2); 
     output.flush(); 

     System.out.println("variables flushed"); 

     System.out.println("initializing input"); 
     // error occurs at next line 
     double ans = input.readDouble(); 
     System.out.println("input has been read"); 
     System.out.println(ans); 

     input.close(); 
     output.close(); 
     client.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
// this is second class file 
public static void main(String args[]) { 
    Client.runClient(); 
} 
} 
public class SimpleServer { 

static void pStr(String p) { 
    System.out.println(p); 
} 

static void runServer() { 
    ServerSocket server; 

    try { 
     // Create a ServerSocket. 
     pStr("Creating Server Socket " + 5095 + " . . . "); 
     server = new ServerSocket(5095); 
     pStr("SUCCESS!!!"); 

     while (true) { 
      System.out.println("in while loop"); 
      Socket connection; 
      DataOutputStream output = null; 
      DataInputStream input = null; 

      pStr("Waiting for connection."); 
      connection = server.accept(); 
      pStr("Done"); 

      System.out.println("entering try"); 

      try { 
       // Get input and output streams. 
       input = (DataInputStream) connection.getInputStream(); 
       output = (DataOutputStream) connection.getOutputStream(); 

       String ansStr; 

       double arg1, arg2; 
       try { 
        System.out.println("int try block"); 
        arg1 = input.readDouble(); 
        arg2 = input.readDouble(); 

        ansStr = "" + arg1 + "," + arg2; 
        System.out.println(ansStr); 

        output.writeDouble(arg1); 
        output.writeDouble(arg2); 

       } catch (Exception e) { 
        ansStr = e.getMessage(); 
       } 
       output.flush(); 
      } catch (Exception e) { 
       pStr("Error in Protocol: " + e.getMessage()); 
      } finally { 
       try { 
        input.close(); 
       } catch (Exception e) { 
       } 
       try { 
        output.close(); 
       } catch (Exception e) { 
       } 
       try { 
        connection.close(); 
       } catch (Exception e) { 
       } 
      } 
     } 
    } catch (Exception e) { 
     pStr("Error making ServerSocket"); 
    } 
} 

public static void main(String args[]) { 
    runServer(); 
} 
} 
+2

你得到什么错误? – Pablo

+0

我认为客户端在尝试将double写入outputStream时崩溃。 – rickyjoepr

+3

“崩溃”是一个非常模糊的术语,必须引发错误。 – Deximus

回答

1

您的服务器代码与ClassCastException您已莫名其妙没有提到崩溃。因此连接在没有发送任何数据的情况下关闭,因此是客户端异常。

仅通过强制转换就无法从套接字获取DataInputStreamDataOutputStream。您必须使用您在客户端中使用的相同流程。

+0

我修改了初始文章以包含解决方案 – rickyjoepr

+3

@rickyjoepr您应该**不**这样做。它使你的问题变得毫无意义。我把它翻了回来。您应该修改它以显示*真正的问题,即您从服务器输出中省略的'ClassCastException'。 – EJP

相关问题