标签:unix 练习 客户端 bsp 接收 server center stat font
获取项目源文件,技术交流与指导联系Q:1225467431
在windows操作系统下,使用Eclipse开发工具,使用Java语言进行支持跨平台对QQ聊天室的软件开发。
6月25日: 开学典礼,练习操作系统windows下,在Java中HelloWorld编写
6月26日: 讲述输入数据、循环控制及随机数的产生 讲述流程控制、面向对象知识
6月27日: 讲述字符串的输出及长度统计、八类数据类型、数据之间的转化以及标识符
的命名规则
6月28日: 讲述构造函数new、类的封装、Java的访问权限、线程及线程的五种状
态、实现方法、启动方法
6月29日: 讲述字节流、字符流及网络编程的服务器端编程步骤、客户端的编程步骤
6月30日: 讲述Socket编程、下午启动QQ聊天室
7月02日: 上午继续练习QQ聊天室的相关知识,下午学习Swing
7月03日: 开始做即时通信项目
7月04日: 去达内本部进行模拟面试
7月05日: 上午学生做项目并处理所遇到的问题,下午评审项目
7月06日: 毕业典礼
//服务器端程序
public class Server {
//存放当前在线用户--名字
List users=new ArrayList();
//存放当前在线的连接--socket
List sockets=new ArrayList();
Map userAdress=new HashMap();
//服务器端ServerSocket对象
ServerSocket serverSocket;
int port=1212;
JFrame jf=new JFrame("QQ服务器");
JTextArea jta1=new JTextArea(2,15);
JTextArea jta2;
public void startServer(){
//初始化服务器端界面
initFrame();
//初始化服务器端端口(ServerSocket对象实例化)
initSocket();
//启动监听客户端
startListener();
}
public void initFrame(){
jf.setLayout(new BorderLayout());
final ImageIcon ima=new ImageIcon(Server.class.getResource("ttttt.jpg"));
jta2=new JTextArea(10,15);
//设置背景图片
JPanel jp=new JPanel();
jp.setLayout(new BorderLayout());
ImageIcon ima1=new ImageIcon(Server.class.getResource("ttttt.jpg"));
JLabel jl=new JLabel(ima1);
jp.add(jl,BorderLayout.CENTER);
jp.add(jta1,BorderLayout.SOUTH);
jta1.setBackground(new Color(190,187,222));
jta1.setEditable(false);
jta2.setEditable(false);
jta2.setBackground(new Color(50,108,222));
JScrollPane jsp=new JScrollPane(jta2);
ImageIcon ima2=new ImageIcon(Server.class.getResource("3.gif"));
JLabel j2=new JLabel(ima2);
ImageIcon ima3=new ImageIcon(Server.class.getResource("1.gif"));
JLabel j3=new JLabel(ima3);
// JLabel j4=new JLabel(ima4);
// j4.setSize(new Dimension(200,150));
// j3.setSize(new Dimension(200,150));
JPanel jp2=new JPanel(){
public void paint(Graphics g) {
super.paint(g);
ImageIcon ima4=new ImageIcon(Server.class.getResource("19058.gif"));
ImageIcon ima2=new ImageIcon(Server.class.getResource("3.gif"));
g.drawImage(ima2.getImage(),0,0 , 205, 160, null);
g.drawImage(ima4.getImage(), 200,0 , 110, 160, null);
repaint();
};
};
jp2.setBackground(new Color(90,87,222));
jp2.add(j2);
// jp2.add(j3);
// jp2.add(j4);
jf.add(jp,BorderLayout.NORTH);
jf.add(jsp,BorderLayout.CENTER);
jf.add(jp2,BorderLayout.SOUTH);
jf.setSize(315,650);
jf.setIconImage(new ImageIcon(Server.class.getResource("qq.png")).getImage());
jf.setVisible(true);
// jf.setLocation(0,0);
jf.setResizable(false);
jf.setDefaultCloseOperation(
jf.EXIT_ON_CLOSE);
}
public void initSocket(){
try {
serverSocket=new ServerSocket(port);
jta1.setText("开始启动QQ服务器......\n");
try {
Thread.sleep(5000);
jta1.append("服务器启动成功!");
jta2.setText("QQ用户当前在线人数>>"+users.size()+"\n");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (IOException e) {
JOptionPane.showMessageDialog(
jf,"服务器端启动失败");
}
}
public void updateUsers(){
jta2.setText("");//清空用户列表
jta2.setText("QQ用户当前在线人数>>"+users.size()+"\n");
for(int i=0;i<users.size();i++){
String str=users.get(i)+""+userAdress.get(users.get(i))+"\n";
jta2.append(str);
}
}
public void startListener(){
while(true){
try {
final Socket s;
//停到这一个,等待客户端的连接
s=serverSocket.accept();
System.out.println("连接成功");
sockets.add(s);
final ObjectInputStream ois ;
ois=new ObjectInputStream(
s.getInputStream());
new Thread(){
public void sendMsg(Message msg){
//sockets----OutputStream---writeObject(msg);
for(int i=0;i<sockets.size();i++){
Socket s=(Socket)sockets.get(i);
try {
ObjectOutputStream oos=
new ObjectOutputStream(s.getOutputStream());
oos.writeObject(msg);
oos.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void run(){
while(true){
Message msg;
try {
msg = (Message)ois.readObject();//等待客户端发送信息
String type=msg.getType();
// System.out.println("===="+type);
if("login".equals(type)){
//登录请求
//更新服务器端用户列表
users.add(msg.getFromName()); userAdress.put(msg.getFromName(),s.getInetAddress());
updateUsers();
msg.setUserList(users);
msg.setMessage("【"+msg.getFromName()+
"】上线了!【"+new SimpleDateFormat("yyyy年MM月dd日 HH小时mm分ss秒").format(msg.getSendTime())+"】");
sendMsg(msg);//给每个用户发送消息
//---msg服务器端处理业务后封装的一个Message对象
}else if("loginOut".equals(type)){
//断开请求
//更新服务器端用户列表
users.remove(msg.getFromName());
msg.setMessage("【"+msg.getFromName()+
"】下线了!【"+new SimpleDateFormat("yyyy年MM月dd日 HH小时mm分ss秒").format(msg.getSendTime())+"】");
msg.setUserList(users);
sendMsg(msg);
sockets.remove(s);
updateUsers();
break;
}else if("send".equals(type)){
//发送消息
String str="【"+msg.getFromName()+"说】:"+
msg.getMessage()+"【"+new SimpleDateFormat("yyyy年MM月dd日 HH小时mm分ss秒").format(msg.getSendTime())+"】\n";
msg.setMessage(str);
sendMsg(msg);
}else if("personal".equals(type)){
//私聊......
System.out.println("server---personal");
msg.setMessage("【"+msg.getFromName()+
"】请求与你会话【"+new SimpleDateFormat("yyyy年MM月dd日 HH小时mm分ss秒").format(msg.getSendTime())+"】");
sendMsg(msg);
}else if("personalSend".equals(type)){
System.out.println("server---personalSend");
String str="【"+msg.getFromName()+"说】:"+
msg.getMessage()+"【"+new SimpleDateFormat("yyyy年MM月dd日 HH小时mm分ss秒").format(msg.getSendTime())+"】\n";
msg.setMessage(str);
sendMsg(msg);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Server server=new Server();
server.startServer();//启动服务器端
}
}
//客户端程序
public class Client implements ActionListener{
JFrame jf=new JFrame("西安工业大学电信四班聊吧!!!!");
//north
JPanel north=new JPanel();
JMenuBar jmb=new JMenuBar();
JMenu connect=new JMenu("connect");
JMenu about=new JMenu("about");
JMenuItem jmi1=new JMenuItem("连接服务器");
JMenuItem jmi2=new JMenuItem("断开服务器");
JMenuItem jmi3=new JMenuItem("退出");
JMenuItem jmi4=new JMenuItem("关于小组");
ImageIcon loginImage=
new ImageIcon(
Client.class.getResource("gongda_a.gif"));
JLabel jl1=new JLabel(loginImage);
//west
JPanel west=new JPanel();
ImageIcon westImage=new ImageIcon(
Client.class.getResource("ttt.gif"));
JLabel jl2=new JLabel(westImage);
DefaultListModel dlm=new DefaultListModel();
JList userList=new JList(dlm);
JScrollPane jsp=new JScrollPane(userList);
//center
JPanel center=new JPanel();
JTextArea jta=new JTextArea();
JScrollPane jsp1=new JScrollPane(jta);
JLabel jl3=new JLabel("请输入消息:");
JTextField jtf=new JTextField(40);
JButton send=new JButton("发送");
Socket s;
ObjectOutputStream oos;
String userName="游客";
String toName;
Message msg;
JTextArea jta1=new JTextArea();
JFrame jf2;
JTextArea jta2=new JTextArea();
JScrollPane jsp2=new JScrollPane(jta2);
public void startClient(){
//初始化界面
initFrame();
//添加监听事件
addListener();
}
public void initFrame(){
jf.setLayout(new BorderLayout());
//给north添加组件
connect.add(jmi1);
connect.add(jmi2);
connect.add(jmi3);
about.add(jmi4);
jmb.add(connect);
jmb.add(about);
north.setLayout(new BorderLayout());
north.add(jmb,BorderLayout.NORTH);
north.add(jl1,BorderLayout.CENTER);
jf.add(north,BorderLayout.NORTH);
//给west添加组件
west.setLayout(new BorderLayout());
west.add(jl2,BorderLayout.NORTH);
userList.setBackground(Color.cyan);
jsp.setSize(150,300);
userList.setFixedCellWidth(150);
userList.setFont(new Font("黑体",Font.BOLD,20));
west.add(jsp,BorderLayout.CENTER);
jf.add(west,BorderLayout.WEST);
//给center添加组件
center.setLayout(new BorderLayout());
center.add(jsp1,BorderLayout.CENTER);
jta.setBackground(Color.white);
jta.setEditable(false);
jta.setFont(new Font("黑体",Font.BOLD,20));
JPanel jp=new JPanel();
jp.setLayout(new FlowLayout());
//两种不同方式给输入框添加回车监听
jtf.setActionCommand("enterKey");
jp.add(jl3);
jp.add(jtf);
jp.add(send);
center.add(jp,BorderLayout.SOUTH);
jf.add(center,BorderLayout.CENTER);
jf.setIconImage(new ImageIcon(Client.class.getResource("QQ_2.gif")).getImage());
jf.setSize(800,650);
jf.setLocation(200,100);
jf.setVisible(true);
jf.setResizable(false);
//给窗口红叉按钮从新添加监听事件
jf.setDefaultCloseOperation(
jf.DO_NOTHING_ON_CLOSE);
jf.addWindowListener(new WindowListener(){
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosing(WindowEvent e) {
if(oos==null){
System.exit(0);
}
Message msg=new Message();
msg.setType("loginOut");
msg.setSendTime(new Date());
msg.setFromName(userName);
try {
oos.writeObject(msg);
oos.flush();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.exit(0);
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
});
}
public void addListener(){
//给发送按钮添加监听
send.addActionListener(this);
//连接服务器添加监听
jmi1.addActionListener(this);
jmi2.addActionListener(this);
jmi3.addActionListener(this);
jmi4.addActionListener(this);
jtf.addActionListener(this);
userList.addMouseListener(new MouseListener(){
JFrame jf1=new JFrame();
JTextField jtf=new JTextField(10);
JButton jb1=new JButton("私聊发送");
JButton jb2=new JButton("私聊关闭");
Message msg1=new Message();
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() ==2) {
int index = userList.locationToIndex(e.getPoint());
toName=(String)(msg.getUserList()).get(index);
System.out.println("Double clicked on Item " + msg.getUserList().get(index));
JOptionPane.showMessageDialog(jf,toName);
msg1.setToName(toName);
jf1.setTitle("与"+toName+"会话中(主叫)");
msg1.setType("personal");
msg1.setSendTime(new Date());
msg1.setFromName(userName);
try {
oos.writeObject(msg1);
oos.flush();
} catch (IOException e1) {
JScrollPane jsp=new JScrollPane(jta1);
JPanel jp=new JPanel();
jb1.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
Message msg1=new Message();
msg1.setMessage(jtf.getText());
jtf.setText("");
msg1.setToName(toName);
msg1.setFromName(userName);
msg1.setSendTime(new Date());
msg1.setType("personalSend");
try {
oos.writeObject(msg1);
oos.flush();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
jb2.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
jf1.dispose();
Message msg1=new Message();
msg1.setFromName(userName);
msg1.setSendTime(new Date());
msg1.setMessage(userName+"离线了!");
msg1.setType("personalSend");
try {
oos.writeObject(msg1);
oos.flush();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
jp.add(jtf);
jp.add(jb1);
jp.add(jb2);
jf1.add(jsp,BorderLayout.CENTER);
jf1.add(jp,BorderLayout.SOUTH);
jf1.setSize(500,400);
jf1.setLocation(100,300);
jf1.setVisible(true);
jf1.setResizable(false);
jf1.setDefaultCloseOperation(jf1.DO_NOTHING_ON_CLOSE);
jf1.addWindowListener(new WindowListener(){
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosing(WindowEvent e) {
System.out.println("hhhhhh");
jf1.dispose();
}
@Override
public void windowDeactivated(WindowEvent e) {
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
});
}
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
});
}
@Override
public void actionPerformed(ActionEvent e){
String com=e.getActionCommand();
if("发送".equals(com)||"enterKey".equals(com)){
msg=new Message();
msg.setFromName(userName);
msg.setSendTime(new Date());
msg.setMessage(jtf.getText());
msg.setType("send");
try {
oos.writeObject(msg);
oos.flush();
jtf.setText("");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("你的操作是:"+com);
}else if("连接服务器".equals(com)){
int count=0;
do{
if(count>=2){
JOptionPane.showMessageDialog(
jf,"鄙视你");
break;
}
String ip=JOptionPane.
showInputDialog("请输入服务器端IP:");
int port=Integer.parseInt(
JOptionPane.showInputDialog("请输入服务器端口号:"));
try {
s=new Socket(ip,port);//连接服务器
} catch (UnknownHostException e1) {
count++;
JOptionPane.showMessageDialog(
jf,"你输入的IP地址不对!");
e1.printStackTrace();
} catch (IOException e1) {
count++;
JOptionPane.showMessageDialog(jf, "你输入的端口号不对");
e1.printStackTrace();
}
}while(s==null);
if(count<2){
String name=JOptionPane.
showInputDialog("请输入用户名");
userName=name;
msg=new Message();
msg.setFromName(name);
msg.setType("login");
msg.setSendTime(new Date());
//msg.setToName();
try {
oos=new ObjectOutputStream(
s.getOutputStream());
oos.writeObject(msg);//发送给服务器消息
oos.flush();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//接收服务器端信息
new Thread(){
JTextField jtf2=new JTextField(10);
Message msg2=new Message();
public void run(){
while(true){
try {
ObjectInputStream ois;
ois=new ObjectInputStream(
s.getInputStream());
msg=(Message)ois.readObject();
String type=msg.getType();
if("login".equals(type)){
List users=msg.getUserList();
dlm.removeAllElements();
for(int i=0;i<users.size();i++){
dlm.addElement(users.get(i));
}
String mes=jta.getText();
if(mes==null&&"".equals(mes)){
jta.setText(msg.getMessage()+"\n");
}else{
jta.append(msg.getMessage()+"\n");
}
}else if("loginOut".equals(type)){
//更新用户列表
//消息框清掉
if(userName.equals(msg.getFromName())){
//如果当前界面是要断开的用户---把用户列表和消息框全部清空
dlm.removeAllElements();
jta.append("您已下线,请从新连接服务器\n");
break;
}else{
/如果当前界面不是要断开的用户---用户列表少一条记录就行,消息框提示XXX下线
List users=msg.getUserList();
dlm.removeAllElements();
for(int i=0;i<users.size();i++){
dlm.addElement(users.get(i)+"\n");
}
String mes=msg.getMessage();
jta.append(mes+"\n");
}
}else if("send".equals(type)){
String mes=msg.getMessage();
jta.append(mes);
}else if("personal".equals(type)){
//判断是否有人与你私聊
if(userName.equals(msg.getToName())){
toName=msg.getFromName();
ystem.out.println("被叫"+msg.getFromName());
jf2=new JFrame("与"+msg.getFromName()+"聊天中(被叫)");
JPanel jp=new JPanel();
JButton jb3=new JButton("私聊发送");
JButton jb4=new JButton("私聊关闭");
jb3.addActionListener(new ActionListener(){
@Override
public void actionPerformed(
ActionEvent e) {
Message msg2=new Message();
msg2.setMessage("");
msg2.setMessage(jtf2.getText());
jtf2.setText("");
msg2.setSendTime(new Date());
msg2.setToName(toName);
msg2.setFromName(userName);
msg2.setType("personalSend");
try {
oos.writeObject(msg2);
oos.flush();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
jb4.addActionListener(new ActionListener(){
@Override
public void actionPerformed(
ActionEvent e) {
jf2.dispose();
msg2.setType("personalSend");
msg2.setToName(toName);
msg2.setFromName(userName);
msg2.setSendTime(new Date());
try {
oos.writeObject(msg2);
oos.flush();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
jp.add(jtf2);
jp.add(jb3);
jp.add(jb4);
jf2.add(jsp2,BorderLayout.CENTER);
jf2.add(jp,BorderLayout.SOUTH);
jf2.setSize(500,400);
jf2.setLocation(400,300);
jf2.setVisible(true);
jf2.setResizable(false);
jf2.setDefaultCloseOperation(jf2.DO_NOTHING_ON_CLOSE);
jf2.addWindowListener(new WindowListener(){
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosing(WindowEvent e) {
jf2.dispose();
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
ublic void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
});
/*new Thread(){
{ObjectInputStream ois1;
ois1=new ObjectInputStream(
s.getInputStream());
}
}.start();*/
}
}else if("personalSend".equals(type)){
System.out.println(userName+"被叫消息");
System.out.println("from"+msg.getFromName()+"to"+msg.getToName());
if(userName.equals(msg.getFromName())||userName.equals(msg.getToName())){
System.out.println(msg.getMessage()+"---");
if(jf2==null){
jta1.append(msg.getMessage());
}else{
jta2.append(msg.getMessage());
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
}
}else if("断开服务器".equals(com)){
if(oos!=null){
msg=new Message();
msg.setType("loginOut");
msg.setSendTime(new Date());
msg.setFromName(userName);
try {
oos.writeObject(msg);
oos.flush();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}else if("退出".equals(com)){
if(oos==null){
System.exit(0);
}
msg=new Message();
msg.setType("loginOut");
msg.setSendTime(new Date());
msg.setFromName(userName);
try {
oos.writeObject(msg);
oos.flush();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.exit(0);
System.out.println("你的操作是:"+com);
}else if("关于小组".equals(com)){
JOptionPane.showMessageDialog(jf,"我们是电信四班团队!!!!");
}
}
public static void main(String[] args) {
Client c=new Client();
//启动程序
c.startClient();
}
}
图1——启动服务器
图二——启动客户端
图三——客户端链接服务器的三个步骤
图四——多人在线
图五——聊天界面
从6月25日开始在达内实习,直到7月6号截止,短短的十多天时间,我获益良多,虽然很累,但是我过的很充实,我喜欢这个团体,因为有我认识的新的良师益友,它带给我的收获远不是几个知识点,不是你几个道理那么简单。更多的是团队合作精神,一份工作一个人做需要一天,十个人做可能只是几个小时而已。
达内的第一天充满期望,戴上牌子进行工作,很是兴奋,原本我们认为实习都是打酱油,没想到这个酱油打不了了,那我就踏踏实实干,虽然有点累,任务量很大。在付出了很到的同时我也得到了很大的收获。尤其在做一些基础知识练习的过程中,大家相互讨论,增进友谊,大家的想象力创造力都有提高。对于我们这些即将踏入社会的大学生来说,这是一个很有价值的实习,对于提高自己的职场能力有很大的帮助。
以前我不知道什么是IT行业,对IT有很大的向往,但是就是觉得自己和它离的很远,这次达内实习让我知道什么是IT行业,IT行业的发展方向是什么,都有了基础的认识。这里的氛围告诉我们在职场上应该做什么该怎么去做,告诉我们做事的方法和方向,更多的是一种潜移默化的影响和引导。这里的氛围让我们体会到实干,积极,行动,习惯,承诺和信用。一直在跟我们讲踏踏实实的讲实干精神。这里带给我的改变是习惯上的。在短短十天的时间内学习并且做出一个项目,每个人的能力和潜力都是逼出来的。这些有利于我们职场习惯的养成,是的,我们就是这样“被逼着不得不”养成新习惯:行动的习惯,总结的习惯,自我教育和学习的习惯。虽然说这些习惯可能离老师们要求和期望的目标还有差距,但是我们已经能在这些良好的职业习惯上体会到它带给我们的改变和收益了。比如说,假如没有这些老师的一再要求和都督,我可能会在大四这个令人烦躁的季节继续浮躁下去。如果没有这次机会,我也就不会认识我们这个团体里面这些优秀的同学和令人骄傲的老师们。
所以我很感激这次机会,感激达内的团队来到了我们学校给我们这次培训。在实训的十天里,我感谢这里的每个同学的竞争,鼓励和支持,这是个真诚热情的团队,我们互相鼓劲,帮助进步;我还要感谢宋老师、王文刚老师、王明刚老师,他们看起来都很普通,但是有如此不同凡响,他们带给我们的影响,不
会轻易地被时间抹掉。
师资力量稍有欠缺,我们小教室的老师对问题解答不到位,对一些问题不能正确做出判断。
标签:unix 练习 客户端 bsp 接收 server center stat font
原文地址:https://www.cnblogs.com/dejyyhg/p/12639945.html