<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    基于TCP的多人聊天小程序

    Posted on 2007-05-24 20:31 久城 閱讀(4007) 評論(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 © 久城

    主站蜘蛛池模板: www.xxxx.com日本免费| 理论片在线观看免费| 日韩午夜免费视频| 久久WWW色情成人免费观看| 亚洲综合在线一区二区三区| 亚洲AV无码成H人在线观看| 亚洲一区二区三区高清在线观看 | 亚洲一级特黄无码片| 免费A级毛片无码视频| 亚洲av乱码中文一区二区三区| 免费精品国偷自产在线在线| 亚洲综合网美国十次| 亚洲色大成网站www| 免费精品国产自产拍在线观看图片| 亚洲AV本道一区二区三区四区| 67194成是人免费无码| 狠狠躁狠狠爱免费视频无码| 国产精品免费视频一区| 亚洲欧美国产日韩av野草社区| 亚洲男人的天堂在线va拉文| 中文字幕影片免费在线观看| 国产精品玖玖美女张开腿让男人桶爽免费看| 亚洲美女视频网站| 在线亚洲精品自拍| 久久久精品2019免费观看| 亚洲欧洲精品在线| 亚洲午夜精品第一区二区8050| 黄色成人免费网站| 久久久久久久99精品免费观看| 亚洲综合激情五月色一区| 国产V亚洲V天堂无码| 波多野结衣一区二区免费视频| 精品久久8x国产免费观看| 国产成人亚洲精品| 久久精品夜色国产亚洲av| 日本不卡高清中文字幕免费| 啦啦啦完整版免费视频在线观看| gogo免费在线观看| 污视频网站免费观看| 亚洲人成电影网站色| 亚洲午夜成激人情在线影院 |