当前位置:文档之家› Java大作业设计报告

Java大作业设计报告

《Java程序设计》大作业设
计报告
设计名称多人聊天室
组员姓名
学生班级
设计时间 2013.12.15
设计成绩
一、问题描述及设计思路
设计多人聊天程序,能进行多人实时聊天,其中服务器为PC端,客户端为安卓端。

在服务器上,不断监听来自客户端的接入请求,对于接入的客户端加入线程池,同时为之开启独立线程,等待从该客户端发来的信息,再转发给其他客户端。

在客户端上,首先布局简单的安卓界面,开启客户端并且登录后,设置button 按钮监听想服务器发送信息请求,同时开启独立线程接收来自服务器的信息(即来自其他客户端的信息)。

二、详细设计过程
服务器开发
1.首先,导入了我们完成服务器端所要完成的各种类:
能,辅助以GUI界面进行美化。

2.在Server类里面的私有成员函数里,有以下定义:
程运行做准备,
同时创建了一个广义的ArrayList<Socket>vector,用来存放客户端的套接字。

创建了两个file类的文件,分别用于记录客户端的链接信息和保存客户端的聊天记录。

一个独立的线程,互不干扰。

接下来则是采用GUI组件进行简单的界面设计,在try-catch块里完成主要功能。

首先,采用ServerSocket serverSocket = new ServerSocket(port);建立套接字,一旦建立成功,则在服务器端的界面上会出现创建的日期信息。

又使用Socket socket = serverSocket.accept();连接客户端,采用while语句不断监听客户端连接,收到请求后,则在服务器端显示客户端的信息,如连接到服务器的时间,客户端的主机名称和IP地址,这些信息会被写进txt文本进行保存。

mExecutorService.execute(new Thread
(newHandleAClient(socket)));则是向线程池中添加线程,这里使用了一个内部类HandleAClient用于处理服务器和单独一个客户端之间的问题。

请看下面的继续解析。

4.采用一个内部类HandAClient完成一个客户端和服务器之前互相传输信息的
将信息发送到其他的客户端。

首先,用br获取流对象,再用msg保存读到的信息,同时在里面还定义了另外一个函数sendToClient(),用于把信息发送给客户端,在发送信息是,服务端还要进行判断,通过ArrayList类对象Vector,里面每一个元素为客户端的socket,进行判断:如果获取到的某个信息是来源于客户端A,则发送时客户端A暂时关闭,把A的信息发送到其他的所有客户端,这样会避免在客户端上自己发出的信息显示两次的问题。

同时,服务端把客户端的信息保存为记录文本txt文件。

客户端开发
开发步骤:
1.新建一个android应用程序
2.在布局文件中添加两个button控件标签,和两个文本框,并未其设置属性和值
3.在Activity中,声明控件变量并根据id获得控件对象
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(yout.activity_talk);
buttonIn = (Button) findViewById(R.id.buttonIn);
buttonSend = (Button) findViewById(R.id.buttonSend);
//show the messages
text01 = (EditText) findViewById(R.id.text01);
//input the message
text02 = (EditText) findViewById(R.id.text02);
4.以匿名内部类方式监听button
// the button of login
buttonIn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
// con nect to server
s = new Socket(IP, PORT);
//inputStream includes in br
br = new BufferedReader(new InputStreamReader(s
.getInputStream()));
//os is the outputStream
os = s.getOutputStream();
} catch (Exception e) {
// handle exception
Log.e(DEBUG_TAG, e.toString());
}
}
});
//the button of send
buttonSend.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
// get the information from the text02
String str = text02.getText().toString();
//show the information on text01
text01.setText(str);
os.write((str + "\n").getBytes("utf-8"));
} catch (Exception e) {
// handle exception
Log.e(DEBUG_TAG, e.toString());
}
}
});
5.登陆后,开启线程监听来自服务器的信息
private Runnable myRunnable = new Runnable() {
public void run() {
//monitor the information from the server continually
while (true) {
try {
if ((message = br.readLine()) != null) {
message += "\n";
mHandler.sendMessage(mHandler.obtainMessage());
}
} catch (Exception e) {
Log.e(DEBUG_TAG, e.toString());
}
}
}
};
开启异步处理函数:
Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
try {
//show the information from the server
text01.append(message);
} catch (Exception e) {
Log.e(DEBUG_TAG, e.toString());
}
}
};
三、结论及体会
此次大作业,是我们团队对新知识应用很好的一次的尝试。

此次我们团队四人分成两组,分别写服务器和客户端。

期间,我们一共敲出三份代码。

首先单客户端通信的软件,这个程序难度比较小。

另外还敲了比较复杂的安卓UDP通信程序,有用户名自定义跟头像选择,但是因为在安卓Activity间用intent转换时没有找出其中的bug,所以暂时性放弃那份代码。

这份代码是第三份相对第二份来说比较简单。

通过此次合作,让我们团队深刻地了解到,对于多而泛的知识学习,我们更应该强调合作精神,分工细化,这样能更有效地进行学习,因此我们也专门成立android学习小组。

四、附录(图表、关键代码)
服务器界面:
一旦服务器端运行,那么在服务器上就会显示这次服务器运行时的准确时间。

一旦连接到客户端,就会在服务器的界面上不断显示信息。

具体请看客户端代码报告。

客户端界面:
客户端登录:
客户端发送消息:
其他客户端接入。

相关主题