<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) 評(píng)論(8)  編輯  收藏 所屬分類: JavaTest

    要回家了,心就散了,畢業(yè)論文也做不下去了。閑著弄了弄Socket。同時(shí)遇到了一些問(wèn)題。

    服務(wù)端ChatServer.java

    package com.neusoft.socket.chat;

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

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

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

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

                
    try {
                    
    // 開(kāi)始監(jiān)聽(tīng)
                    socket = server.accept();
                    InetAddress address 
    = socket.getInetAddress();
                    System.out.println(
    "IP:" + address + " come in.");

                }
     catch (IOException e) {
                }

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

            }

        }

    }


    服務(wù)端線程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 {
        
    // 客戶端機(jī)器名
        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 {
                
    // 取得輸入輸出流對(duì)象
                in = new ObjectInputStream(socket.getInputStream());
                out 
    = new ObjectOutputStream(socket.getOutputStream());
            }
     catch (IOException e) {
            }

        }


        
    public void run() {

            
    while (true{

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


                    
    // 遍歷HASHTABLE,把消息發(fā)送到每一個(gè)客戶端,實(shí)現(xiàn)多人聊天
                    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);
        }


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

        }


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


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


        
    // 執(zhí)行通信
        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"));
        }


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


        
    // 發(fā)送消息
        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();
        }

    }

    這樣可以簡(jiǎn)單的實(shí)現(xiàn)局域網(wǎng)內(nèi)通信。

    但是形式還太簡(jiǎn)單。和朋友間用的話,朋友還得運(yùn)行JAVA文件才可以。想作成可執(zhí)行的文件。在網(wǎng)上查了查,好像有工具可以直接實(shí)現(xiàn)。可惜在公司,下不了那些軟件。

    所以想用別的方法。最先,我想把它嵌入到WEB中,結(jié)合javascript,jsp做了大半天。其中java,javacript,jsp之間的相互通信實(shí)在是讓我頭疼。越弄越復(fù)雜。后來(lái),想寫成Applet,后悔當(dāng)初沒(méi)有認(rèn)真聽(tīng)Applet,弄了半天始終沒(méi)有達(dá)到理想的效果。

    先把代碼貼下,回家繼續(xù)改。

    歡迎來(lái)訪!^.^!
    本BLOG僅用于個(gè)人學(xué)習(xí)交流!
    目的在于記錄個(gè)人成長(zhǎng).
    所有文字均屬于個(gè)人理解.
    如有錯(cuò)誤,望多多指教!不勝感激!

    Feedback

    # re: 基于TCP的多人聊天小程序  回復(fù)  更多評(píng)論   

    2007-05-25 09:27 by kk
    用applet似乎也不通用。。。
    applet在客戶端中不能直接開(kāi)socket,會(huì)有權(quán)限問(wèn)題。。。

    # re: 基于TCP的多人聊天小程序  回復(fù)  更多評(píng)論   

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

    # re: 基于TCP的多人聊天小程序  回復(fù)  更多評(píng)論   

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

    # re: 基于TCP的多人聊天小程序  回復(fù)  更多評(píng)論   

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

    # re: 基于TCP的多人聊天小程序  回復(fù)  更多評(píng)論   

    2007-05-25 17:46 by pass86
    應(yīng)該是EASY的DEMO.

    # re: 基于TCP的多人聊天小程序[未登錄](méi)  回復(fù)  更多評(píng)論   

    2007-06-25 09:59 by 笨笨

    我不喜歡JAVA 但老師要考試。沒(méi)辦法

    # re: 基于TCP的多人聊天小程序[未登錄](méi)  回復(fù)  更多評(píng)論   

    2007-06-25 10:00 by 笨笨

    這個(gè)能用不?
    先拷一下,
    順便說(shuō)聲:“謝謝”
    哈哈

    # re: 基于TCP的多人聊天小程序  回復(fù)  更多評(píng)論   

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

    Copyright © 久城

    主站蜘蛛池模板: 学生妹亚洲一区二区| 亚洲高清不卡视频| 国产免费av片在线看| 最近的2019免费中文字幕| 亚洲sm另类一区二区三区| 亚洲精品无码久久久久久久| 久久精品国产亚洲7777| 日本免费人成视频播放| 中文字幕人成无码免费视频 | 最近中文字幕无免费视频| 黄页免费在线观看| 国产精品黄页免费高清在线观看| 亚洲精品9999久久久久无码| 亚洲国产精品久久人人爱| 亚洲国产美国国产综合一区二区| 亚洲精品成人片在线观看| 午夜国产羞羞视频免费网站| 毛片高清视频在线看免费观看| 222www免费视频| 亚洲精品卡2卡3卡4卡5卡区| 亚洲中文久久精品无码ww16| 在线免费观看一区二区三区| 亚洲人成免费网站| 国产一二三四区乱码免费| 四虎影视永久在线精品免费| 国产精品亚洲а∨无码播放麻豆| 亚洲欧美国产精品专区久久| 国产成人精品日本亚洲专一区| 亚洲国产精品专区| 亚洲免费在线观看视频| 亚洲冬月枫中文字幕在线看| 亚洲一区二区三区在线| 亚洲 欧洲 自拍 另类 校园| 亚洲熟妇AV一区二区三区浪潮 | 色屁屁在线观看视频免费| 国产亚洲精品免费| 午夜亚洲国产精品福利| 色费女人18女人毛片免费视频| 黄色一级毛片免费看| 在线观看国产一区亚洲bd| 午夜亚洲国产精品福利|