网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 交易代码 > 课程设计 > 正文

java聊天室代码

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务
 java聊天室源代码import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;import java.net.*;import java.io.*;
/* * 聊天服务端的主框架类 */public class ChatServer extends JFrame implements ActionListener{
 public static int port = 8888;//服务端的侦听端口
 ServerSocket serverSocket;//服务端Socket Image icon;//程序图标 JComboBox combobox;//选择发送消息的接受者 JTextArea messageShow;//服务端的信息显示 JScrollPane messageScrollPane;//信息显示的滚动条 JTextField showStatus;//显示用户连接状态 JLabel sendToLabel,messageLabel; JTextField sysMessage;//服务端消息的发送 JButton sysMessageButton;//服务端消息的发送按钮 UserLinkList userLinkList;//用户链表
 //建立菜单栏 JMenuBar jMenuBar = new JMenuBar();  //建立菜单组 JMenu serviceMenu = new JMenu ("服务(V)");  //建立菜单项 JMenuItem portItem = new JMenuItem ("端口设置(P)"); JMenuItem startItem = new JMenuItem ("启动服务(S)"); JMenuItem stopItem=new JMenuItem ("停止服务(T)"); JMenuItem exitItem=new JMenuItem ("退出(X)");  JMenu helpMenu=new JMenu ("帮助(H)"); JMenuItem helpItem=new JMenuItem ("帮助(H)");
 //建立工具栏 JToolBar toolBar = new JToolBar();
 //建立工具栏中的按钮组件 JButton portSet;//启动服务端侦听 JButton startServer;//启动服务端侦听 JButton stopServer;//关闭服务端侦听 JButton exitButton;//退出按钮  //框架的大小 Dimension faceSize = new Dimension(400, 600);  ServerListen listenThread;
 JPanel downPanel ; GridBagLayout girdBag; GridBagConstraints girdBagCon;
 /**  * 服务端构造函数  */ public ChatServer(){  init();//初始化程序
  //添加框架的关闭事件处理  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  this.pack();  //设置框架的大小  this.setSize(faceSize);
  //设置运行时窗口的位置  Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();  this.setLocation( (int) (screenSize.width - faceSize.getWidth()) / 2,       (int) (screenSize.height - faceSize.getHeight()) / 2);  this.setResizable(false);
  this.setTitle("聊天室服务端"); //设置标题
  //程序图标  icon = getImage("icon.gif");  this.setIconImage(icon); //设置程序图标  show();
  //为服务菜单栏设置热键'V'  serviceMenu.setMnemonic('V');
  //为端口设置快捷键为ctrl+p  portItem.setMnemonic ('P');   portItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_P,InputEvent.CTRL_MASK));
  //为启动服务快捷键为ctrl+s  startItem.setMnemonic ('S');   startItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_S,InputEvent.CTRL_MASK));
  //为端口设置快捷键为ctrl+T  stopItem.setMnemonic ('T');   stopItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_T,InputEvent.CTRL_MASK));
  //为退出设置快捷键为ctrl+x  exitItem.setMnemonic ('X');   exitItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_X,InputEvent.CTRL_MASK));
  //为帮助菜单栏设置热键'H'  helpMenu.setMnemonic('H');
  //为帮助设置快捷键为ctrl+p  helpItem.setMnemonic ('H');   helpItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_H,InputEvent.CTRL_MASK));
 }  /**  * 程序初始化函数  */ public void init(){
  Container contentPane = getContentPane();  contentPane.setLayout(new BorderLayout());
  //添加菜单栏  serviceMenu.add (portItem);  serviceMenu.add (startItem);  serviceMenu.add (stopItem);  serviceMenu.add (exitItem);  jMenuBar.add (serviceMenu);   helpMenu.add (helpItem);  jMenuBar.add (helpMenu);   setJMenuBar (jMenuBar);
  //初始化按钮  portSet = new JButton("端口设置");  startServer = new JButton("启动服务");  stopServer = new JButton("停止服务" );  exitButton = new JButton("退出" );  //将按钮添加到工具栏  toolBar.add(portSet);  toolBar.addSeparator();//添加分隔栏  toolBar.add(startServer);  toolBar.add(stopServer);  toolBar.addSeparator();//添加分隔栏  toolBar.add(exitButton);  contentPane.add(toolBar,BorderLayout.NORTH);
  //初始时,令停止服务按钮不可用  stopServer.setEnabled(false);  stopItem .setEnabled(false);
  //为菜单栏添加事件监听  portItem.addActionListener(this);  startItem.addActionListener(this);  stopItem.addActionListener(this);  exitItem.addActionListener(this);  helpItem.addActionListener(this);    //添加按钮的事件侦听  portSet.addActionListener(this);  startServer.addActionListener(this);  stopServer.addActionListener(this);  exitButton.addActionListener(this);    combobox = new JComboBox();  combobox.insertItemAt("所有人",0);  combobox.setSelectedIndex(0);    messageShow = new JTextArea();  messageShow.setEditable(false);  //添加滚动条  messageScrollPane = new JScrollPane(messageShow,   JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,   JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);  messageScrollPane.setPreferredSize(new Dimension(400,400));  messageScrollPane.revalidate();    showStatus = new JTextField(35);  showStatus.setEditable(false);    sysMessage = new JTextField(24);  sysMessage.setEnabled(false);  sysMessageButton = new JButton();  sysMessageButton.setText("发送");
  //添加系统消息的事件侦听  sysMessage.addActionListener(this);  sysMessageButton.addActionListener(this);
  sendToLabel = new JLabel("发送至:");  messageLabel = new JLabel("发送消息:");  downPanel = new JPanel();  girdBag = new GridBagLayout();  downPanel.setLayout(girdBag);
  girdBagCon = new GridBagConstraints();  girdBagCon.gridx = 0;  girdBagCon.gridy = 0;  girdBagCon.gridwidth = 3;  girdBagCon.gridheight = 2;  girdBagCon.ipadx = 5;  girdBagCon.ipady = 5;  JLabel none = new JLabel("    ");  girdBag.setConstraints(none,girdBagCon);  downPanel.add(none);
  girdBagCon = new GridBagConstraints();  girdBagCon.gridx = 0;  girdBagCon.gridy = 2;  girdBagCon.insets = new Insets(1,0,0,0);  girdBagCon.ipadx = 5;  girdBagCon.ipady = 5;  girdBag.setConstraints(sendToLabel,girdBagCon);  downPanel.add(sendToLabel);
  girdBagCon = new GridBagConstraints();  girdBagCon.gridx =1;  girdBagCon.gridy = 2;  girdBagCon.anchor = GridBagConstraints.LINE_START;  girdBag.setConstraints(combobox,girdBagCon);  downPanel.add(combobox);
  girdBagCon = new GridBagConstraints();  girdBagCon.gridx = 0;  girdBagCon.gridy = 3;  girdBag.setConstraints(messageLabel,girdBagCon);  downPanel.add(messageLabel);
  girdBagCon = new GridBagConstraints();  girdBagCon.gridx = 1;  girdBagCon.gridy = 3;  girdBag.setConstraints(sysMessage,girdBagCon);  downPanel.add(sysMessage);
  girdBagCon = new GridBagConstraints();  girdBagCon.gridx = 2;  girdBagCon.gridy = 3;  girdBag.setConstraints(sysMessageButton,girdBagCon);  downPanel.add(sysMessageButton);
  girdBagCon = new GridBagConstraints();  girdBagCon.gridx = 0;  girdBagCon.gridy = 4;  girdBagCon.gridwidth = 3;  girdBag.setConstraints(showStatus,girdBagCon);  downPanel.add(showStatus);
  contentPane.add(messageScrollPane,BorderLayout.CENTER);  contentPane.add(downPanel,BorderLayout.SOUTH);    //关闭程序时的操作  this.addWindowListener(   new WindowAdapter(){    public void windowClosing(WindowEvent e){     stopService();     System.exit(0);    }   }  ); }
 /**  * 事件处理  */ public void actionPerformed(ActionEvent e) {  Object obj = e.getSource();  if (obj == startServer || obj == startItem) { //启动服务端   startService();  }  else if (obj == stopServer || obj == stopItem) { //停止服务端   int j=JOptionPane.showConfirmDialog(    this,"真的停止服务吗?","停止服务",    JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);      if (j == JOptionPane.YES_OPTION){    stopService();   }  }  else if (obj == portSet || obj == portItem) { //端口设置   //调出端口设置的对话框   PortConf portConf = new PortConf(this);   portConf.show();  }  else if (obj == exitButton || obj == exitItem) { //退出程序   int j=JOptionPane.showConfirmDialog(    this,"真的要退出吗?","退出",    JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);      if (j == JOptionPane.YES_OPTION){    stopService();    System.exit(0);   }  }  else if (obj == helpItem) { //菜单栏中的帮助   //调出帮助对话框   Help helpDialog = new Help(this);   helpDialog.show();  }  else if (obj == sysMessage || obj == sysMessageButton) { //发送系统消息   sendSystemMessage();  } }  /**  * 启动服务端  */ public void startService(){  try{   serverSocket = new ServerSocket(port,10);   messageShow.append("服务端已经启动,在"+port+"端口侦听...\n");      startServer.setEnabled(false);   startItem.setEnabled(false);   portSet.setEnabled(false);   portItem.setEnabled(false);
   stopServer .setEnabled(true);   stopItem .setEnabled(true);   sysMessage.setEnabled(true);  }  catch (Exception e){   //System.out.println(e);  }  userLinkList = new UserLinkList();    listenThread = new ServerListen(serverSocket,combobox,   messageShow,showStatus,userLinkList);  listenThread.start(); }  /**  * 关闭服务端  */ public void stopService(){  try{   //向所有人发送服务器关闭的消息   sendStopToAll();   listenThread.isStop = true;   serverSocket.close();      int count = userLinkList.getCount();      int i =0;   while( i < count){    Node node = userLinkList.findUser(i);        node.input .close();    node.output.close();    node.socket.close();        i ++;   }
   stopServer .setEnabled(false);   stopItem .setEnabled(false);   startServer.setEnabled(true);   startItem.setEnabled(true);   portSet.setEnabled(true);   portItem.setEnabled(true);   sysMessage.setEnabled(false);
   messageShow.append("服务端已经关闭\n");
   combobox.removeAllItems();   combobox.addItem("所有人");  }  catch(Exception e){   //System.out.println(e);  } }  /**  * 向所有人发送服务器关闭的消息  */ public void sendStopToAll(){  int count = userLinkList.getCount();    int i = 0;  while(i < count){   Node node = userLinkList.findUser(i);   if(node == null) {    i ++;    continue;   }      try{    node.output.writeObject("服务关闭");    node.output.flush();   }   catch (Exception e){    //System.out.println("$$"+e);   }      i++;  } }  /**  * 向所有人发送消息  */ public void sendMsgToAll(String msg){  int count = userLinkList.getCount();//用户总数    int i = 0;  while(i < count){   Node node = userLinkList.findUser(i);   if(node == null) {    i ++;    continue;   }      try{    node.output.writeObject("系统信息");    node.output.flush();    node.output.writeObject(msg);    node.output.flush();   }   catch (Exception e){    //System.out.println("@@@"+e);   }      i++;  }
  sysMessage.setText(""); }
 /**  * 向客户端用户发送消息  */ public void sendSystemMessage(){  String toSomebody = combobox.getSelectedItem().toString();  String message = sysMessage.getText() + "\n";    messageShow.append(message);    //向所有人发送消息  if(toSomebody.equalsIgnoreCase("所有人")){   sendMsgToAll(message);  }  else{   //向某个用户发送消息   Node node = userLinkList.findUser(toSomebody);      try{    node.output.writeObject("系统信息");    node.output.flush();    node.output.writeObject(message);    node.output.flush();   }   catch(Exception e){    //System.out.println("!!!"+e);   }   sysMessage.setText("");//将发送消息栏的消息清空  } }
 /**  * 通过给定的文件名获得图像  */ Image getImage(String filename) {  URLClassLoader urlLoader = (URLClassLoader)this.getClass().   getClassLoader();  URL url = null;  Image image = null;  url = urlLoader.findResource(filename);  image = Toolkit.getDefaultToolkit().getImage(url);  MediaTracker mediatracker = new MediaTracker(this);  try {   mediatracker.addImage(image, 0);   mediatracker.waitForID(0);  }  catch (InterruptedException _ex) {   image = null;  }  if (mediatracker.isErrorID(0)) {   image = null;  }
  return image; }
 public static void main(String[] args) {  ChatServer app = new ChatServer(); }}150
 
 java聊天室源代码import java.awt.*;import javax.swing.border.*;import java.net.*;import javax.swing.*;import java.awt.event.*;
/** * 生成设置对话框的类 */public class Help extends JDialog {
 JPanel titlePanel = new JPanel(); JPanel contentPanel = new JPanel(); JPanel closePanel = new JPanel();
 JButton close = new JButton(); JLabel title = new JLabel("聊天室服务端帮助"); JTextArea help = new JTextArea();
 Color bg = new Color(255,255,255);
 public Help(JFrame frame) {  super(frame, true);  try {   jbInit();  }  catch (Exception e) {   e.printStackTrace();  }  //设置运行位置,使对话框居中  Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();  this.setLocation( (int) (screenSize.width - 400) / 2,      (int) (screenSize.height - 320) / 2);  this.setResizable(false); }
 private void jbInit() throws Exception {  this.setSize(new Dimension(400, 200));  this.setTitle("帮助");    titlePanel.setBackground(bg);;  contentPanel.setBackground(bg);  closePanel.setBackground(bg);    help.setText("1、设置服务端的侦听端口(默认端口为8888)。\n"+   "2、点击 启动服务 按钮便可在指定的端口启动服务。\n"+   "3、选择需要接受消息的用户,在消息栏中写入消息,之后便可发送消息。\n"+   "4、信息状态栏中显示服务器当前的启动与停止状态、"+   "用户发送的消息和\n      服务器端发送的系统消息。");  help.setEditable(false);
  titlePanel.add(new Label("              "));  titlePanel.add(title);  titlePanel.add(new Label("              "));
  contentPanel.add(help);
  closePanel.add(new Label("              "));  closePanel.add(close);  closePanel.add(new Label("              "));
  Container contentPane = getContentPane();  contentPane.setLayout(new BorderLayout());  contentPane.add(titlePanel, BorderLayout.NORTH);  contentPane.add(contentPanel, BorderLayout.CENTER);  contentPane.add(closePanel, BorderLayout.SOUTH);
  close.setText("关闭");  //事件处理  close.addActionListener(   new ActionListener() {    public void actionPerformed(ActionEvent e) {     dispose();    }   }  ); }}
 
 java聊天室源代码import java.net.*;import java.io.*;
/** * 用户链表的结点类 */public class Node { String username = null; Socket socket = null; ObjectOutputStream output = null; ObjectInputStream input = null;   Node next = null;}import java.awt.*;import javax.swing.border.*;import java.net.*;import javax.swing.*;import java.awt.event.*;
/** * 生成端口设置对话框的类 */public class PortConf extends JDialog { JPanel panelPort = new JPanel(); JButton save = new JButton(); JButton cancel = new JButton(); public static JLabel DLGINFO=new JLabel(  "                              默认端口号为:8888");
 JPanel panelSave = new JPanel(); JLabel message = new JLabel();
 public static JTextField portNumber ;
 public PortConf(JFrame frame) {  super(frame, true);  try {   jbInit();  }  catch (Exception e) {   e.printStackTrace();  }  //设置运行位置,使对话框居中  Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();  this.setLocation( (int) (screenSize.width - 400) / 2 + 50,      (int) (screenSize.height - 600) / 2 + 150);  this.setResizable(false); }
 private void jbInit() throws Exception {  this.setSize(new Dimension(300, 120));  this.setTitle("端口设置");  message.setText("请输入侦听的端口号:");  portNumber = new JTextField(10);  portNumber.setText(""+ChatServer.port);  save.setText("保存");  cancel.setText("取消");
  panelPort.setLayout(new FlowLayout());  panelPort.add(message);  panelPort.add(portNumber);
  panelSave.add(new Label("              "));  panelSave.add(save);  panelSave.add(cancel);  panelSave.add(new Label("              "));
  Container contentPane = getContentPane();  contentPane.setLayout(new BorderLayout());  contentPane.add(panelPort, BorderLayout.NORTH);  contentPane.add(DLGINFO, BorderLayout.CENTER);  contentPane.add(panelSave, BorderLayout.SOUTH);
  //保存按钮的事件处理  save.addActionListener(   new ActionListener() {    public void actionPerformed (ActionEvent a) {     int savePort;     try{lwfree.cn       return;      }      ChatServer.port = savePort;      dispose();     }     catch(NumberFormatException e){      PortConf.DLGINFO.setText("                错误的端口号,端口号请填写整数!");      PortConf.portNumber.setText("");      return;     }    }   }  );
  //关闭对话框时的操作  this.addWindowListener(   new WindowAdapter(){    public void windowClosing(WindowEvent e){     DLGINFO.setText("                              默认端口号为:8888");    }   }  );
  //取消按钮的事件处理  cancel.addActionListener(   new ActionListener(){    public void actionPerformed(ActionEvent e){     DLGINFO.setText("                              默认端口号为:8888");     dispose();    }   }  ); }}
 

 java聊天室源代码import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;
import java.io.*;import java.net.*;
/* * 服务端的侦听类 */www.lwfree.cn UserLinkList userLinkList;//用户链表  Node client; ServerReceive recvThread;  public boolean isStop;
 /*  * 聊天服务端的用户上线于下线侦听类  */ public ServerListen(ServerSocket server,JComboBox combobox,  JTextArea textarea,JTextField textfield,UserLinkList userLinkList){
  this.server = server;  this.combobox = combobox;  this.textarea = textarea;  this.textfield = textfield;  this.userLinkList = userLinkList;    isStop = false; }  public void run(){  while(!isStop && !server.isClosed()){   try{    client = new Node();    client.socket = server.accept();    client.output = new ObjectOutputStream(client.socket.getOutputStream());    client.output.flush();    client.input  = new ObjectInputStream(client.socket.getInputStream());    client.username = (String)client.input.readObject();        //显示提示信息    combobox.addItem(client.username);    userLinkList.addUser(client);    textarea.append("用户 " + client.username + " 上线" + "\n");    textfield.setText("在线用户" + userLinkList.getCount() + "人\n");        recvThread = new ServerReceive(textarea,textfield,     combobox,client,userLinkList);    recvThread.start();   }   catch(Exception e){   }  } }}"
 
 java聊天室源代码import javax.swing.*;import java.io.*;import java.net.*;
/* * 服务器收发消息的类 */public class ServerReceive extends Thread { JTextArea textarea; JTextField textfield; JComboBox combobox; Node client; UserLinkList userLinkList;//用户链表  public boolean isStop;  public ServerReceive(JTextArea textarea,JTextField textfield,  JComboBox combobox,Node client,UserLinkList userLinkList){
  this.textarea = textarea;  this.textfield = textfield;  this.client = client;  this.userLinkList = userLinkList;  this.combobox = combobox;    isStop = false; }  public void run(){  //向所有人发送用户的列表  sendUserList();    while(!isStop && !client.socket.isClosed()){   try{    String type = (String)client.input.readObject();        if(type.equalsIgnoreCase("聊天信息")){     String toSomebody = (String)client.input.readObject();     String status  = (String)client.input.readObject();     String action  = (String)client.input.readObject();     String message = (String)client.input.readObject();          String msg = client.username        +" "+ action       + "对 "       + toSomebody        + " 说 : "       + message       + "\n";     if(status.equalsIgnoreCase("悄悄话")){      msg = " [悄悄话] " + msg;     }     textarea.append(msg);          if(toSomebody.equalsIgnoreCase("所有人")){      sendToAll(msg);//向所有人发送消息     }     else{      try{       client.output.writeObject("聊天信息");       client.output.flush();       client.output.writeObject(msg);       client.output.flush();      }      catch (Exception e){       //System.out.println("###"+e);      }            Node node = userLinkList.findUser(toSomebody);            if(node != null){       node.output.writeObject("聊天信息");        node.output.flush();       node.output.writeObject(msg);       node.output.flush();      }     }    }    else if(type.equalsIgnoreCase("用户下线")){     Node node = userLinkList.findUser(client.username);     userLinkList.delUser(node);          String msg = "用户 " + client.username + " 下线\n";     int count = userLinkList.getCount();
     combobox.removeAllItems();     combobox.addItem("所有人");     int i = 0;     while(i < count){      node = userLinkList.findUser(i);      if(node == null) {       i ++;       continue;      }          combobox.addItem(node.username);      i++;     }     combobox.setSelectedIndex(0);
     textarea.append(msg);     textfield.setText("在线用户" + userLinkList.getCount() + "人\n");          sendToAll(msg);//向所有人发送消息     sendUserList();//重新发送用户列表,刷新          break;    }   }   catch (Exception e){    //System.out.println(e);   }  } }  /*  * 向所有人发送消息  */ public void sendToAll(String msg){  int count = userLinkList.getCount();    int i = 0;  while(i < count){   Node node = userLinkList.findUser(i);   if(node == null) {    i ++;    continue;   }      try{    node.output.writeObject("聊天信息");    node.output.flush();    node.output.writeObject(msg);    node.output.flush();   }   catch (Exception e){    //System.out.println(e);   }      i++;  } }  /*  * 向所有人发送用户的列表  */ public void sendUserList(){  String userlist = "";  int count = userLinkList.getCount();
  int i = 0;  while(i < count){   Node node = userLinkList.findUser(i);   if(node == null) {    i ++;    continue;   }      userlist += node.username;   userlist += '\n';   i++;  }    i = 0;  while(i < count){   Node node = userLinkList.findUser(i);   if(node == null) {    i ++;    continue;   }       try{    node.output.writeObject("用户列表");    node.output.flush();    node.output.writeObject(userlist);    node.output.flush();   }   catch (Exception e){    //System.out.println(e);   }   i++;  } }}
 
java 推聊天室/** * 用户链表 */public class UserLinkList { Node root; Node pointer; int count;  /**  * 构造用户链表  */ public UserLinkList(){  root = new Node();  root.next = null;  pointer = null;  count = 0; }  /**  * 添加用户  */ public void addUser(Node n){  pointer = root;    while(pointer.next != null){   pointer = pointer.next;  }    pointer.next = n;  n.next = null;  count++;   }  /**  * 删除用户  */ public void delUser(Node n){  pointer = root;    while(pointer.next != null){   if(pointer.next == n){    pointer.next = n.next;    count --;        break;   }      pointer = pointer.next;  } }  /**  * 返回用户数  */ public int getCount(){  return count; }  /**  * 根据用户名查找用户  */ public Node findUser(String username){  if(count == 0) return null;    pointer = root;    while(pointer.next != null){   pointer = pointer.next;      if(pointer.username.equalsIgnoreCase(username)){    return pointer;   }  }    return null; }  /**  * 根据索引查找用户  */ public Node findUser(int index){  if(count == 0) {   return null;  }    if(index <  0) {   return null;  }    pointer = root;    int i = 0;  while(i < index + 1){   if(pointer.next != null){    pointer = pointer.next;   }   else{    return null;   }      i++;  }    return pointer; }}
 
 java聊天室代码import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;import java.io.*;import java.net.*;
/* * 聊天客户端的主框架类 */public class ChatClient extends JFrame implements ActionListener{
 String ip = "127.0.0.1";//连接到服务端的ip地址 int port = 8888;//连接到服务端的端口号 String userName = "匆匆过客";//用户名 int type = 0;//0表示未连接,1表示已连接
 Image icon;//程序图标 JComboBox combobox;//选择发送消息的接受者 JTextArea messageShow;//客户端的信息显示 JScrollPane messageScrollPane;//信息显示的滚动条
 JLabel express,sendToLabel,messageLabel ;
 JTextField clientMessage;//客户端消息的发送 JCheckBox checkbox;//悄悄话 JComboBox actionlist;//表情选择 JButton clientMessageButton;//发送消息 JTextField showStatus;//显示用户连接状态  Socket socket; ObjectOutputStream output;//网络套接字输出流 ObjectInputStream input;//网络套接字输入流  ClientReceive recvThread;
 //建立菜单栏 JMenuBar jMenuBar = new JMenuBar();  //建立菜单组 JMenu operateMenu = new JMenu ("操作(O)");  //建立菜单项 JMenuItem loginItem = new JMenuItem ("用户登录(I)"); JMenuItem logoffItem = new JMenuItem ("用户注销(L)"); JMenuItem exitItem=new JMenuItem ("退出(X)");
 JMenu conMenu=new JMenu ("设置(C)"); JMenuItem userItem=new JMenuItem ("用户设置(U)"); JMenuItem connectItem=new JMenuItem ("连接设置(C)");   JMenu helpMenu=new JMenu ("帮助(H)"); JMenuItem helpItem=new JMenuItem ("帮助(H)");
 //建立工具栏 JToolBar toolBar = new JToolBar(); //建立工具栏中的按钮组件 JButton loginButton;//用户登录 JButton logoffButton;//用户注销 JButton userButton;//用户信息的设置 JButton connectButton;//连接设置 JButton exitButton;//退出按钮
 //框架的大小 Dimension faceSize = new Dimension(400, 600);
 JPanel downPanel ; GridBagLayout girdBag; GridBagConstraints girdBagCon;  public ChatClient(){  init();//初始化程序
  //添加框架的关闭事件处理  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  this.pack();  //设置框架的大小  this.setSize(faceSize);
  //设置运行时窗口的位置  Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();  this.setLocation( (int) (screenSize.width - faceSize.getWidth()) / 2,       (int) (screenSize.height - faceSize.getHeight()) / 2);  this.setResizable(false);  this.setTitle("聊天室客户端"); //设置标题
  //程序图标  icon = getImage("icon.gif");  this.setIconImage(icon); //设置程序图标  show();
  //为操作菜单栏设置热键'V'  operateMenu.setMnemonic('O');
  //为用户登录设置快捷键为ctrl+i  loginItem.setMnemonic ('I');   loginItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_I,InputEvent.CTRL_MASK));
  //为用户注销快捷键为ctrl+l  logoffItem.setMnemonic ('L');   logoffItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_L,InputEvent.CTRL_MASK));
  //为退出快捷键为ctrl+x  exitItem.setMnemonic ('X');   exitItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_X,InputEvent.CTRL_MASK));
  //为设置菜单栏设置热键'C'  conMenu.setMnemonic('C');
  //为用户设置设置快捷键为ctrl+u  userItem.setMnemonic ('U');   userItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_U,InputEvent.CTRL_MASK));
  //为连接设置设置快捷键为ctrl+c  connectItem.setMnemonic ('C');   connectItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_C,InputEvent.CTRL_MASK));
  //为帮助菜单栏设置热键'H'  helpMenu.setMnemonic('H');
  //为帮助设置快捷键为ctrl+p  helpItem.setMnemonic ('H');   helpItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_H,InputEvent.CTRL_MASK)); }
 /**  * 程序初始化函数  */ public void init(){
  Container contentPane = getContentPane();  contentPane.setLayout(new BorderLayout());
  //添加菜单栏  operateMenu.add (loginItem);  operateMenu.add (logoffItem);  operateMenu.add (exitItem);  jMenuBar.add (operateMenu);   conMenu.add (userItem);  conMenu.add (connectItem);  jMenuBar.add (conMenu);  helpMenu.add (helpItem);  jMenuBar.add (helpMenu);   setJMenuBar (jMenuBar);
  //初始化按钮  loginButton = new JButton("登录");  logoffButton = new JButton("注销");  userButton  = new JButton("用户设置" );  connectButton  = new JButton("连接设置" );  exitButton = new JButton("退出" );  //当鼠标放上显示信息  loginButton.setToolTipText("连接到指定的服务器");  logoffButton.setToolTipText("与服务器断开连接");  userButton.setToolTipText("设置用户信息");  connectButton.setToolTipText("设置所要连接到的服务器信息");  //将按钮添加到工具栏  toolBar.add(userButton);  toolBar.add(connectButton);  toolBar.addSeparator();//添加分隔栏  toolBar.add(loginButton);  toolBar.add(logoffButton);  toolBar.addSeparator();//添加分隔栏  toolBar.add(exitButton);  contentPane.add(toolBar,BorderLayout.NORTH);
  checkbox = new JCheckBox("悄悄话");  checkbox.setSelected(false);
  actionlist = new JComboBox();  actionlist.addItem("微笑地");  actionlist.addItem("高兴地");  actionlist.addItem("轻轻地");  actionlist.addItem("生气地");  actionlist.addItem("小心地");  actionlist.addItem("静静地");  actionlist.setSelectedIndex(0);
  //初始时  loginButton.setEnabled(true);  logoffButton.setEnabled(false);
  //为菜单栏添加事件监听  loginItem.addActionListener(this);  logoffItem.addActionListener(this);  exitItem.addActionListener(this);  userItem.addActionListener(this);  connectItem.addActionListener(this);  helpItem.addActionListener(this);    //添加按钮的事件侦听  loginButton.addActionListener(this);  logoffButton.addActionListener(this);  userButton.addActionListener(this);  connectButton.addActionListener(this);  exitButton.addActionListener(this);    combobox = new JComboBox();  combobox.insertItemAt("所有人",0);  combobox.setSelectedIndex(0);    messageShow = new JTextArea();  messageShow.setEditable(false);  //添加滚动条  messageScrollPane = new JScrollPane(messageShow,   JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,   JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);  messageScrollPane.setPreferredSize(new Dimension(400,400));  messageScrollPane.revalidate();    clientMessage = new JTextField(23);  clientMessage.setEnabled(false);  clientMessageButton = new JButton();  clientMessageButton.setText("发送");
  //添加系统消息的事件侦听  clientMessage.addActionListener(this);  clientMessageButton.addActionListener(this);
  sendToLabel = new JLabel("发送至:");  express = new JLabel("         表情:   ");  messageLabel = new JLabel("发送消息:");  downPanel = new JPanel();  girdBag = new GridBagLayout();  downPanel.setLayout(girdBag);
  girdBagCon = new GridBagConstraints();  girdBagCon.gridx = 0;  girdBagCon.gridy = 0;  girdBagCon.gridwidth = 5;  girdBagCon.gridheight = 2;  girdBagCon.ipadx = 5;  girdBagCon.ipady = 5;  JLabel none = new JLabel("    ");  girdBag.setConstraints(none,girdBagCon);  downPanel.add(none);
  girdBagCon = new GridBagConstraints();  girdBagCon.gridx = 0;  girdBagCon.gridy = 2;  girdBagCon.insets = new Insets(1,0,0,0);  //girdBagCon.ipadx = 5;  //girdBagCon.ipady = 5;  girdBag.setConstraints(sendToLabel,girdBagCon);  downPanel.add(sendToLabel);
  girdBagCon = new GridBagConstraints();  girdBagCon.gridx =1;  girdBagCon.gridy = 2;  girdBagCon.anchor = GridBagConstraints.LINE_START;  girdBag.setConstraints(combobox,girdBagCon);  downPanel.add(combobox);
  girdBagCon = new GridBagConstraints();  girdBagCon.gridx =2;  girdBagCon.gridy = 2;  girdBagCon.anchor = GridBagConstraints.LINE_END;  girdBag.setConstraints(express,girdBagCon);  downPanel.add(express);
  girdBagCon = new GridBagConstraints();  girdBagCon.gridx = 3;  girdBagCon.gridy = 2;  girdBagCon.anchor = GridBagConstraints.LINE_START;  //girdBagCon.insets = new Insets(1,0,0,0);  //girdBagCon.ipadx = 5;  //girdBagCon.ipady = 5;  girdBag.setConstraints(actionlist,girdBagCon);  downPanel.add(actionlist);
  girdBagCon = new GridBagConstraints();  girdBagCon.gridx = 4;  girdBagCon.gridy = 2;  girdBagCon.insets = new Insets(1,0,0,0);  //girdBagCon.ipadx = 5;  //girdBagCon.ipady = 5;  girdBag.setConstraints(checkbox,girdBagCon);  downPanel.add(checkbox);
  girdBagCon = new GridBagConstraints();  girdBagCon.gridx = 0;  girdBagCon.gridy = 3;  girdBag.setConstraints(messageLabel,girdBagCon);  downPanel.add(messageLabel);
  girdBagCon = new GridBagConstraints();  girdBagCon.gridx = 1;  girdBagCon.gridy = 3;  girdBagCon.gridwidth = 3;  girdBagCon.gridheight = 1;  girdBag.setConstraints(clientMessage,girdBagCon);  downPanel.add(clientMessage);
  girdBagCon = new GridBagConstraints();  girdBagCon.gridx = 4;  girdBagCon.gridy = 3;  girdBag.setConstraints(clientMessageButton,girdBagCon);  downPanel.add(clientMessageButton);
  showStatus = new JTextField(35);  showStatus.setEditable(false);  girdBagCon = new GridBagConstraints();  girdBagCon.gridx = 0;  girdBagCon.gridy = 5;  girdBagCon.gridwidth = 5;  girdBag.setConstraints(showStatus,girdBagCon);  downPanel.add(showStatus);
  contentPane.add(messageScrollPane,BorderLayout.CENTER);  contentPane.add(downPanel,BorderLayout.SOUTH);    //关闭程序时的操作  this.addWindowListener(   new WindowAdapter(){    public void windowClosing(WindowEvent e){     if(type == 1){      DisConnect();     }     System.exit(0);    }   }  ); }
 /**  * 事件处理  */ public void actionPerformed(ActionEvent e) {  Object obj = e.getSource();    if (obj == userItem || obj == userButton) { //用户信息设置   //调出用户信息设置对话框   UserConf userConf = new UserConf(this,userName);   userConf.show();   userName = userConf.userInputName;  }  else if (obj == connectItem || obj == connectButton) { //连接服务端设置   //调出连接设置对话框   ConnectConf conConf = new ConnectConf(this,ip,port);   conConf.show();   ip = conConf.userInputIp;   port = conConf.userInputPort;  }  else if (obj == loginItem || obj == loginButton) { //登录   Connect();  }  else if (obj == logoffItem || obj == logoffButton) { //注销   DisConnect();   showStatus.setText("");  }  else if (obj == clientMessage || obj == clientMessageButton) { //发送消息   SendMessage();   clientMessage.setText("");  }  else if (obj == exitButton || obj == exitItem) { //退出   int j=JOptionPane.showConfirmDialog(    this,"真的要退出吗?","退出",    JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);      if (j == JOptionPane.YES_OPTION){    if(type == 1){     DisConnect();    }    System.exit(0);   }  }  else if (obj == helpItem) { //菜单栏中的帮助   //调出帮助对话框   Help helpDialog = new Help(this);   helpDialog.show();  } }
  public void Connect(){  try{   socket = new Socket(ip,port);  }  catch (Exception e){   JOptionPane.showConfirmDialog(    this,"不能连接到指定的服务器。\n请确认连接设置是否正确。","提示",    JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);   return;  }
  try{   output = new ObjectOutputStream(socket.getOutputStream());   output.flush();   input  = new ObjectInputStream(socket.getInputStream() );      output.writeObject(userName);   output.flush();      recvThread = new ClientReceive(socket,output,input,combobox,messageShow,showStatus);   recvThread.start();      loginButton.setEnabled(false);   loginItem.setEnabled(false);   userButton.setEnabled(false);   userItem.setEnabled(false);   connectButton.setEnabled(false);   connectItem.setEnabled(false);   logoffButton.setEnabled(true);   logoffItem.setEnabled(true);   clientMessage.setEnabled(true);   messageShow.append("连接服务器 "+ip+":"+port+" 成功...\n");   type = 1;//标志位设为已连接  }  catch (Exception e){   System.out.println(e);   return;  } }  public void DisConnect(){  loginButton.setEnabled(true);  loginItem.setEnabled(true);  userButton.setEnabled(true);  userItem.setEnabled(true);  connectButton.setEnabled(true);  connectItem.setEnabled(true);  logoffButton.setEnabled(false);  logoffItem.setEnabled(false);  clientMessage.setEnabled(false);    if(socket.isClosed()){   return ;  }    try{   output.writeObject("用户下线");   output.flush();     input.close();   output.close();   socket.close();   messageShow.append("已经与服务器断开连接...\n");   type = 0;//标志位设为未连接  }  catch (Exception e){   //  } }  public void SendMessage(){  String toSomebody = combobox.getSelectedItem().toString();  String status  = "";  if(checkbox.isSelected()){   status = "悄悄话";  }    String action = actionlist.getSelectedItem().toString();  String message = clientMessage.getText();    if(socket.isClosed()){   return ;  }    try{   output.writeObject("聊天信息");   output.flush();   output.writeObject(toSomebody);   output.flush();   output.writeObject(status);   output.flush();   output.writeObject(action);   output.flush();   output.writeObject(message);   output.flush();  }  catch (Exception e){   //  } }
 /**  * 通过给定的文件名获得图像  */ Image getImage(String filename) {  URLClassLoader urlLoader = (URLClassLoader)this.getClass().   getClassLoader();  URL url = null;  Image image = null;  url = urlLoader.findResource(filename);  image = Toolkit.getDefaultToolkit().getImage(url);  MediaTracker mediatracker = new MediaTracker(this);  try {   mediatracker.addImage(image, 0);   mediatracker.waitForID(0);  }  catch (InterruptedException _ex) {   image = null;  }  if (mediatracker.isErrorID(0)) {   image = null;  }
  return image; }
 public static void main(String[] args) {  ChatClient app = new ChatClient(); }}
 

 java聊天室代码import javax.swing.*;import java.io.*;import java.net.*;
/* * 聊天客户端消息收发类 */public class ClientReceive extends Thread { private JComboBox combobox; private JTextArea textarea;  Socket socket; ObjectOutputStream output; ObjectInputStream  input; JTextField showStatus;
 public ClientReceive(Socket socket,ObjectOutputStream output,  ObjectInputStream  input,JComboBox combobox,JTextArea textarea,JTextField showStatus){
  this.socket = socket;  this.output = output;  this.input = input;  this.combobox = combobox;  this.textarea = textarea;  this.showStatus = showStatus; }  public void run(){  while(!socket.isClosed()){   try{    String type = (String)input.readObject();        if(type.equalsIgnoreCase("系统信息")){     String sysmsg = (String)input.readObject();     textarea.append("系统信息: "+sysmsg);    }    else if(type.equalsIgnoreCase("服务关闭")){     output.close();     input.close();     socket.close();          textarea.append("服务器已关闭!\n");          break;    }    else if(type.equalsIgnoreCase("聊天信息")){     String message = (String)input.readObject();     textarea.append(message);    }    else if(type.equalsIgnoreCase("用户列表")){     String userlist = (String)input.readObject();     String usernames[] = userlist.split("\n");     combobox.removeAllItems();          int i =0;     combobox.addItem("所有人");     while(i < usernames.length){      combobox.addItem(usernames[i]);      i ++;     }     combobox.setSelectedIndex(0);     showStatus.setText("在线用户 " + usernames.length + " 人");    }   }   catch (Exception e ){    System.out.println(e);   }  } }}
 

 java聊天室代码import java.awt.*;import javax.swing.border.*;import java.net.*;import javax.swing.*;import java.awt.event.*;
/** * 生成连接信息输入的对话框 * 让用户输入连接服务器的IP和端口 */public class ConnectConf extends JDialog { JPanel panelUserConf = new JPanel(); JButton save = new JButton(); JButton cancel = new JButton(); JLabel DLGINFO=new JLabel(  "                  默认连接设置为  127.0.0.1:8888");
 JPanel panelSave = new JPanel(); JLabel message = new JLabel();
 String userInputIp; int userInputPort;
 JTextField inputIp; JTextField inputPort;
 public ConnectConf(JFrame frame,String ip,int port) {  super(frame, true);  this.userInputIp = ip;  this.userInputPort = port;  try {   jbInit();  }  catch (Exception e) {   e.printStackTrace();  }  //设置运行位置,使对话框居中  Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();  this.setLocation( (int) (screenSize.width - 400) / 2 + 50,      (int) (screenSize.height - 600) / 2 + 150);  this.setResizable(false); }
 private void jbInit() throws Exception {  this.setSize(new Dimension(300, 130));  this.setTitle("连接设置");  message.setText(" 请输入服务器的IP地址:");  inputIp = new JTextField(10);  inputIp.setText(userInputIp);  inputPort = new JTextField(4);  inputPort.setText(""+userInputPort);  save.setText("保存");  cancel.setText("取消");
  panelUserConf.setLayout(new GridLayout(2,2,1,1));  panelUserConf.add(message);  panelUserConf.add(inputIp);  panelUserConf.add(new JLabel(" 请输入服务器的端口号:"));  panelUserConf.add(inputPort);
  panelSave.add(new Label("              "));  panelSave.add(save);  panelSave.add(cancel);  panelSave.add(new Label("              "));
  Container contentPane = getContentPane();  contentPane.setLayout(new BorderLayout());  contentPane.add(panelUserConf, BorderLayout.NORTH);  contentPane.add(DLGINFO, BorderLayout.CENTER);  contentPane.add(panelSave, BorderLayout.SOUTH);
  //保存按钮的事件处理  save.addActionListener(   new ActionListener() {    public void actionPerformed (ActionEvent a) {     int savePort;     String inputIP;     //判断端口号是否合法     try{      userInputIp = "" + InetAddress.getByName(inputIp.getText());      userInputIp = userInputIp.substring(1);     }     catch(UnknownHostException e){      DLGINFO.setText(       "                                    错误的IP地址!");
      return;     }     //userInputIp = inputIP;
     //判断端口号是否合法     try{      savePort = Integer.parseInt(inputPort.getText());
      if(savePort<1 || savePort>65535){       DLGINFO.setText("               侦听端口必须是0-65535之间的整数!");       inputPort.setText("");       return;      }      userInputPort = savePort;      dispose();     }     catch(NumberFormatException e){      DLGINFO.setText("                错误的端口号,端口号请填写整数!");      inputPort.setText("");      return;     }    }   }  );
  //关闭对话框时的操作  this.addWindowListener(   new WindowAdapter(){    public void windowClosing(WindowEvent e){     DLGINFO.setText("                  默认连接设置为  127.0.0.1:8888");    }   }  );
  //取消按钮的事件处理  cancel.addActionListener(   new ActionListener(){    public void actionPerformed(ActionEvent e){     DLGINFO.setText("                  默认连接设置为  127.0.0.1:8888");     dispose();    }   }  ); }}
 

java编写聊天室import java.awt.*;import javax.swing.border.*;import java.net.*;import javax.swing.*;import java.awt.event.*;
/** * 生成设置对话框的类 */public class Help extends JDialog {
 JPanel titlePanel = new JPanel(); JPanel contentPanel = new JPanel(); JPanel closePanel = new JPanel();
 JButton close = new JButton(); JLabel title = new JLabel("聊天室客户端帮助"); JTextArea help = new JTextArea();
 Color bg = new Color(255,255,255);
 public Help(JFrame frame) {  super(frame, true);  try {   jbInit();  }  catch (Exception e) {   e.printStackTrace();  }  //设置运行位置,使对话框居中  Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();  this.setLocation( (int) (screenSize.width - 400) / 2 + 25,      (int) (screenSize.height - 320) / 2);  this.setResizable(false); }
 private void jbInit() throws Exception {  this.setSize(new Dimension(350, 270));  this.setTitle("帮助");    titlePanel.setBackground(bg);;  contentPanel.setBackground(bg);  closePanel.setBackground(bg);    help.setText("1、设置所要连接服务端的IP地址和端口"+   "(默认设置为\n      127.0.0.1:8888)。\n"+   "2、输入你的用户名(默认设置为:匆匆过客)。\n"+   "3、点击“登录”便可以连接到指定的服务器;\n"+   "      点击“注销”可以和服务器端开连接。\n"+   "4、选择需要接受消息的用户,在消息栏中写入消息,\n"+   "      同时选择表情,之后便可发送消息。\n");  help.setEditable(false);
  titlePanel.add(new Label("              "));  titlePanel.add(title);  titlePanel.add(new Label("              "));
  contentPanel.add(help);
  closePanel.add(new Label("              "));  closePanel.add(close);  closePanel.add(new Label("              "));
  Container contentPane = getContentPane();  contentPane.setLayout(new BorderLayout());  contentPane.add(titlePanel, BorderLayout.NORTH);  contentPane.add(contentPanel, BorderLayout.CENTER);  contentPane.add(closePanel, BorderLayout.SOUTH);
  close.setText("关闭");  //事件处理  close.addActionListener(   new ActionListener() {    public void actionPerformed(ActionEvent e) {     dispose();    }   }  ); }}
 

java编写聊天室import java.awt.*;import javax.swing.border.*;import java.net.*;import javax.swing.*;import java.awt.event.*;
/** * 生成用户信息输入对话框的类 * 让用户输入自己的用户名 */public class UserConf extends JDialog { JPanel panelUserConf = new JPanel(); JButton save = new JButton(); JButton cancel = new JButton(); JLabel DLGINFO=new JLabel(  "                         默认用户名为:匆匆过客");
 JPanel panelSave = new JPanel(); JLabel message = new JLabel(); String userInputName;
 JTextField userName ;
 public UserConf(JFrame frame,String str) {  super(frame, true);  this.userInputName = str;  try {   jbInit();  }  catch (Exception e) {   e.printStackTrace();  }  //设置运行位置,使对话框居中  Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();  this.setLocation( (int) (screenSize.width - 400) / 2 + 50,      (int) (screenSize.height - 600) / 2 + 150);  this.setResizable(false); }
 private void jbInit() throws Exception {  this.setSize(new Dimension(300, 120));  this.setTitle("用户设置");  message.setText("请输入用户名:");  userName = new JTextField(10);  userName.setText(userInputName);  save.setText("保存");  cancel.setText("取消");
  panelUserConf.setLayout(new FlowLayout());  panelUserConf.add(message);  panelUserConf.add(userName);
  panelSave.add(new Label("              "));  panelSave.add(save);  panelSave.add(cancel);  panelSave.add(new Label("              "));
  Container contentPane = getContentPane();www.lwfree.cn   new ActionListener() {    public void actionPerformed (ActionEvent a) {     if(userName.getText().equals("")){      DLGINFO.setText(       "                                 用户名不能为空!");      userName.setText(userInputName);      return;     }     else if(userName.getText().length() > 15){      DLGINFO.setText("                    用户名长度不能大于15个字符!");      userName.setText(userInputName);      return;     }     userInputName = userName.getText();     dispose();    }   }  );
  //关闭对话框时的操作  this.addWindowListener(   new WindowAdapter(){    public void windowClosing(WindowEvent e){     DLGINFO.setText("                         默认用户名为:匆匆过客");    }   }  );
  //取消按钮的事件处理  cancel.addActionListener(   new ActionListener(){    public void actionPerformed(ActionEvent e){     DLGINFO.setText("                         默认用户名为:匆匆过客");     dispose();    }   }  ); }}
  • 上一篇资讯: java游戏连连看
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师