<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      3步學會Java Socket編程(3)

      [摘要]第三步 實現信息共享:在Socket上的實時交流  網絡的偉大之一也是信息共享,Server可以主動向所有Client廣播消息,同時Client也可以向其它Client發布消息。下面看看如何開發一個...
      第三步 實現信息共享:在Socket上的實時交流

        網絡的偉大之一也是信息共享,Server可以主動向所有Client廣播消息,同時Client也可以向其它Client發布消息。下面看看如何開發一個可以實時傳遞消息的程序。

        設計原理:

        服務器端接受客戶端的連接請求,同時啟動一個線程處理這個連接,線程不停的讀取客戶端輸入,然后把輸入加入隊列中,等候處理。在線程啟動的同時將線程加入隊列中,以便在需要的時候定位和取出。

       。创a}


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

      public class Server extends ServerSocket
      {
      private static ArrayList User_List = new ArrayList();
      private static ArrayList Threader = new ArrayList();
      private static LinkedList Message_Array = new LinkedList();
      private static int Thread_Counter = 0;
      private static boolean isClear = true;
      protected static final int SERVER_PORT = 10000;
      protected FileOutputStream LOG_FILE = new FileOutputStream("d:/connect.log", true);

      public Server() throws FileNotFoundException, IOException
      {
      super(SERVER_PORT);
      new Broadcast();

      //append connection log
      Calendar now = Calendar.getInstance();
      String str = "[" + now.getTime().toString() + "] Accepted a connection\015\012";
      byte[] tmp = str.getBytes();
      LOG_FILE.write(tmp);

      try
      {
      while (true)
      {
      Socket socket = accept();
      new CreateServerThread(socket);
      }
      }
      finally
      {
      close();
      }
      }

      public static void main(String[] args) throws IOException
      {
      new Server();
      }

      //--- Broadcast
      class Broadcast extends Thread
      {
      public Broadcast()
      {
      start();
      }

      public void run()
      {
      while (true)
      {
      if (!isClear)
      {
      String tmp = (String)Message_Array.getFirst();

      for (int i = 0; i < Threader.size(); i++)
      {
      CreateServerThread client = (CreateServerThread)Threader.get(i);
      client.sendMessage(tmp);
      }

      Message_Array.removeFirst();
      isClear = Message_Array.size() > 0 ? false : true;
      }
      }
      }
      }

      //--- CreateServerThread
      class CreateServerThread extends Thread
      {
      private Socket client;
      private BufferedReader in;
      private PrintWriter out;
      private String Username;

      public CreateServerThread(Socket s) throws IOException
      {
      client = s;
      in = new BufferedReader(new InputStreamReader(client.getInputStream()));
      out = new PrintWriter(client.getOutputStream(), true);
      out.println("--- Welcome to this chatroom ---");
      out.println("Input your nickname:");
      start();
      }

      public void sendMessage(String msg)
      {
      out.println(msg);
      }

      public void run()
      {
      try
      {
      int flag = 0;
      Thread_Counter++;
      String line = in.readLine();

      while (!line.equals("bye"))
      {
      if (line.equals("l"))
      {
      out.println(listOnlineUsers());
      line = in.readLine();
      continue;
      }

      if (flag++ == 0)
      {
      Username = line;
      User_List.add(Username);
      out.println(listOnlineUsers());
      Threader.add(this);
      pushMessage("[< " + Username + " come on in >]");
      }
      else
      {
      pushMessage("<" + Username + ">" + line);
      }

      line = in.readLine();
      }

      out.println("--- See you, bye! ---");
      client.close();
      }
      catch (IOException e)
      {}
      finally
      {
      try
      {
      client.close();
      }
      catch (IOException e)
      {}

      Thread_Counter--;
      Threader.remove(this);
      User_List.remove(Username);
      pushMessage("[< " + Username + " left>]");
      }
      }


      private String listOnlineUsers()
      {
      String s ="-+- Online list -+-\015\012";

      for (int i = 0; i < User_List.size(); i++)
      {
      s += "[" + User_List.get(i) + "]\015\012";
      }

      s += "-+---------------------+-";
      return s;
      }

      private void pushMessage(String msg)
      {
      Message_Array.addLast(msg);
      isClear = false;
      }
      }
      }



        這就是程序運行后,多用戶登陸并且輸入信息后的屏幕。實現了信息的實時廣播。用戶輸入"l"就可以列出在線人員表。



      日韩精品一区二区三区高清