管理学院实习总结报告
管理学院实习总结报告内容
第二篇:简单的Java网络即时通讯系统实习报告
xxx《JAVA程序设计》实习报告
实习性质: 课程实习
实习单位:
学 院:
班 级:
学生姓名: xxx
学 号:
指导老师:
实习时间: 20##-6-10至20##-6-14
Java网络即时通讯系统
一、 实习目的
Java网络即时通讯系统的开发是一个实践教学环节,旨在使学生通过系统开发过程,培养创造性的设计能力和分析、解决问题的能力。巩固学生已学知识,使学生熟悉应用系统开发过程,提高学生对知识的融会贯通能力及动手能力。
二、 实习内容及要求
问题描述:
本实习以Java在网络通讯上的应用为主题,在熟悉Java语言在网络通信中的特点的基础上,利用Java的跨平台,安全性和多线程等众多优点,开发一个Java在网络通讯上的编程实例:即时通讯聊天。
Java网络即时通讯系统设计要求:
即时通讯系统主要采用Java语言实现服务器,客户端程序的功能。本系统是基于TCP协议的编程,实现了网上聊天功能。
该聊天系统采用C/S架构,由服务服务器端和客户端组成。
服务器端具有以下功能:
(1) 启动服务器,建立侦听,接受客户端连接。
(2) 接收、转发聊天信息。
(3) 接受客户端关闭消息。
聊天客户端具有如下功能:
(1) 连接服务器,发送用户登录请求。
(2) 向服务器发送聊天信息。
(3) 接收服务器端转发的聊天信息。
三、 实习内容及结果
1.需求分析
(1)功能需求
服务器端:
1、启动服务器,建立侦听,接收客户端连接。
2、接收、转发聊天信息。
3、接收客户端关闭消息。
客户端:
1、连接服务器,发送用户登录请求。
2、向服务器发送聊天信息。
3、接收服务器端转发的聊天信息。
(2)用例图
.2. 详细设计(各个模块流程图或类图)
2.系统实现(实现结果截图)
3.系统发布与运行
第一步:在netbeans中进行清理构建在项目的dist文件夹中会出现
第二步:通过“j2ewiz”对项目进行打包。
第三步:打包软件的第一步通过浏览项目找到第一步中的Employee。
第四步:点击下一步后选择weindows窗口程序。
第五步:点击选择就会出现右边的窗口然后就是挑选出服务器点击确定。
第六步:
第七步:
第八步:这一步你可以选择修改你所打包的名字。
第九步:
第十步:客户端的操作跟服务器的是相同的,只有在第五步的选择时是选择的客户端。
最后的结果:
四、 总结
在本次实训当中我觉得学到很多,给我的感觉也很不一样,这么一个小项目就能如此复杂,一些细节上一步留神就会出错。这次实训,任务是让我们做一个简易的基于Java语言的聊天室,虽说是个比较简易的聊天工具,但是对于我来说无疑是一件非常困难的是。所有的界面都需要用代码实现,对于用代码构建窗架虽说不是很困难,但也是很繁杂的一个过程。我们试训时间只有一周的左右,要想做得很完美的聊天室那是不太现实,而且制作他们的还是我们这一群小菜鸟。我觉得,这样的实训重要的不是要我们在这一周内能做出多么完美的成果,而是自己在这一周内能学到什么,更不是为了完成最终作业二实训。
通过这次学习,我学到了不少实际编程的知识。 我刚开始很自信自己能顺顺利利编写成功,但这一过程并不太顺利。用了,两天的时间做出了一个功能近似得模子,但总是发现和我要实现的即时通讯聊天功能相差甚远。后来我抛弃了那个例子,全部重写,磕磕绊绊的不断发现错误,并改正它们,功夫不负有心人人,我的程序最后运行成功了。
实训的时间是短暂的,实训中也难免会遇到许许多多的问题,所以也不可能在这么短的时间内都解决。实训与平时的上课显然不同,实训中老师不会也不可能仔细的讲解每个知识点,否则的话一个月都不知道够不够。实训考研的就是我们自己能不能在逆境中成长,独立自主的完成老师下达的每个任务,但有必要的是不懂得还是及时询问老师或这寻求同学的帮助还活着上网查查资料也是可行的。实训中态度很重要,摆正自己的心态,只有自己付出过,当程序运行成功时得那种喜悦才会令自己莫名的自豪感。
众所周知,互联网从诞生以来,就开始影响着地球上的每一个角落,给予了人类一种全新的生活方式,随着互联网技术的不断发展,新兴技术也是层出不穷,及时通讯系统就是这么一种以聊天通讯形式为主的广受欢迎的互联网技术之一。
转眼间一周的实训就这样过去了,这让我对java的认识又加深了,java语言是当前最流行的语言之一,它纯面向对象的语言,封装性好,灵活,对以后我们学习其他语言也起到一定的辅助作用。
在设计的过程中了解到自己的知识还是比较有限,使得程序还不够完善。回顾此次Java,至今仍感概很多,的确,从选题到定稿,从理论到实践,整整一星期的日子里,可以说是苦多于甜,但是可以学到很多东西,同时不仅可以巩固以前学的东西,而且学到了很多课本上学不到的东西,通过本次课程设计,使得自己懂得理论和实践相结合起来,从理论中得出结论,才能真正掌握这门技术,也提高了自己独立思考的能力,在设计的过程中,可以自己解决。真正体会到要将一门知识学的更深入,必须加强实践,多练习,才能发现问题所在。
五、 附录(系统代码)
1.服务器端
import java.net.*;
import java.io.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.logging.Level;
import java.util.logging.Logger;
public class NetChatServer extends JFrame {
static JTextArea jtaInputChat;
JButton btnStart;
JButton btnStop;
JPanel pNorth;
JScrollPane jspArea;
ServerSocket ss = null;
Socket s = null;
DataInputStream dis = null;
// static JTextArea tfdUser;
public static void main(String[] args) {
new NetChatServer();
}
public NetChatServer() {
btnStart = new JButton("启动服务器");
btnStop = new JButton("关闭服务器");
pNorth = new JPanel();
jtaInputChat = new JTextArea(100,300);
jspArea = new JScrollPane(jtaInputChat);
//jspArea.getViewport().add(tfdUser);
Container contentPane = this.getContentPane();
BorderLayout bl = new BorderLayout();
setLayout(bl);
pNorth.add(btnStart);
pNorth.add(btnStop);
jtaInputChat=new JTextArea(15,30);
jspArea.getViewport().add(jtaInputChat);
contentPane.add(pNorth, BorderLayout.NORTH);
contentPane.add(jspArea, BorderLayout.CENTER);
EventAction ea = new EventAction();
btnStart.addActionListener(ea);
btnStop.addActionListener(ea);
this.setTitle("服务器端");
this.setVisible(true);
this.setSize(300,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
class EventAction implements ActionListener {
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == btnStart) {
btnStart.setEnabled(false);
btnStop.setEnabled(true);
jtaInputChat.append("服务器已启动\n");
jtaInputChat.setEditable(false);
ServerThread st=new ServerThread();
st.start();
}
if (ae.getSource() == btnStop) {
//jtaInputChat.setText();
jtaInputChat.append("服务器已关闭\n");
btnStart.setEnabled(true);
btnStop.setEnabled(false);
}
}
}
}
2.客户端
import java.io.*;
import java.net.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.logging.Level;
import java.util.logging.Logger;
public class NetClient extends JFrame implements ActionListener, Runnable {
JLabel lblUser, lblServerAdress, lblServerPort;
JTextField tfdUser, tfdSendMessage, tfdServerAdress, tfServerPort;
JButton btnIn, btnOut, btnSend;
JTextArea taMessages;
String strip, strport;
DataOutputStream dos;
DataInputStream dis;
Socket s;
Thread t;
public static void main(String[] args) {
new NetClient();
}
public NetClient() {
lblUser = new JLabel("用户名");
tfdUser = new JTextField(10);
btnIn = new JButton("进入聊天室");
btnOut = new JButton("退出聊天室");
btnOut.setEnabled(false);
tfdSendMessage = new JTextField(20);
btnSend = new JButton("发送");
taMessages = new JTextArea(10, 40);
taMessages.setEditable(false);
lblServerAdress = new JLabel("服务器地址");
lblServerPort = new JLabel("服务器端口");
tfdServerAdress = new JTextField(10);
tfServerPort = new JTextField(10);
tfdServerAdress.setEnabled(false);
tfServerPort.setEnabled(false);
Container contentPane = this.getContentPane();
setLayout(new BorderLayout());
JPanel jpEast = new JPanel(new GridLayout(4, 1));
jpEast.add(lblServerAdress);
jpEast.add(tfdServerAdress);
jpEast.add(lblServerPort);
jpEast.add(tfServerPort);
contentPane.add(jpEast, BorderLayout.EAST);
JScrollPane jspCentre = new JScrollPane(taMessages);
contentPane.add(jspCentre, BorderLayout.CENTER);
JPanel jpSouth = new JPanel();
jpSouth.add(tfdSendMessage);
jpSouth.add(btnSend);
contentPane.add(jpSouth, BorderLayout.SOUTH);
JPanel jpNorth = new JPanel();
jpNorth.add(lblUser);
jpNorth.add(tfdUser);
jpNorth.add(btnIn);
jpNorth.add(btnOut);
contentPane.add(jpNorth, BorderLayout.NORTH);
btnIn.addActionListener(this);
btnOut.addActionListener(this);
btnSend.addActionListener(this);
this.pack();
this.setVisible(true);
this.setTitle("客户端");
this.setSize(500, 400);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ConnectServer();
}
void ConnectServer() {
try {
s = new Socket("127.0.0.1", 8888);
InetAddress ip = s.getInetAddress();
strip = String.valueOf(ip);
strport = String.valueOf(s.getPort());
tfdServerAdress.setText(strip);
tfServerPort.setText(strport);
OutputStream os = s.getOutputStream();
dos = new DataOutputStream(os);
InputStream is = s.getInputStream();
dis = new DataInputStream(is);
} catch (UnknownHostException ex) {
System.out.println("找不到主机!");
} catch (IOException ex) {
System.out.println("传输异常");
}
}
public void actionPerformed(ActionEvent ae) {
if (tfdUser.getText().equals("")) {
tfdSendMessage.setEditable(false);
} else if (ae.getSource() == btnIn) {
if (!tfdUser.getText().equals("")) {
try {
tfdSendMessage.setEditable(true);
dos.writeUTF(tfdUser.getText() + "进入聊天室\n");
dos.flush();
tfdUser.setEditable(false);
btnIn.setEnabled(false);
btnOut.setEnabled(true);
btnSend.setEnabled(true);
t = new Thread((Runnable) this);
t.start();
} catch (IOException ex) {
System.out.println("进入聊天室发送失败");
}
} else {
JOptionPane.showMessageDialog(null, "请输入用户名!");
}
} else if (ae.getSource() == btnOut) {
try {
tfdSendMessage.setEditable(false);
dos.writeUTF(tfdUser.getText() + "退出聊天室\n");
btnOut.setEnabled(false);
dos.flush();
} catch (IOException ex) {
Logger.getLogger(NetClient.class.getName()).log(Level.SEVERE, null, ex);
}
} else if (ae.getSource() == btnSend) {
if (!tfdSendMessage.getText().equals("")) {
try {
dos.writeUTF(tfdUser.getText() + "对大家说:" + tfdSendMessage.getText() + "\n");
dos.flush();
tfdSendMessage.setText(null);
} catch (IOException ex) {
Logger.getLogger(NetClient.class.getName()).log(Level.SEVERE, null, ex);
}
} else {
JOptionPane.showMessageDialog(null, "不能为空!");
}
}
}
public void run() {
while (true) {
try {
if (dis != null) {
taMessages.append(dis.readUTF());
}
} catch (IOException ex) {
System.out.println("退出聊天室,读取数据出错");
System.exit(0);
}
}
}
}
线程一ServerThread:
import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ServerThread extends Thread {
ServerSocket ss=null;;
DataInputStream dis=null;
DataOutputStream dos=null;
Socket s=null;
ArrayList<ClientThread> NetClient;
ArrayList<String> taMessages;
public ServerThread(){
try{
ss = new ServerSocket(8888);
NetClient = new ArrayList<ClientThread>();
taMessages = new ArrayList<String>();
}catch(IOException ex){
Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex);
}
BroadCastThread bct = new BroadCastThread(this);
bct.start();
}
public void run() {
try {
while (true) {
s = ss.accept();
dis = new DataInputStream(s.getInputStream());
dos = new DataOutputStream(s.getOutputStream());
ClientThread ct = new ClientThread(dis, dos, this);
ct.start();
synchronized (NetClient) {
NetClient.add(ct);
}
}
}catch (IOException ex) {
System.out.println("连接客户机失败!" + ex.getMessage());
System.exit(0);
}finally {
try {
if (dis != null) {
dis.close();
}
if (s!= null) {
s.close();
}
if (ss != null) {
ss.close();
}
} catch (IOException ex) {
}
}
}
}
线程二ClientThread:
import java.net.Socket;
import static Text2.NetChatServer.jtaInputChat;
import com.sun.corba.se.spi.activation.Server;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ClientThread extends Thread{
DataInputStream dis=null;
DataOutputStream dos=null;
Socket s=null;
ServerThread st=null;
public ClientThread(DataInputStream dis, DataOutputStream dos, ServerThread st) {
this.dis = dis;
this.dos = dos;
this.st=st;
}
public void run() {
try {
while (true) {
String chat_in = dis.readUTF();
synchronized (st.taMessages) {
if (chat_in != null) {
st.taMessages.add(chat_in);
NetChatServer.jtaInputChat.append(chat_in);
}
}
}
} catch (IOException ex) {
System.out.println("读取数据出错!");
}
}
}
线程三BroadCastThread:
import java.io.DataInputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class BroadCastThread extends Thread {
ServerThread st = null;
ClientThread ct = null;
String str = null;
public BroadCastThread(ServerThread st) {
this.st = st;
}
public void run() {
while (true) {
if (st.taMessages.isEmpty()) {
continue;
}
synchronized (st.taMessages) {
str = st.taMessages.get(0);
st.taMessages.remove(0);
}
System.out.println(str);
synchronized (st.NetClient) {
for (int i = 0;i < st.NetClient.size();i++) {
try {
ct = st.NetClient.get(i);
ct.dos.writeUTF(str);
}
catch (IOException ex) {
Logger.getLogger(BroadCastThread.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println(i);
}
}
}
}
}
六、 教师评语及分数