2012-10-28 95 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或其他东西输入回车时结束。简单的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(); }'。它将永远循环调用doServerStuff(),直到shouldExit变为true。阅读下面的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