2014-03-06 241 views
0

我需要帮助。我正在制作一个样本队列系统。 当我尝试写入数据并将其存储到服务器时,服务器返回一个异常。 我也是一个插座新手,所以我会感谢任何人谁将回答我的问题的任何帮助。将客户端写入服务器Java

这里是我的代码为学生:

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

public class Student { 
    public static void main(String args[]) { 
     Scanner sc = new Scanner (System.in); 
    try { 
    Socket skt = new Socket("localhost", 1234); 
    PrintWriter out = new PrintWriter(skt.getOutputStream(), true); 

    System.out.println("Hello!"); 

    System.out.print("Please enter name: "); 
    String name = sc.next(); 
    System.out.print("Please enter ID Number: "); 
    String id = sc.next(); 
    String student = name +" - "+ id; 
    out.print(student); 

     } catch(Exception e) { 
      System.out.println("Whoops! It didn't work."); 
     } 
    } 
} 

和服务器:

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

public class Server { 
    public static void main(String args[]) { 
     Scanner sc = new Scanner (System.in); 
     ArrayList<String> collector = new ArrayList<String>(); 

    try { 
    ServerSocket srvr = new ServerSocket(1234); 
    Socket skt = srvr.accept(); 
    BufferedReader in = new BufferedReader(new InputStreamReader(skt.getInputStream())); 

    System.out.print(in.readLine()); 
    String x = in.readLine(); 
    collector.add(x); 


     } 
     catch(Exception e) { 
     System.out.print("Whoops! It didn't work!\n"); 
     } 
    } 
} 
+0

您收到的例外是什么? –

+0

发送时需要添加“\ n”,因为您在服务器上执行readLine操作,并且readLine会在字符串末尾等待“\ n”。 –

+0

实际上,问题在于客户端连接没有正确关闭,所以他在服务器上得到连接重置异常。 – Sirs

回答

0

您需要在catch块打印出比 “哎呦”。你会得到什么例外?这将帮助您了解发生了什么问题。

+0

不能确定hehe 我刚刚得知,如果发生错误,然后whoops ...将打印。 – Shaun

1

您需要在完成执行前添加一个“out.close()”语句来正确关闭PrintWriter。由于你这样做,客户端套接字突然关闭,你会在服务器端发生异常。

理想情况下,close()应该在finally块内执行,以确保它被执行。另外,正如在另一个答案中指出的那样,你应该只读一次,将其存储在一个变量中,然后根据该值做任何你需要的。

例子:

public class Server { 
    public static void main(String args[]) { 
     Scanner sc = new Scanner(System.in); 
     ArrayList<String> collector = new ArrayList<String>(); 

     try { 
      ServerSocket srvr = new ServerSocket(1234); 
      Socket skt = srvr.accept(); 
      BufferedReader in = new BufferedReader(new InputStreamReader(skt.getInputStream())); 

      final String studentInfo = in.readLine(); 
      System.out.print(studentInfo); 
      collector.add(studentInfo); 

     } catch (Exception e) { 
      e.printStackTrace(); 
      System.out.println("Whoops! It didn't work!"); 
     } 
    } 
} 

学生:

public class Student { 
    public static void main(String args[]) { 
     Scanner sc = new Scanner(System.in); 
     PrintWriter out = null; 
     try { 
      Socket skt = new Socket("localhost", 1234); 
      out = new PrintWriter(skt.getOutputStream(), true); 

      System.out.println("Hello!"); 

      System.out.print("Please enter name: "); 
      String name = sc.next(); 
      System.out.print("Please enter ID Number: "); 
      String id = sc.next(); 
      String student = name + " - " + id; 
      out.print(student); 
     } catch (Exception e) { 
      System.out.println("Whoops! It didn't work."); 
     } finally { 
      if (out != null) { 
       try { 
        out.close(); 
       } catch (Exception e) { 

       } 
      } 
     } 
    } 
} 
+0

感谢您的支持!我有另一个问题。 我想为我的队列系统提供一个永远在线的服务器。我将如何做到这一点? – Shaun

+0

您可以使用包含accept后面的代码的循环,也可以创建单个线程来处理请求。网上有很多教程,例如:http://tutorials.jenkov.com/java-multithreaded-servers/multithreaded-server.html – Sirs

+0

如果你有另一个问题在stackoverflow中打开一个新的问题。在原始问题已被回答(并且已有答案)后,不接受并不酷。 – Sirs

0

您正在阅读的两倍,但只发送一次。关于异常的原因,我认为这是因为客户端没有关闭连接而终止。将套接字关闭语句添加到客户端的代码中,异常将消失。您要将null添加到收藏夹中虽然