<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 久城 閱讀(4009) 評論(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
    :)工作的人和沒工作的人考慮的事情就是不一樣啊!我只考慮了實現通信,卻沒有想過程序的性能如何。好多想法還太單純。
    ..恩,要看的東西還有好多。謝謝指點。
    應該是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 © 久城

    主站蜘蛛池模板: 日本系列1页亚洲系列| 亚洲视频在线观看免费| 国产aⅴ无码专区亚洲av| 99re在线视频免费观看| 亚洲成AV人片在WWW| 亚洲av之男人的天堂网站| 一二三四在线观看免费高清中文在线观看 | 亚洲日韩一区二区三区| 中文字幕不卡亚洲| 无人影院手机版在线观看免费| 一级中文字幕免费乱码专区 | 亚洲av中文无码乱人伦在线咪咕| 日韩欧美一区二区三区免费观看| 人体大胆做受免费视频| 亚洲成a人片7777| 国产偷国产偷亚洲清高动态图| 国产一卡二卡3卡四卡免费| 精品熟女少妇aⅴ免费久久| 亚洲人成网站色在线观看| 亚洲精品无码成人AAA片| 成人毛片18女人毛片免费视频未| 成人精品一区二区三区不卡免费看| 亚洲一线产区二线产区区| 亚洲成色WWW久久网站| 免费在线观看理论片| av大片在线无码免费| 最近免费中文字幕MV在线视频3 | 免费无码专区毛片高潮喷水| 亚洲国产综合自在线另类| 亚洲精品无码永久中文字幕| 免费看片免费播放| 成人免费观看一区二区| 久别的草原电视剧免费观看| 黄色一级免费网站| 亚洲精品国产综合久久久久紧| 综合自拍亚洲综合图不卡区| 亚洲日韩精品射精日| 亚洲人成影院在线无码观看| 亚洲综合区图片小说区| 久久久久无码专区亚洲av| 免费人成视网站在线观看不卡|