当前位置:  技术问答>java相关

请高手帮我编译一下这个文件,50分相谢!!

    来源: 互联网  发布时间:2015-01-04

    本文导语:  我用jBuilder4居然不能编译这个java文件,求高手指教........ /*源程序清单5-22*/ import java.net.*; import java.awt.*; import java.awt.event.*; import java.applet.*; import javax.swing.*; import com.borland.jbcl.layout.*; import java.io.*; import java.util.*...

我用jBuilder4居然不能编译这个java文件,求高手指教........
/*源程序清单5-22*/
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;
import com.borland.jbcl.layout.*;
import java.io.*;
import java.util.*;
public class TalkApplet extends JApplet implements Runnable
{
  boolean isStandalone = false;
  Label userInfo = new Label();
  TextField userText = new TextField();
  Label label1 = new Label();
  TextArea messageText = new TextArea();
  Button sendButton = new Button();
  java.awt.List userList = new java.awt.List();

  URL chatURL;
  URLConnection connect;
  //用于标识用户是否登录
  boolean loggedin=false;
  String username;
  Thread pollThread=null;
  PaneLayout paneLayout1 = new PaneLayout();


  /**Get a parameter value*/
  public String getParameter(String key, String def)
  {
    return isStandalone ? System.getProperty(key, def) :
      (getParameter(key) != null ? getParameter(key) : def);
  }
  /**Construct the applet*/
  public TalkApplet()
  {
  }
  /**Initialize the applet*/
  public void init()
  {
    try
    {
      jbInit();
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
  }
  /**Component initialization*/
  private void jbInit() throws Exception {
    if(pollThread!=null)
      return;
    userInfo.setText("请输入用户名(请不要超过10个字符):");
    this.setSize(new Dimension(400,300));
    this.getContentPane().setLayout(paneLayout1);
    label1.setText("聊天内容:");
    messageText.setEditable(false);
    sendButton.setLabel("发送");
    sendButton.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        sendButton_actionPerformed(e);
      }
    });
    userText.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        userText_actionPerformed(e);
      }
    });
    this.getContentPane().add(userInfo, new PaneConstraints("userInfo", "userInfo", PaneConstraints.ROOT, 1.0f));
    this.getContentPane().add(userText, new PaneConstraints("userText", "userInfo", PaneConstraints.BOTTOM, 0.9166667f));
    this.getContentPane().add(messageText, new PaneConstraints("messageText", "userText", PaneConstraints.BOTTOM, 0.90181816f));
    this.getContentPane().add(userList, new PaneConstraints("userList", "messageText", PaneConstraints.TOP, 0.24193548f));
    this.getContentPane().add(sendButton, new PaneConstraints("sendButton", "userList", PaneConstraints.LEFT, 0.6125f));
    this.getContentPane().add(label1, new PaneConstraints("label1", "sendButton", PaneConstraints.BOTTOM, 0.6f));
    chatURL=getCodeBase();
    int currPriority=Thread.currentThread().getPriority();
    int newPriority=currPriority==Thread.MIN_PRIORITY?Thread.MIN_PRIORITY:currPriority-1;
    pollThread=new Thread(this,"talkPoll");
    pollThread.setDaemon(true);
    pollThread.setPriority(newPriority);
    pollThread.start();
  }

  /**Get Applet information*/
  public String getAppletInfo()
  {
    return "Applet Information";
  }
  /**Get parameter info*/
  public String[][] getParameterInfo()
  {
    return null;
  }

  public synchronized void start()
  {
    if(!isLoggedin()&&username!=null)
      login();
    if(pollThread!=null&&pollThread.isAlive())
    {
      pollThread.resume();
    }
    else
    {
      pollThread=new Thread(this,"talkPoll");
      pollThread.setDaemon(true);
      pollThread.start();
    }
  }
  //当Applet在浏览器中不可见时,就挂起线程pollthread,并退出"聊天室"
  public synchronized void stop()
  {
    if (pollThread.isAlive())
    {
      pollThread.suspend();
    }
    logout();
  }

  public synchronized void destroy()
  {
    if (pollThread != null && pollThread.isAlive())
    {
       pollThread.stop();
       pollThread = null;
     }
     logout();
  }

  //每隔3秒从服务器中取别的用户输入的信息和加入聊天室的用户
  public void run()
  {
    while (!Thread.interrupted())
    {
//若用户已经登陆,则不时的取回别的用户输入的信息
//和机如的的用户名
if (isLoggedin())
{
  pollList();
  poll();
}
//若没有用户登陆,则取回正在聊天室中的用户
else
{
  pollList();
}
try
{
  //睡眠3秒钟
  Thread.sleep(1000*3);
}
catch (InterruptedException e)
{
}
      }
    }

  //登陆到服务器
  private void login()
  {
     if (username ==null) return;
     String queryString = "chatservlet?mode=login&user="+URLEncoder.encode(username);
     //与服务器通信
     try
     {
connect = (new URL(/tech-qa-java/chatURL,queryString/index.html)).openConnection();
connect.setDefaultUseCaches(false);
connect.setUseCaches(false);
connect.setDoInput(true);
connect.setDoOutput(false);
connect.connect();
DataInputStream in = new DataInputStream(connect.getInputStream());
String response = in.readLine();
if (response.startsWith("+"))
{
  //标识用户已经登陆
  setLoggedin(true);
  showStatus("登录用户名:" + username);
  //提示用户输入信息
  userInfo.setText("请输入你需要发送的信息:");
  repaint();
}
else
{
  showStatus("Error logging in " + response);
  System.err.println("Error logging in " + response);
}
    }
    catch (MalformedURLException e2)
    {
System.err.println("MalformedURLException logging in!");
e2.printStackTrace(System.err);
showStatus("Error logging in!");
    }
    catch (IOException e1)
    {
System.err.println("IOException logging in!");
e1.printStackTrace(System.err);
showStatus("Error logging in!");
    }
  }

//退出聊天室
  private void logout()
  {
    if (!isLoggedin() || username ==null)
    {
return;
    }
    String queryString = "chatservlet?mode=logout&username=" +URLEncoder.encode(username);
    //与服务器通信
    try
    {
connect = (new URL(/tech-qa-java/chatURL,queryString/index.html)).openConnection();
connect.setUseCaches(false);
connect.setDoInput(true);
connect.setDoOutput(false);
connect.connect();
DataInputStream in = new DataInputStream(connect.getInputStream());
String response = in.readLine();
if (response.startsWith("+"))
{
  //标识用户已经退出聊天室
  setLoggedin(false);
     showStatus(username + "离开聊天室!");
}
else
{
  showStatus("Error logging out" + response);
  System.err.println("Error logging out" + response);
}
    }
    catch (MalformedURLException e2)
    {
System.err.println("MalformedURLException logging out!");
e2.printStackTrace(System.err);
showStatus("Error logging out!");
    }
    catch (IOException e1)
    {
System.err.println("IOException logging out!");
e1.printStackTrace(System.err);
showStatus("Error logging out!");
    }
   }

  //发送用户输入的信息
  private void send()
  {
    String message = userText.getText();
    //用户输入空字符串不发送
    if (message.equals(""))
    {
      return;
    }
    //清除用户在Applet中输入的内容
    userText.setText("");
    showStatus("发送信息!");
    String queryString = "chatservlet?mode=send&user="+URLEncoder.encode(username);
    queryString = queryString + "&message="+URLEncoder.encode(message);
    try
    {
      connect = (new URL(/tech-qa-java/chatURL,queryString/index.html)).openConnection();
      connect.setUseCaches(false);
      connect.setDoInput(true);
      connect.setDoOutput(false);
      connect.connect();
      DataInputStream in = new DataInputStream(connect.getInputStream());
      String response = in.readLine();
      if (response.startsWith("+"))
      {
     showStatus("信息发送出去了");
       }
      else
      {
showStatus("发送信息错误 " + response);
System.err.println("Error sending message " + response);
}
    }
    catch (MalformedURLException e2)
    {
      System.err.println("MalformedURLException logging in!");
      e2.printStackTrace(System.err);
      showStatus("Error logging in!");
     }
    catch (IOException e1)
    {
System.err.println("IOException logging in!");
e1.printStackTrace(System.err);
showStatus("Error logging in!");
    }
  }

  //返回所有用户输入的信息
  private void poll()
  {
    String queryString = "chatservlet?mode=poll&user=" +URLEncoder.encode(username);
    try
    {
DataInputStream in = new DataInputStream(
new URL(/tech-qa-java/chatURL,queryString/index.html).openStream());
String nextLine = in.readLine();
if (!nextLine.startsWith("+"))
{
  showStatus("Error getting messages from server!");
  System.err.println("Error getting messages from server!");
  return;
}
nextLine = in.readLine();
while (nextLine != null && !nextLine.equals("."))
{
  System.err.println(nextLine);
  messageText.appendText(nextLine + "rn");
  repaint();
  nextLine = in.readLine();
}
    }
    catch (IOException e)
    {
System.err.println("IOException poll!");
e.printStackTrace(System.err);
    }
  }

  //返回正在聊天室中的用户
  private void pollList()
  {
String queryString = "chatservlet?mode=list";
Vector users = new Vector();
try
  {
  URL listURL = new URL(/tech-qa-java/chatURL,queryString/index.html);
  URLConnection listConn = listURL.openConnection();
  listConn.setDefaultUseCaches(false);
  listConn.setUseCaches(false);
  listConn.connect();
  DataInputStream in = new DataInputStream(
  listConn.getInputStream());
  String nextLine = in.readLine();
  if (!nextLine.startsWith("+"))
  {
    showStatus("Error getting userlist from server!");
    return;
  }
  nextLine = in.readLine();
  while (nextLine != null && !nextLine.equals("."))
  {
    users.addElement(nextLine);
    nextLine = in.readLine();
   }
   //清除旧的用户表,加入新的
   if (!users.isEmpty())
   {
     userList.clear();
            int size = users.size();
     for (int I=0;I10)
{
     showStatus("请不要超过10个字符!");
}
else
{
  userText.setText("");
  login();
}
      }
  }

  void userText_actionPerformed(ActionEvent e)
  {
    sendText();
  }
}

|
错是没有错,从jdk1.2开始就对jdk1.1以前使用的一些事件进行了替换,尽管以前的某些事件仍可用,但会被报出warning,就象这句"TalkApplet.java": Warning #: 368 : method resume() in class java.lang.Thread has been deprecated at line 102, column 18
是说resume()事件已经不被推荐使用,类似的有Thread.stop、Thread.suspend.粘贴过来一篇文章,看了会有用的:
为什么不鼓励使用 Thread.stop、Thread.suspend和 Thread.resume? 

--------------------------------------------------------------------------------

为什么不鼓励使用 Thread.stop?
因为它本质上就是不安全的。停止线程会导致解锁它已锁定的所有监视程序(ThreadDeath 异常传播到栈上后即解锁监视程序)。如果这些监视程序前面保护的任何对象处于不一致状态,则其它线程即可能将这些对象视为处于不一致状态。我们将这种对象称为损坏的对象。当线程操作损坏的对象时,可能会产生任何意外的行为。这种行为可能很难觉察,也可能非常明显。与其它未检查的异常不同,ThreadDeath 将悄悄杀掉线程;这样,用户就不会得到其程序已被破坏的警告。这种破坏可能会在实际损坏发生之后的任何时间显示出来,甚至可能会在数小时或数天之后。 


--------------------------------------------------------------------------------

难道不能捕获 ThreadDeath 异常并修复被损坏的对象?
从理论上是可行的,但编写正确的多线程代码的任务将会相当复杂。该任务几乎是无法完成的,原因如下: 

线程可能会在几乎任何地方抛出 ThreadDeath 异常。所以必须在此基础上对所有的同步方法和块进行研究。 
线程可能会在清除第一个 ThreadDeath 异常(在 catch 或 finally 子句中)时抛出第二个异常。 因此必须重复清除直到它成功完成。实现这一点的代码将相当复杂。 
总之,上述意图是不切实际的。 


--------------------------------------------------------------------------------

对于 Thread.stop(Throwable) 又该怎样办?
除了上述所有问题之外,该方法还可能用来产生其目标线程尚不能处理的异常(包括离开该方法线程几乎不可能产生的已检查异常)。例如,下列方法的行为等同于 Java 的 throw 操作,但是绕过了编译器的下列尝试:即保证调用方法已经声明了它可能抛出的所有已检查异常:

    static void sneakyThrow(Throwable t) {
        Thread.currentThread().stop(t);
    }


--------------------------------------------------------------------------------

应该用什么来代替 Thread.stop?
大多数使用 stop 的情况都应该用简单修改一些变量以指示目标线程应停止运行的代码所代替。目标线程应该定期检查该变量,并在该变量指示需要它停止运行时以一种合理的方法从其 run 方法中返回(这是 JavaSoft 教程始终推荐的方法)。要确保停止请求的即时通讯,该变量必须是 volatile(迅变)的(或对该变量的访问必须是同步的)。 

例如,假定 applet 包含下列 start、stop 和 run 方法:

    private Thread blinker;

    public void start() {
        blinker = new Thread(this);
        blinker.start();
    }

    public void stop() {
        blinker.stop();  // 不安全!
    }

    public void run() {
        Thread thisThread = Thread.currentThread();
        while (true) {
            try {
                thisThread.sleep(interval);
            } catch (InterruptedException e){
            }
            repaint();
        }
    }

则可以通过用下列内容替代 applet 的 stop 和 run 方法来避免使用 Thread.stop:

    private volatile Thread blinker;

    public void stop() {
        blinker = null;
    }

    public void run() {
        Thread thisThread = Thread.currentThread();
        while (blinker == thisThread) {
            try {
                thisThread.sleep(interval);
            } catch (InterruptedException e){
            }
            repaint();
        }
    }


--------------------------------------------------------------------------------

如何停止已经等待了很长时间(例如等待输入)的线程?
这就是 Thread.interrupt 方法的用途所在。用户可以使用上述“基于状态”的信号机制,但状态改变(前例中为 blinker = null)的后面可以跟 Thread.interrupt 调用以中断等待:

    public void stop() {
        Thread moribund = waiter;
        waiter = null;
        moribund.interrupt();
    }

要使用这种技术,关键是任何捕获中断异常并无法立即处理它的方法要重新声明该异常。之所以称为重新声明而不是重抛出,是因为该异常不是总可以重新抛出的。如果捕获 InterruptedException 异常的方法没有声明抛出该(已检查的)异常,则它应该用下列代码“重新中断自己”:

    Thread.currentThread().interrupt();

这可以确保 Thread 尽快重新产生 InterruptedException 异常。 


--------------------------------------------------------------------------------

如果线程不响应 Thread.interrupt 该怎么办?
有些情况下,可以使用应用程序特定技巧。例如,如果线程在等待已知套接字,则可以关闭该套接字以使线程立即返回。不幸地是,目前尚没有通用的技术。应该说明,对于所有等待线程不响应 Thread.interrupt 的情况,它也不会响应 Thread.stop。 这种情况包括故意的拒绝服务攻击和 thread.stop 与 thread.interrupt 不能正常工作的 I/O 操作。 


--------------------------------------------------------------------------------

为什么不鼓励使用 Thread.suspend 和 Thread.resume?
Thread.suspend 从本质上就是易于死锁的。如果目标线程锁定在一个监视程序上,从而在关键系统资源挂起时保护资源,则在目标线程恢复前将没有线程能访问该资源。如果试图恢复目标线程的线程在调用 resume 之前试图锁定该监视程序,即出现死锁。这种死锁通常将自己显示为“冻结”进程。 


--------------------------------------------------------------------------------

应该使用什么来代替 Thread.suspend 和 Thread.resume?
与 Thread.stop 一样,最谨慎的方法是让“目标”线程轮询一个指示所需线程状态(活动或挂起)的变量。当需要挂起状态时,线程将使用 Object.wait 进行等待。当线程恢复时,将使用 Object.notify 通知目标线程。 

例如,假定 applet 包含下列 mousePressed 事件处理程序,它将触发名为 blinker 的线程的状态:

    private boolean threadSuspended;

    Public void mousePressed(MouseEvent e) {
        e.consume();

        if (threadSuspended)
            blinker.resume();
        else
            blinker.suspend();  // 易于死锁!

        threadSuspended = !threadSuspended;
    }

用下列代码替代上述事件处理程序,即可避免使用 Thread.suspend 和 Thread.resume:

    public synchronized void mousePressed(MouseEvent e) {
        e.consume();

        threadSuspended = !threadSuspended;

        if (!threadSuspended)
            notify();
    }

然后将下列代码添加到“run loop”中: 

                synchronized(this) {
                    while (threadSuspended)
                        wait();
                }

wait 方法将抛出 InterruptedException 异常,因此它必须位于 try ... catch 子句内。最好是将它插入到与 sleep 相同的子句中。sleep 后面(而不是前面)应该进行检查,以在线程“恢复”时立即重绘窗口。最终的 run 方法如下所示:

    public void run() {
        while (true) {
            try {
                Thread.currentThread().sleep(interval);

                synchronized(this) {
                    while (threadSuspended)
                        wait();
                }
            } catch (InterruptedException e){
            }
            repaint();
        }
    }

注意:mousePressed 方法中的 notify 和 run 方法中的 wait 位于 synchronized 块内部。这是语言所要求的,可确保 wait 和 notify 的序列化。从实际应用来说,这消除了导致“挂起”线程丢失 notify 并无限期地保持挂起状态的竞争情况。 

尽管 Java 中同步的费用随着平台的成熟不断下降,但它永远不会是免费的。用户可以使用一种简易技巧来删除添加在每一次“run loop”中的同步。前面添加的同步块被一段稍复杂的代码所替代(这段代码只有在实际挂起时才进入同步块):

                if (threadSuspended) {
                    synchronized(this) {
                        while (threadSuspended)
                            wait();
                    }
                }

最终的 run 方法为:

    public void run() {
        while (true) {
            try {
                Thread.currentThread().sleep(interval);

                if (threadSuspended) {
                    synchronized(this) {
                        while (threadSuspended)
                            wait();
                    }
                }
            } catch (InterruptedException e){
            }
            repaint();
        }
    }

在没有提供显式同步前,threadSuspended 必须为 volatile,以确保挂起请求的快速通讯。 


--------------------------------------------------------------------------------

是否可以利用这两种技术产生能安全“停止”或“挂起”的线程?
是,这一点显而易见。但要注意的一个细节是:目标线程可能在另一个线程试图停止它时就已经挂起。如果 stop 方法仅将状态变量 (blinker) 设置为 null,则目标线程将仍然挂起(在监视程序上等待),而不是象它所应该的那样悄悄退出。如果该 applet 被重新启动,则最终可能会出现多个线程在监视程序上等待,从而导致错误行为。 

为了解决该问题,stop 方法必须确保目标线程能在挂起时立即恢复。一旦目标线程恢复后,它必须立即识别出自己已被停止并悄悄退出。下面是最终的 run 和 stop 方法: 

    public void run() {
        Thread thisThread = Thread.currentThread();
        while (blinker == thisThread) {
            try {
                thisThread.sleep(interval);

                synchronized(this) {
                    while (threadSuspended && blinker==thisThread)
                        wait();
                }
            } catch (InterruptedException e){
            }
            repaint();
        }
    }

    public synchronized void stop() {
        blinker = null;
        notify();
    }

如果 stop 方法调用 Thread.interrupt(如前所述),则它不必调用 notify,但仍必须实现同步。这可以确保目标线程不会因为偶然情况错过中断。 


--------------------------------------------------------------------------------

对于 Thread.destroy 又该怎么办?
Thread.destroy 从来就没有实现。如果它已经实现,则将易于出现 Thread.suspend 方式的死锁(实际上,它大致等价于 Thread.suspend 而没有后续的 Thread.resume)。我们现在还没有实现它,同时也不鼓励使用它(防止将来实现它)。尽管它易于死锁,但在有些情况下程序宁愿冒死锁危险也不愿立即退出。 

还有很多waring,也没法一一说,你就去看相应的jdk1.2的文档吧


    
 
 

您可能感兴趣的文章:

  • [火急]编译时 -std=c99 编译报错 请高手帮忙看看
  • linux下面用makefile编译的问题,请高手指点。
  • 高手帮帮忙,编译错误,在线等
  • 万能的CSDN啊,100分请教高手一个编译内核传参的问题!
  • 请问高手:sun下如何编译informix的C++,也就是嵌套sql的c++,急呀
  • 有关C编译的突发奇想,请高手指教
  • iptables已打入string match补丁,编译内核无法找到该项,求助高手!
  • 请问高手:如何编译,才能将bean应用到jsp中?
  • jbuilder7编译jsp的奇怪问题,求高手帮忙!
  • CSDN的诸位高手们,请问在LINUX下,用那条命令可以编译C语言的原文件,在线等待:)
  • 为什么我在版本 2.6.14 下,不能编译 epoll ,请高手指教。
  • 高手接分!UNIX 64位动态链接库编译问题
  • 请问各位高手,Applet怎么编译,又怎么运行?
  • proftp先停止再删除再重新编译后还是不能工作请高手指点。
  • 请教高手,如下编译错误是什么原因
  • 请问高手,在SCO UNIX系统下如何编译共享连接库(*.so)
  • 编译JSP文件出错,这可能是什么问题,请教高手!
  • 各位高手,请教一个gcc编译的问题。大家都进来看看!
  • java高手请帮忙(程序编译中的问题)
  • linux 内核编译问题,请教高手
  • 如何获取 文件类型?文件更新日期?多谢高手帮忙!
  • 高手请进:linux下使用.o文件,makefile文件的问题
  • 现急需bmp文件转换成jpg文件的java源代码,请高手们帮帮忙,分数可再加。
  • 请教高手一个简单问题:给定一个文件名,如何去查找该文件正在被几个程序使用,并怎么样才可以切断这个文件与正在打开该文件的程序之间的
  • java中使用jxl生成excel文件,在unix中比在windows中明显慢,有高手知道原因吗?或者说unix和windows的文件系统哪个更快?
  • linux系统哪些文件是相对稳定不变的?请高手帮忙!
  • 关于文件的传输问题,搞了一天了,请高手救命!
  • linux 下能否读写.dbf 或者.xls格式的文件,怎样读写?高手指点,拜谢!!!
  • ★★★在linux下编译pro*c文件,提示"sqlcxt"没有定义,哪位高手帮忙,定赠分!
  • 接前面的《继续讨论文件目录处理的,高手指点!!》
  • 请教高手--html页面中的表格数据直接存为excel文件格式
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 高手,高手,高高手请进!
  • 有熟悉EXIM的高手高手么??
  • to 高手:学java应该怎样一步步学习,从菜鸟到高手.
  • 高分请高手,高手定能解决
  • 请问高手在linux中用什么命令可以做linux的启动盘???在等待高手??
  • 有高手研究Agent++麽?里面有个thread.h,蛮难读的,请高手指点
  • 难道高手区里的人就是高手?
  • 在dos下用bc31挑战高手******开发mssql程序,连接时报link err:undefined symbol GETNOTE in module DBEXTERN?(挑战高手)
  • 真正的linux高手,请看过来,看你符合高手标准不?
  • 难道这没有高手吗?难道这没有乐于助人的高手?(高分酬谢62+50+50)
  • 关于我对linux高手用yum,非高手用源码的理由
  • 高手救命,很急——ORACLE817安装在UNIXWARE711上,手工启动数据库后在netasst中连接错误,高手帮我看看?
  • 请教高手lvs的奇怪问题,我挺着急,希望高手别潜水,就就我,先谢谢了
  • 各个高手看看这个问题!本人第一次学习java所以要各位高手的帮助。。
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 我是新手,高手,高手,快来救我
  • EJB问题,请教高手(非高手莫进)
  • 请各位JAVA高手,网业高手看过来,我把能给的分都送出!!!只能给37分,哎!!
  • eWEEK沙龙征集高手座谈


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3