2012-10-28 2 views
0
/*main method*/ 

Server server = new Server(tcpPort); 
new Thread(server).start(); 

try { 

    Thread.sleep(1000*60); /* 60 seconds*/ 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 

server.stop; 
... 

이것은 작성한 코드입니다. 서버 스레드가 시작되고 60 초 동안 실행됩니다. 사용자가 BufferedReader 또는 뭔가를 통해 Enter를 입력하면 끝나는 무한히 실행되도록 어떻게 변경합니까?간단한 Java 스레드 TCP 서버 스레드

나는

while(!input.equals("")) { /* just pseudocoded here...*/ 
Thread.sleep(10); 
} 

그것을 시도했지만 한 제대로 작동에서이 것 내 서버 중지합니다. 내 고객은 더 이상 연결하지 않습니다. 내가 실수를 저 지르거나 해결하기 쉬운 문제입니까?

+2

실제 코드를 게시하십시오. –

답변

0

이 SO 스레드로 시작 : How to create a basic Java Server?. 아주 간단한 서버 작성 방법을 예제로 보여줄 것입니다.

중요한 점은 serverSocket.accept()입니다. 차단됩니다 - 다른 말로하면 클라이언트가 연결되기를 영원히 기다릴 것입니다. 그렇지 않으면 오류가 발생할 경우 실패합니다. 클라이언트가 연결되면 클라이언트가 작성한 내용을 읽고 사용할 수있는 clientSocket을 얻게됩니다.

Java 네트워크 프로그래밍을 이해하기에 좋은 출발점입니다. 그러나이 주제에 대해 더 자세히 읽어 보시기 바랍니다. 다음과 같이 입력하십시오 : http://beej.us/guide/bgnet/

+0

그래,하지만 작동하는 서버가있다. 내 클래스 서버가 완벽하게 작동합니다. 너희들이 읽었던거야, 내 문제는 뭐니? 내 서버는 실행 중이지만 60 초 동안 만 실행됩니다. (Thread.sleep 라인을 참고하십시오.) 그러나 System.in에서 입력을 받으면 서버를 종료하고 영원히 실행하려고합니다. – user1781173

+0

나는 읽었다. 어쩌면 나는 단지'Thread.sleep (60000)'대신'shouldExit = false; while (shouldExit) {doServerStuff(); }'. shouldExit가 true가 될 때까지 doServerStuff()를 영원히 반복합니다. 아래의 Kumar 예제를 읽으십시오 - 클라이언트 연결을 기다리는 무한 루프에서 별도의 스레드에서 처리합니다. 그러나 원하는대로 서버를 중지하지는 않습니다. 자신이 스스로 할 수 있어야합니다. – DejanLekic

2

- 나에게 작성된이 기본 채팅 서버를 사용해보십시오. 이 서버는 단순히 루프를 계속 실행하고 클라이언트가이 서버와 관련된 다른 모든 클라이언트로 보내는 메시지를 브로드 캐스트합니다.

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.ArrayList; 

public class Server { 

    // ///----------------------------------------Instance Variable Fields 
    ServerSocket ss = null; 
    Socket incoming = null; 

    // ///----------------------------------------Instance Variable Fields 

    // ///---------------------------------------- static Variable Fields 
    public static ArrayList<Socket> socList = new ArrayList<Socket>(); 

    // ///---------------------------------------- static Variable Fields 

    public void go() { 

     try { 

      ss = new ServerSocket(25005); 

      while (true) { 

       incoming = ss.accept(); 
       socList.add(incoming); 
       System.out.println("Incoming: " + incoming); 
       new Thread(new ClientHandleKaro(incoming)).start(); 

      } 

     } catch (IOException e) { 

      e.printStackTrace(); 
     } finally { 

      try { 
       ss.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

    } 

    class ClientHandleKaro implements Runnable { 

     InputStream is = null; 
     OutputStream os = null; 
     InputStreamReader isr = null; 
     BufferedReader br = null; 
     PrintWriter pw = null; 
     boolean isDone = false; 

     Socket sInThread = null; 

     public ClientHandleKaro(Socket sxxx) { 

      this.sInThread = sxxx; 

     } 

     @Override 
     public void run() { 

      if (sInThread.isConnected()) { 

       System.out.println("Welcamu Clienta"); 
       System.out.println(socList); 
      } 

      try { 
       is = sInThread.getInputStream(); 
       System.out.println("IS: " + is); 
       isr = new InputStreamReader(is); 
       br = new BufferedReader(isr); 

       os = sInThread.getOutputStream(); 
       pw = new PrintWriter(os, true); 

       String s = new String(); 

       while ((!isDone) && (s = br.readLine()) != null) { 

        String[] asx = s.split("-"); 
        System.out.println("On Console: " + s); 

        // pw.println(s); 

        Thread tx = new Thread(new ReplyKaroToClient(s, 
          this.sInThread)); 
        tx.start(); 

        if (asx[1].trim().equalsIgnoreCase("BYE")) { 

         System.out.println("I am inside Bye"); 
         isDone = true; 

        } 
       } 
      } catch (IOException e) { 

       System.out.println("Thanks for Chatting....."); 
      } finally { 

       try { 
        Thread tiku = new Thread(new ByeByeKarDo(sInThread)); 
        tiku.start(); 
        try { 
         tiku.join(); 
        } catch (InterruptedException e) { 

         e.printStackTrace(); 
        } 

        System.out.println("Accha to hum Chalte hain !!!"); 
        System.out.println(socList); 

        br.close(); 
        pw.close(); 
        sInThread.close(); 

       } catch (IOException e) { 

       } 
      } 

     } 

    } 

    class ReplyKaroToClient implements Runnable { 

     public String mString; 
     public Socket mSocket; 

     public ReplyKaroToClient(String s, Socket sIn) { 

      this.mString = s; 
      this.mSocket = sIn; 
     } 

     @Override 
     public void run() { 

      for (Socket sRaW : socList) { 

       if (mSocket.equals(sRaW)) { 
        System.out.println("Mai same hun"); 
        continue; 

       } else { 
        try { 
         new PrintWriter(sRaW.getOutputStream(), true) 
           .println(mString); 
        } catch (IOException e) { 

         System.out.println("Its in Catch"); 

        } 
       } 
      } 

     } 

    } 

    class ByeByeKarDo implements Runnable { 

     Socket inCom; 

     public ByeByeKarDo(Socket si) { 

      this.inCom = si; 
     } 

     @Override 
     public void run() { 

      try { 
       new PrintWriter(inCom.getOutputStream(), true) 
         .println("You have Logged Out of Server... Thanks for ur Visit"); 
      } catch (IOException e) { 

       e.printStackTrace(); 
      } 

     } 

    } 

    public static void main(String[] args) { 

     new Server().go(); 
    } 
} 
+0

고마워,하지만 나는 실행중인 서버가있다. 아래 게시물에 대한 의견을 보거나 내 주제를 더 자세히 읽으십시오. 그것은 서버 자체에 관한 것이 아닙니다. – user1781173