2014-03-06 2 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."); 
     } 
    } 
} 

및 서버에 대해 : 당신은 catch 블록에서 "으악"보다 자세한 내용을 인쇄해야

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

서버에서 readLine을 수행하고 readLine이 문자열 끝에 "\ n"이 오기를 기다리기 때문에 "\ n"을 추가해야합니다. –

+0

사실, 문제는 클라이언트 연결이 제대로 닫히지 않아서 서버에서 연결 재설정 예외가 발생한다는 것입니다. – Sirs

답변

0

. 무슨 예외가 있니? 이것은 무엇이 잘못되었는지를 이해하는 데 도움이 될 것입니다.

+0

hehe을 확인할 수 없습니다 오류가 발생하면 whoops가 인쇄됩니다. – Shaun

1

실행이 완료되기 전에 "out.close()"문을 추가하여 PrintWriter를 올바르게 닫아야합니다. 그렇게하지 않으면 클라이언트 소켓이 갑자기 닫히고 서버 측에서 예외가 발생합니다.

finally 블록 내부에서이 close()를 수행하는 것이 이상적입니다. 또한 다른 대답에서 지적한 바와 같이, 한 번만 읽으면 변수에 저장 한 다음 필요한 값으로 값을 수행해야합니다.

예 :

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

당신은 두 번 읽고,하지만 한 번만 보낼 수 있습니다. 예외의 원인과 관련하여 클라이언트가 연결을 끊지 않고 종료되기 때문에 발생한다고 생각합니다. 클라이언트의 코드에 socket close 문을 추가하면 예외가 사라집니다. 수집기에 null을 추가 할 예정입니다.

관련 문제