基于TCP的多人聊天小程序

          Posted on 2007-05-24 20:31 久城 閱讀(4016) 評論(8)  編輯  收藏 所屬分類: JavaTest

          要回家了,心就散了,畢業論文也做不下去了。閑著弄了弄Socket。同時遇到了一些問題。

          服務端ChatServer.java

          package com.neusoft.socket.chat;

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

          public class ChatServer {
              
          // 存儲不同客戶端的線程
              public static Hashtable peopleList;

              
          public static void main(String args[]) {
                  ServerSocket server 
          = null;
                  Socket socket 
          = null;

                  peopleList 
          = new Hashtable();
                  
          while (true{
                      
          try {
                          
          // 建立服務端
                          server = new ServerSocket(8099);
                      }
           catch (IOException e) {
                      }

                      
          try {
                          
          // 開始監聽
                          socket = server.accept();
                          InetAddress address 
          = socket.getInetAddress();
                          System.out.println(
          "IP:" + address + " come in.");

                      }
           catch (IOException e) {
                      }

                      
          if (socket != null{
                          
          // 開啟一條線程通訊
                          new Server_thread(socket).start();
                      }
           else {
                          
          continue;
                      }

                  }

              }

          }


          服務端線程Server_thread.java
          package com.neusoft.socket.chat;

          import java.io.IOException;
          import java.io.ObjectInputStream;
          import java.io.ObjectOutputStream;
          import java.net.Socket;
          import java.util.Enumeration;
          import java.util.Hashtable;

          public class Server_thread extends Thread {
              
          // 客戶端機器名
              String name = null;

              String keyName 
          = null;

              String message 
          = null;

              Socket socket 
          = null;

              ObjectOutputStream out 
          = null;

              ObjectInputStream in 
          = null;

              Hashtable peopleList 
          = null;

              
          public Server_thread(Socket t) {
                  socket 
          = t;
                  
          try {
                      
          // 取得輸入輸出流對象
                      in = new ObjectInputStream(socket.getInputStream());
                      out 
          = new ObjectOutputStream(socket.getOutputStream());
                  }
           catch (IOException e) {
                  }

              }


              
          public void run() {

                  
          while (true{

                      
          try {
                          
          // 讀取客戶端消息
                          message = (String) in.readObject();
                          
          // 把客戶端線程存儲到HASHTABLE
                          name = socket.getInetAddress().toString();
                          
          if (!ChatServer.peopleList.containsKey(name)) {
                              ChatServer.peopleList.put(name, 
          this);
                          }


                          
          // 遍歷HASHTABLE,把消息發送到每一個客戶端,實現多人聊天
                          Enumeration enum1 = ChatServer.peopleList.keys();
                          
          while (enum1.hasMoreElements()) {
                              keyName 
          = (String) enum1.nextElement();
                              ((Server_thread) ChatServer.peopleList.get(keyName)).out
                                      .writeObject(keyName 
          + "says:" + message);
                          }

                      }
           catch (ClassNotFoundException e) {
                          e.printStackTrace();
                      }
           catch (IOException ee) {
                          ee.printStackTrace();
                      }

                  }

              }

          }

          客戶端:Client.java
          package com.neusoft.socket.chat;

          import java.awt.*;
          import java.awt.event.*;
          import java.io.*;
          import java.net.*;
          import javax.swing.*;

          public class Client extends JFrame {
              
          private Container container;

              
          private JTextField enterField;

              
          private JTextArea displayArea;

              
          private ObjectOutputStream output;

              
          private ObjectInputStream input;

              
          private String message = "";

              
          private String chatServer;

              
          private Socket client;

              
          public Client(String host) {
                  
          //初始化聊天窗口
                  super("my Client");
                  chatServer 
          = host;
                  container 
          = getContentPane();
                  enterField 
          = new JTextField();
                  enterField.setEnabled(
          false);
                  enterField.addActionListener(
          new ActionListener() {
                      
          public void actionPerformed(ActionEvent event) {
                          sendData(event.getActionCommand());
                      }

                  }
          );
                  container.add(enterField, BorderLayout.SOUTH);
                  displayArea 
          = new JTextArea();
                  container.add(
          new JScrollPane(displayArea), BorderLayout.CENTER);
                  setSize(
          500300);
                  setLocation(
          200300);
                  setVisible(
          true);
              }


              
          // 執行客戶端
              public void runClient() {
                  
          try {
                      connectToServer();
                      getStreams();
                      processConnection();
                      closeConnection();
                  }
           catch (EOFException eofException) {
                      System.out.println(
          "Server terminated connection");
                  }
           catch (IOException e) {
                      e.printStackTrace();
                  }

              }


              
          // 連接服務端
              private void connectToServer() throws IOException {
                  displayArea.setText(
          "Attempting connection\n");
                  client 
          = new Socket(InetAddress.getByName(chatServer), 8099);
                  displayArea.append(
          "Connection to: "
                          
          + client.getInetAddress().getHostName());
              }


              
          // 取得數據流
              private void getStreams() throws IOException {
                  output 
          = new ObjectOutputStream(client.getOutputStream());
                  output.flush();
                  input 
          = new ObjectInputStream(client.getInputStream());
                  displayArea.append(
          "\nGot I/O streams\n");
              }


              
          // 執行通信
              private void processConnection() throws IOException {
                  enterField.setEnabled(
          true);
                  
          do {

                      
          try {
                          message 
          = (String) input.readObject();
                          displayArea.append(
          "\n" + message);
                          displayArea.setCaretPosition(displayArea.getText().length());
                      }
           catch (ClassNotFoundException e) {
                          e.printStackTrace();
                      }


                  }
           while (!message.equals("SERVER>>> TERMINATE"));
              }


              
          // 關閉連接
              private void closeConnection() throws IOException {
                  displayArea.append(
          "\nClosing connection");
                  output.close();
                  input.close();
                  client.close();
              }


              
          // 發送消息
              private void sendData(String message) {
                  
          try {
                      output.writeObject(
          "child>>> " + message);
                      output.flush();
                      enterField.setText(
          "");
                  }
           catch (IOException e) {
                      displayArea.append(
          "\nError writing object");
                  }

              }


              
          public static void main(String args[]) {
                  Client c 
          = new Client("192.168.34.179");
                  c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                  c.runClient();
              }

          }

          這樣可以簡單的實現局域網內通信。

          但是形式還太簡單。和朋友間用的話,朋友還得運行JAVA文件才可以。想作成可執行的文件。在網上查了查,好像有工具可以直接實現。可惜在公司,下不了那些軟件。

          所以想用別的方法。最先,我想把它嵌入到WEB中,結合javascript,jsp做了大半天。其中java,javacript,jsp之間的相互通信實在是讓我頭疼。越弄越復雜。后來,想寫成Applet,后悔當初沒有認真聽Applet,弄了半天始終沒有達到理想的效果。

          先把代碼貼下,回家繼續改。

          歡迎來訪!^.^!
          本BLOG僅用于個人學習交流!
          目的在于記錄個人成長.
          所有文字均屬于個人理解.
          如有錯誤,望多多指教!不勝感激!

          Feedback

          # re: 基于TCP的多人聊天小程序  回復  更多評論   

          2007-05-25 09:27 by kk
          用applet似乎也不通用。。。
          applet在客戶端中不能直接開socket,會有權限問題。。。

          # re: 基于TCP的多人聊天小程序  回復  更多評論   

          2007-05-25 09:39 by 久城
          原來如此。我昨天用Applet嘗試了半天,始終連接不上服務端。一直不知道是哪里出錯了。呵呵。

          # re: 基于TCP的多人聊天小程序  回復  更多評論   

          2007-05-25 10:32 by L
          你是學生?這種程序能支持幾個用戶呢。。多看看SEDA一類的框架吧。

          # re: 基于TCP的多人聊天小程序  回復  更多評論   

          2007-05-25 13:08 by 久城
          @L
          :)工作的人和沒工作的人考慮的事情就是不一樣啊!我只考慮了實現通信,卻沒有想過程序的性能如何。好多想法還太單純。
          ..恩,要看的東西還有好多。謝謝指點。

          # re: 基于TCP的多人聊天小程序  回復  更多評論   

          2007-05-25 17:46 by pass86
          應該是EASY的DEMO.

          # re: 基于TCP的多人聊天小程序[未登錄]  回復  更多評論   

          2007-06-25 09:59 by 笨笨

          我不喜歡JAVA 但老師要考試。沒辦法

          # re: 基于TCP的多人聊天小程序[未登錄]  回復  更多評論   

          2007-06-25 10:00 by 笨笨

          這個能用不?
          先拷一下,
          順便說聲:“謝謝”
          哈哈

          # re: 基于TCP的多人聊天小程序  回復  更多評論   

          2007-11-26 12:01 by learner
          同樓上 復制了一份 道謝!

          Copyright © 久城

          主站蜘蛛池模板: 南京市| 甘谷县| 香港 | 嘉义县| 项城市| 木兰县| 白银市| 扶绥县| 奎屯市| 平舆县| 项城市| 全州县| 大渡口区| 昭苏县| 祥云县| 民丰县| 清水河县| 达拉特旗| 潞城市| 东丽区| 云林县| 鹤庆县| 乳山市| 桐城市| 富川| 于都县| 涟水县| 桦南县| 万荣县| 合江县| 高淳县| 五华县| 曲阳县| 庆城县| 保定市| 平度市| 邻水| 霍城县| 华池县| 巴楚县| 竹北市|