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(500, 300);
setLocation(200, 300);
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ò)誤,望多多指教!不勝感激!