您的位置:首页 > 编程语言 > Java开发

java写的聊天程序

2011-04-08 20:09 316 查看
初学java,本文是修改的head first java 里的一段代码而成,花了将近两天的时间,第一次自己动手写java程序,有不妥之处,望各位指出。

分为客户端和服务端,能够识别自己和其它用户,服务端接收消息用的多线程。缺点还很多,如,不支持用户名、没有返回聊天时间、不能保存聊天记录等。。。由于时间有限,不能一下处理完这些问题。先把代码贴出来,欢迎拍砖!

]/** VerySimpleChatServer.java
*  Chat Server
* The program just build a chat server
* for chat clients online
* the connect port is  '5000'
*/
import java.io.*;
import java.net.*;
import java.util.*;
public class VerySimpleChatServer {
ArrayList<PrintWriter> clientOutputStreams;

/** Name clienthander ()
* multi thread
*/
private class ClientHandler implements Runnable {
BufferedReader reader;
Socket sock;

/** Name ClientHandler
*	public method
*  initialize buffereader and send message
* to all client
*/
public ClientHandler(Socket clientSocket) {
try {
sock = clientSocket;
InputStreamReader isReader = new InputStreamReader(sock.getInputStream());
reader = new BufferedReader(isReader);
} catch(Exception ex) {ex.printStackTrace();}
}

synchronized public void run() {
String message;
try {
Thread.sleep(500); // sleep to avoid server cannt reaction
while ((message = reader.readLine()) != null) {

System.out.println("read " + message);
tellEveryone(message);

} // close while()

} catch (Exception ex) {ex.printStackTrace();}
}
}

public static void main(String[] args) {
new VerySimpleChatServer().go();
}

public void go () {
clientOutputStreams = new ArrayList<PrintWriter>();
try {
ServerSocket serverSock = new ServerSocket(5000);
System.out.println("Waite Client Connection...");

while(true) {
Socket clientSocket = serverSock.accept();

PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
clientOutputStreams.add(writer); // Ready for another thread called  tellEveryone()

Thread t1 = new Thread(new ClientHandler(clientSocket));
Thread t2 = new Thread(new ClientHandler(clientSocket));
t1.start();
t2.start();
//	System.out.println("got a connection: " );
}
}catch (Exception ex) {
ex.printStackTrace();
}
}
/**
*	This method can solve many problem
*  Broadcast message to all client
*/
public void tellEveryone(String message) {
Iterator it = clientOutputStreams.iterator();
while(it.hasNext()) {
try {
PrintWriter writer = (PrintWriter) it.next();
writer.println(message);
writer.flush();
} catch(Exception ex){
ex.printStackTrace();
}
} // close while
} // close tellEveryone
}
/** SimpleChatClient.java
*  ChatCilent
* The program just build one connect
* and keep to send message
* The default server IP and port "192.168.1.101:5000"
*/
import java.io.*;
import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class SimpleChatClient{
JTextArea incoming;
JTextField outgoing;
BufferedReader reader;
PrintWriter writer;
Socket sock;
String nativeip;
String severip = "192.168.1.101";

public static void main(String args[] ) {
SimpleChatClient client = new SimpleChatClient();
client.go();
}

public void go() {
JFrame frame = new JFrame("Ludicrously Simple Chat Client ");
JPanel mainPanel = new JPanel();
incoming = new JTextArea(20,40);
incoming.setLineWrap(true);
incoming.setWrapStyleWord(true);
incoming.setEditable(false);
JScrollPane qScroller = new JScrollPane(incoming);
qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
outgoing = new JTextField(20);
outgoing.addActionListener(new KeyboardListener());
JButton sendButton = new JButton("Send");
JButton cleanText = new JButton("Clean Text");
sendButton.addActionListener(new SendButtonListener());
cleanText.addActionListener(new  CleanButtonListener());
mainPanel.add(qScroller);
mainPanel.add(outgoing);
mainPanel.add(sendButton);
mainPanel.add(cleanText);
setUpNetworking();
// Get local IP Address
nativeip = getlocalip();

Thread readerThread = new Thread(new IncomingReader());
readerThread.start();

frame.getContentPane().add(BorderLayout.CENTER, mainPanel);
frame.setSize(600, 500);
frame.setVisible(true);
} //go

private void setUpNetworking() { //Stand and Initializ a new Network connect
try{
sock = new Socket(severip, 5000);
InputStreamReader streamReader = new InputStreamReader(sock.getInputStream());
reader = new BufferedReader(streamReader);
writer = new PrintWriter(sock.getOutputStream());

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

}
/** Name :getlocalip()
* return a String type which the
* local host ip address
* (ipv4)
*
*/
private  String getlocalip(){
String ipv4 = null;
try {
Enumeration<NetworkInterface> netIf = NetworkInterface.getNetworkInterfaces();

while (netIf.hasMoreElements()) {
NetworkInterface nwi = netIf.nextElement();
Enumeration address = nwi.getInetAddresses();
while (address.hasMoreElements()) {
InetAddress in = (InetAddress) address.nextElement();
if(in.isSiteLocalAddress()){
ipv4 = in.getHostAddress();
//    System.out.println(ipv4);
break;
}
}
}

}
catch (SocketException e) {
e.printStackTrace();
}
return ipv4;

}
/** Name delay
*  delay some secends
*
**/
private void delay(int time){
try {
Thread.currentThread().sleep(time * 1000);
}
catch(InterruptedException e)  {e.printStackTrace();}
}

/** Name keyboardListener
*  inner class
* 	reaction enter board
**/
public class KeyboardListener implements ActionListener {
public void actionPerformed(ActionEvent ev) {
if(incoming.getLineCount() >= 25) {
if(incoming.getLineCount() < 35){
incoming.append("Warning: The chat data will be clean/n");
}

else {
incoming.setText("");
incoming.append("Chat data was clean/n");
}
}

if(outgoing.getText().equals("")){
//outgoing.setText("please put some words!");
incoming.append("Warning: Please typing some words/n");
}
else{
String sendmsg = getlocalip() + ":" + outgoing.getText();
try {
writer.println(sendmsg);
writer.flush();

} catch (Exception ex) {
ex.printStackTrace();
}
}

outgoing.setText("");
outgoing.requestFocus();
}
} // close keyboardListener

/** Name CleanButtonListener
*  inner class
*  clear textarea
**/
public class CleanButtonListener implements ActionListener {
public void actionPerformed(ActionEvent ev) {
incoming.setText("");
}
}

/** Name SendButtonListener
*	inner class
*	when click Send Button
*	the event will reaction
*
*/
public class SendButtonListener implements ActionListener {
public void actionPerformed(ActionEvent ev) {
// when client send message, it must bring itself infomation
// (like ipaddress or username ) to sever
// use ":" split ipaddress
if(incoming.getLineCount() >= 25) {
if(incoming.getLineCount() < 35){
incoming.append("Warning: The chat data will be clean/n");
}

else {
incoming.setText("");
incoming.append("Chat data was clean/n");
}
}
if(outgoing.getText().equals("")){
//outgoing.setText("please put some words!");
incoming.append("Warning: Please typing some words/n");
}
else{
String sendmsg = getlocalip() + ":" + outgoing.getText();
try {
writer.println(sendmsg);
writer.flush();

} catch (Exception ex) {
ex.printStackTrace();
}
}

outgoing.setText("");
outgoing.requestFocus();
}
} // close inner class

/** Name IncomingReader
*  inner class
*
*/
public class IncomingReader implements Runnable {
public void run() {
String message;
String[] smeg;
try {

while ((message = reader.readLine()) != null) {
smeg = message.split(":");		// recongnized ':' judge the host name
if(smeg[0].equals(nativeip))
message =  "Me["+ smeg[0] +"]: " + smeg[1];
else message = "Stranger["+ smeg[0] +"]: " + smeg[1]; //Keep the same format
System.out.println("read " + message);
incoming.append(message + "/n");  //read the message and append to the JTextArea control..

} // end while
} catch (Exception ex) {ex.printStackTrace();}
}
}

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: