Posted on 2007-05-24 20:31 
久城 阅读(4032) 
评论(8)  编辑  收藏  所属分类: 
JavaTest 
			 
			
		 
		要回家了,心就散了,毕业论文也做不下去了。闲着弄了弄Socket。同时遇到了一些问题。
服务端ChatServer.java
 package com.neusoft.socket.chat;
package com.neusoft.socket.chat;

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


 public class ChatServer
public class ChatServer  {
{
 // 存储不同客户端的线程
    // 存储不同客户端的线程
 public static Hashtable peopleList;
    public static Hashtable peopleList;


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

 peopleList = new Hashtable();
        peopleList = new Hashtable();

 while (true)
        while (true)  {
{

 try
            try  {
{
 // 建立服务端
                // 建立服务端
 server = new ServerSocket(8099);
                server = new ServerSocket(8099);

 } catch (IOException e)
            } catch (IOException e)  {
{
 }
            }

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


 } catch (IOException e)
            } catch (IOException e)  {
{
 }
            }

 if (socket != null)
            if (socket != null)  {
{
 // 开启一条线程通讯
                // 开启一条线程通讯
 new Server_thread(socket).start();
                new Server_thread(socket).start();

 } else
            } else  {
{
 continue;
                continue;
 }
            }
 }
        }
 }
    }
 }
}

服务端线程Server_thread.java
 package com.neusoft.socket.chat;
package com.neusoft.socket.chat;

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


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

 String keyName = null;
    String keyName = null;

 String message = null;
    String message = null;

 Socket socket = null;
    Socket socket = null;

 ObjectOutputStream out = null;
    ObjectOutputStream out = null;

 ObjectInputStream in = null;
    ObjectInputStream in = null;

 Hashtable peopleList = null;
    Hashtable peopleList = null;


 public Server_thread(Socket t)
    public Server_thread(Socket t)  {
{
 socket = t;
        socket = t;

 try
        try  {
{
 // 取得输入输出流对象
            // 取得输入输出流对象
 in = new ObjectInputStream(socket.getInputStream());
            in = new ObjectInputStream(socket.getInputStream());
 out = new ObjectOutputStream(socket.getOutputStream());
            out = new ObjectOutputStream(socket.getOutputStream());

 } catch (IOException e)
        } catch (IOException e)  {
{
 }
        }
 }
    }


 public void run()
    public void run()  {
{


 while (true)
        while (true)  {
{


 try
            try  {
{
 // 读取客户端消息
                // 读取客户端消息
 message = (String) in.readObject();
                message = (String) in.readObject();
 // 把客户端线程存储到HASHTABLE
                // 把客户端线程存储到HASHTABLE
 name = socket.getInetAddress().toString();
                name = socket.getInetAddress().toString();

 if (!ChatServer.peopleList.containsKey(name))
                if (!ChatServer.peopleList.containsKey(name))  {
{
 ChatServer.peopleList.put(name, this);
                    ChatServer.peopleList.put(name, this);
 }
                }

 // 遍历HASHTABLE,把消息发送到每一个客户端,实现多人聊天
                // 遍历HASHTABLE,把消息发送到每一个客户端,实现多人聊天
 Enumeration enum1 = ChatServer.peopleList.keys();
                Enumeration enum1 = ChatServer.peopleList.keys();

 while (enum1.hasMoreElements())
                while (enum1.hasMoreElements())  {
{
 keyName = (String) enum1.nextElement();
                    keyName = (String) enum1.nextElement();
 ((Server_thread) ChatServer.peopleList.get(keyName)).out
                    ((Server_thread) ChatServer.peopleList.get(keyName)).out
 .writeObject(keyName + "says:" + message);
                            .writeObject(keyName + "says:" + message);
 }
                }

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

 } catch (IOException ee)
            } catch (IOException ee)  {
{
 ee.printStackTrace();
                ee.printStackTrace();
 }
            }
 }
        }
 }
    }
 }
}客户端:Client.java
 package com.neusoft.socket.chat;
package com.neusoft.socket.chat;

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


 public class Client extends JFrame
public class Client extends JFrame  {
{
 private Container container;
    private Container container;

 private JTextField enterField;
    private JTextField enterField;

 private JTextArea displayArea;
    private JTextArea displayArea;

 private ObjectOutputStream output;
    private ObjectOutputStream output;

 private ObjectInputStream input;
    private ObjectInputStream input;

 private String message = "";
    private String message = "";

 private String chatServer;
    private String chatServer;

 private Socket client;
    private Socket client;


 public Client(String host)
    public Client(String host)  {
{
 //初始化聊天窗口
        //初始化聊天窗口
 super("my Client");
        super("my Client");
 chatServer = host;
        chatServer = host;
 container = getContentPane();
        container = getContentPane();
 enterField = new JTextField();
        enterField = new JTextField();
 enterField.setEnabled(false);
        enterField.setEnabled(false);

 enterField.addActionListener(new ActionListener()
        enterField.addActionListener(new ActionListener()  {
{

 public void actionPerformed(ActionEvent event)
            public void actionPerformed(ActionEvent event)  {
{
 sendData(event.getActionCommand());
                sendData(event.getActionCommand());
 }
            }
 });
        });
 container.add(enterField, BorderLayout.SOUTH);
        container.add(enterField, BorderLayout.SOUTH);
 displayArea = new JTextArea();
        displayArea = new JTextArea();
 container.add(new JScrollPane(displayArea), BorderLayout.CENTER);
        container.add(new JScrollPane(displayArea), BorderLayout.CENTER);
 setSize(500, 300);
        setSize(500, 300);
 setLocation(200, 300);
        setLocation(200, 300);
 setVisible(true);
        setVisible(true);
 }
    }

 // 执行客户端
    // 执行客户端

 public void runClient()
    public void runClient()  {
{

 try
        try  {
{
 connectToServer();
            connectToServer();
 getStreams();
            getStreams();
 processConnection();
            processConnection();
 closeConnection();
            closeConnection();

 } catch (EOFException eofException)
        } catch (EOFException eofException)  {
{
 System.out.println("Server terminated connection");
            System.out.println("Server terminated connection");

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

 // 连接服务端
    // 连接服务端

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

 // 取得数据流
    // 取得数据流

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

 // 执行通信
    // 执行通信

 private void processConnection() throws IOException
    private void processConnection() throws IOException  {
{
 enterField.setEnabled(true);
        enterField.setEnabled(true);

 do
        do  {
{


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

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

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

 // 关闭连接
    // 关闭连接

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

 // 发送消息
    // 发送消息

 private void sendData(String message)
    private void sendData(String message)  {
{

 try
        try  {
{
 output.writeObject("child>>> " + message);
            output.writeObject("child>>> " + message);
 output.flush();
            output.flush();
 enterField.setText("");
            enterField.setText("");

 } catch (IOException e)
        } catch (IOException e)  {
{
 displayArea.append("\nError writing object");
            displayArea.append("\nError writing object");
 }
        }
 }
    }


 public static void main(String args[])
    public static void main(String args[])  {
{
 Client c = new Client("192.168.34.179");
        Client c = new Client("192.168.34.179");
 c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 c.runClient();
        c.runClient();
 }
    }
 }
}这样可以简单的实现局域网内通信。
但是形式还太简单。和朋友间用的话,朋友还得运行JAVA文件才可以。想作成可执行的文件。在网上查了查,好像有工具可以直接实现。可惜在公司,下不了那些软件。
所以想用别的方法。最先,我想把它嵌入到WEB中,结合javascript,jsp做了大半天。其中java,javacript,jsp之间的相互通信实在是让我头疼。越弄越复杂。后来,想写成Applet,后悔当初没有认真听Applet,弄了半天始终没有达到理想的效果。
先把代码贴下,回家继续改。 
欢迎来访!^.^!
本BLOG仅用于个人学习交流!
目的在于记录个人成长.
所有文字均属于个人理解.
如有错误,望多多指教!不胜感激!