首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

基于JAVA的聊天系统解决思路

2013-03-26 
基于JAVA的聊天系统这是毕业设计,求大神给我一些思路传输与文字聊天工具. 聊天工具分为服务器端和客户端两

基于JAVA的聊天系统
这是毕业设计,求大神给我一些思路
传输与文字聊天工具. 聊天工具分为服务器端和客户端两大模块。

关键问题:
     聊天工具分为服务器端和客户端,以及图形化界面。简单分析服务器端和客户端所要完成的任务。
(1)服务器端应当建立一个ServerSocket,并且不断进行侦听是否有客户端连接或者断开连接(包括判断没有响应的连接超时)。
(2)服务器端应当是一个信息发送中心,所有客户端的信息都传到服务器端,由服务器端根据要求分发信息。
(3)客户端与服务器端建立通信通道,向服务器端发送信息。
(4)客户端接收来自服务器的信息。

[解决办法]
代码给你吧,有不懂的可以问我
package test;

import java.awt.*;
import java.awt.event.*;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Iterator;

import test.ChatServer.ClientThread;
// 客户端代码
public class ChatClient extends Frame {
Socket s = null;
DataOutputStream dos;
DataInputStream dis;
TextArea ta = null;
TextField tf = null;
String str = null;

public static void main(String[] args) {
ChatClient cc = new ChatClient();
cc.lauchFrame();
cc.connect();

}

public void lauchFrame() {
ta = new TextArea();
tf = new TextField();

this.setTitle("聊天系统");
this.setBounds(400, 200, 400, 300);
this.setVisible(true);
this.add(ta, BorderLayout.NORTH);
this.add(tf, BorderLayout.SOUTH);
pack();

this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
            disconnect();
System.exit(0);
}
});
tf.addActionListener(new TFActionListener());
}

private class TFActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
str = tf.getText();
tf.setText("");
try {
dos.writeUTF(str);
dos.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}

public void connect() {
try {
s = new Socket("127.0.0.1", 8888);
dos = new DataOutputStream(s.getOutputStream());
dis = new DataInputStream(s.getInputStream());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
new Thread( new ClientThread2()).start();
}

public void disconnect() {
try {
if (dos != null)
dos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private class ClientThread2 implements Runnable {
public void run() {
try {
while (true) {
str = dis.readUTF();
ta.setText(ta.getText() + str + '\n');
}
} catch (IOException e) {
System.out.println("a client closed");
// e.printStackTrace();
} finally {
try {
if (dis != null)
dis.close();
} catch (IOException e) {
e.printStackTrace();
}
}


}
}
}
package test;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ChatServer {
boolean start = false;
boolean connect = false;
String str = null;
List<ClientThread> clients = new ArrayList<ClientThread>();

public static void main(String[] args) {
ChatServer cs = new ChatServer();
cs.connect();
}

private void connect() {
try {
ServerSocket ss = new ServerSocket(8888);
start = true;
System.out.println("启动服务器的服务");
while (start) {
Socket s = ss.accept();
ClientThread ct = new ClientThread(s);
clients.add(ct);
new Thread(ct).start();
}

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

}

}

class ClientThread implements Runnable {
private Socket s = null;
DataInputStream dis = null;
DataOutputStream dos = null;

public ClientThread(Socket s) {
this.s = s;
try {
dis = new DataInputStream(s.getInputStream());
dos = new DataOutputStream(s.getOutputStream());
connect = true;
} catch (IOException e) {
e.printStackTrace();
}
}

public void send(String str) {
             try {
dos.writeUTF(str);
} catch (IOException e) {
e.printStackTrace();
}
}

public void run() {

// 一直读,当客户端的那头关闭了,它还在傻傻的读,这样就报java.io.EOFException错了!
try {
while (connect) {
str = dis.readUTF();
System.out.println(str);
for (Iterator i = clients.iterator(); i.hasNext();) {
ClientThread ct = (ClientThread) i.next();
ct.send(str);
}
}
} catch (IOException e) {
System.out.println("a client closed");
// e.printStackTrace();
} finally {
try {
if (dis != null)
dis.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}
}
}

[解决办法]
做毕业设计,一般都会有三种选择:
1.用别人已经做好的,理解之后,交作业。Java方面,现成的有好多,百度一下,你就知道了。
2.别人做了基本功能,理解之后,丰富一下其他功能,交作业。Java方面有很多消息中间件,同样百度。
3.零起点自己做,但是,要学习很多东西,花费很多时间,风险太大。
无论楼主选择哪种方式,都要有个计划,按照计划的时间安排,完成整个毕业设计。
我推荐楼主采用第一种,省时省力,也能学到东西,像Openfire什么的,功能已经很完善了,就差写文档了。
当然,第二种也可取,但是,是最麻烦的一种,不推荐楼主使用,因为涉及的东西多且复杂。
第三种需要楼主有旺盛的精力和充足的时间才可以,3个月应该搞不定。
当然,设计需求也会影响到的上述的三个选择。

先谈功能需求:
1.用户单对单聊天还是多个用户的聊天室。
2.服务端是否要有账户管理等功能。
3.客户端,文件传输与文字聊天是否要求可以同时进行。
4.是否要求客户端在不同的私网IP下进行通信(网络打洞技术)
5.客户端之间的文件传输,数据是否也要过服务端

有了较为明确的需求,我们才能零起点开发项目。

热点排行