现做一程序,要求如下:
1.用ClientSocket向服务器发送从数据库中读出的数据,若成功则将该条数据删除
2.速度至少80条/秒 
我只能做20条/秒的速度,请各位高手帮忙啊!!!有源程序的话,分数可以再加哦!!

解决方案 »

  1.   

    直接用Socket操作,应该要快些。
    不过程序不好写,建议还是用ClientSock,如果是局域网,速度还是这样的话,程序就真的有问题了。
      

  2.   

    先谢谢各位楼上的兄弟们关注此问题!
    1. 回复人: pazee(耙子) ( ) 信誉:127  2003-10-03 15:08:00  得分:0 
      问题描述的太不清楚了。没办法确定瓶颈的位置。
    pazee兄,可能是我的文字功力不行吧,能否说下哪里不清楚呢?2.  回复人: kiboisme(还是铁棒.....针) ( ) 信誉:60  2003-10-03 16:43:00  得分:0 
      直接用Socket操作,应该要快些。不过程序不好写,建议还是用ClientSock,如果是局域网,速度还是这样的话,程序就真的有问题了。我用的就是clientSocket啊,而且是在本机上测试的不是,但我没有用线程(不太熟悉,所以不没用):( 不知道哪里有关于这方面的源程序呢?如有,可否发一个给我呢? 
      
      

  3.   

    另:各位高手帮忙看下我的另外一个问题啊http://expert.csdn.net/Expert/topic/2324/2324211.xml?temp=.1825678
      

  4.   

    to: xinggg(无名风) 
      肯定不是数据量的关系,我也知道要改发送端,但我太菜了,所以不知道该从哪里着手啊 请指教一二啊
      

  5.   

    服务端是不是你实现呢?你用的阻塞方式还是非阻塞方式呢?
    是短连接还是长连接呢?如果是单线程同步方式,我估计发送速度主要受服务端的限制,其实是建立
    SOCKET连接的时间成本.方式一:(阻塞单线程)
    客户端                   服务器
       
          发送一条记录 
      ---------------------->                         (处理)
             回应
      <------------------------(删除记录)
    方式二:(非阻塞单线程)客户端                   服务器
       
          发送一条记录a 
      ---------------------->      发送一条记录b 
      ---------------------->                         
             回应a
      <------------------------
    (删除记录a)         回应b
      <------------------------(删除记录b)
    方式三:(阻塞多线程)客户端线程A       客户端线程B                   服务器
       
          发送一条记录a 
      ----------------------------------------------->                               发送一条记录b 
                              ---------------------->                         
             回应a
      <------------------------------------------------
    (删除记录a)                                    回应b
                              <------------------------                      (删除记录b)实际上仅看发送数据的时间,是远小于处理过程的花费时间.
    你先要清楚你整个处理过程,才好找出着手的地方.
      

  6.   

    to:halfdream(哈欠) 
      我目前预采取的方式是:阻塞多线程,但对于类似的编程技术我之前从未接触过,所以想找一个源程序来学习一下,不知道你那里有吗?有的话能给我一份吗?谢谢!
      

  7.   

    To: halfdream(哈欠)
    请问怎么样设置阻塞方式或非阻塞方式、短连接或长连接?
    能给个具体的例子么?
    indy的client组件是否也有同样的问题?
      

  8.   

    现成的程序没有....INDY的CLIENT组件好象只是用的阻塞方式.
    所谓长连接与短连接就是在建立SOCKET连接然后进行发送接收完成后,
    是不是保持这个SOCKET连接,
    用来进行下一次发送接收..'
      

  9.   

    public void actionPerformed(ActionEvent evt)
    {
    Object obj=evt.getSource();
    if(obj==jb1)

    if(a==0)
    {
    data=new Student();
    data.doId=0;
    data.studentID = jtf1.getText();
    data.studentName = jtf2.getText();
    data.studentAddress =jtf3.getText();
    data.studentTele=jtf4.getText();
    data.result=0;
    data.studentPosition =  String.valueOf(jcb1.getSelectedItem());
    try
    {
    Socket toServer;
    toServer = new Socket("192.168.0.1",1001);
    ObjectOutputStream streamToServer=new ObjectOutputStream(toServer.getOutputStream());
    streamToServer.writeObject((Student)data);
    Student data2;
    ObjectInputStream streamFromServer=new ObjectInputStream(toServer.getInputStream());
    data2=(Student)streamFromServer.readObject();
    if (data2.result==1)
    {
    JOptionPane.showMessageDialog(this,"插入成功");
    }
    else
    {
    String str="插入失败\n\n可能因为插入的字段有误";
    JOptionPane.showMessageDialog(this,str);
    }
    streamToServer.close();
    }

    catch(Exception ev)
    {
    showStatus("Cannot write to the server"+ev);
    }
    }
    if(a==1)
    {
    data=new Student();
    data.doId=1;
    data.studentID = jtf5.getText();
    data.studentName = jtf6.getText();
    data.studentAddress =jtf7.getText();
    data.studentTele=jtf8.getText();
    data.studentPosition =  String.valueOf(jcb2.getSelectedItem());
    try
    {
    Socket toServer;
    toServer = new Socket("192.168.0.1",1001);
    ObjectOutputStream streamToServer=new ObjectOutputStream(toServer.getOutputStream());
    streamToServer.writeObject((Student)data);
    Student data2;
    ObjectInputStream streamFromServer=new ObjectInputStream(toServer.getInputStream());
    data2=(Student)streamFromServer.readObject();
    if (data2.result==1)
    {
    JOptionPane.showMessageDialog(this,"更新成功");
    }
    else
    {
    String str="更新失败\n\n可能数据库中没有该记录";
    JOptionPane.showMessageDialog(this,str);
    }
    streamToServer.close();
    }

    catch(Exception ev)
    {
    showStatus("Cannot write to the server"+ev);
    }
    }
    if(a==2)
    {
    data=new Student();
    data.doId=3;
    data.studentID = jtf9.getText();
    try
    {
    Socket toServer;
    toServer = new Socket("192.168.0.1",1001);
    ObjectOutputStream streamToServer=new ObjectOutputStream(toServer.getOutputStream());
    streamToServer.writeObject((Student)data);
    Student data2;
    ObjectInputStream streamFromServer=new ObjectInputStream(toServer.getInputStream());
    data2=(Student)streamFromServer.readObject();
    if (data2.result==1)
    {
    jtf10.setText(data2.studentName);
    jtf11.setText(data2.studentAddress);
    jtf12.setText(data2.studentTele);
    jtf13.setText(data2.studentPosition);
    Object[] options = { "OK", "CANCEL" };
    getorder=JOptionPane.showOptionDialog(null, "Click OK to continue", "Warning", 
    JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,
    null, options, options[0]);



    //JOptionPane.showOptionDialog(this,"确认要删除该记录吗?","Message",JOptionPane.YES_NO_OPTION,JOptionPane.WARNING_MESSAGE,null,null,null);
    //getorder=""+JOptionPane.YES_OPTION;
    System.out.println(""+getorder);
              
    if(getorder==0)
    {



    data.doId=2;
    data.studentID = jtf9.getText();
    try
    {
    //Socket toServer;
    toServer = new Socket("192.168.0.1",1001);
    //ObjectOutputStream streamToServer=new ObjectOutputStream(toServer.getOutputStream());
    streamToServer=new ObjectOutputStream(toServer.getOutputStream());
    streamToServer.writeObject((Student)data);
    //Student data2;
    //ObjectInputStream streamFromServer=new ObjectInputStream(toServer.getInputStream());
    streamFromServer=new ObjectInputStream(toServer.getInputStream());
    data2=(Student)streamFromServer.readObject();
    if (data2.result==1)
    {
    jtf9.setText("");
    jtf10.setText("");
    jtf11.setText("");
    jtf12.setText("");
    jtf13.setText("");
    JOptionPane.showMessageDialog(this,"记录删除成功");
    }
    else
    {
    String str="记录删除失败\n\n可能数据库中没有该记录";
    JOptionPane.showMessageDialog(this,str);
    }
    streamToServer.close();
    }
    catch(Exception ev)
    {
    showStatus("Cannot write to the server"+ev);
    }
    }
    else
    {
    jtf10.setText("");
    jtf11.setText("");
    jtf12.setText("");
    jtf13.setText("");
    String str="您放弃了删除该系统";
    JOptionPane.showMessageDialog(this,str);
    }


    streamToServer.close();
    }
    }
    catch(Exception ev)
    {
    showStatus("Cannot write to the server"+ev);
    }

    }
    if(a==3)
    {
    data=new Student();
    data.doId=3;
    data.studentID = jtf14.getText();
    try
    {
    Socket toServer;
    toServer = new Socket("192.168.0.1",1001);
    ObjectOutputStream streamToServer=new ObjectOutputStream(toServer.getOutputStream());
    streamToServer.writeObject((Student)data);
    Student data2;
    ObjectInputStream streamFromServer=new ObjectInputStream(toServer.getInputStream());
    data2=(Student)streamFromServer.readObject();
    if (data2.result==1)
    {
    jtf15.setText(data2.studentName);
    jtf16.setText(data2.studentAddress);
    jtf17.setText(data2.studentTele);
    jtf18.setText(data2.studentPosition);
    }
    else
    {
    jtf15.setText("");
    jtf16.setText("");
    jtf17.setText("");
    jtf18.setText("");
    String str="记录查找失败\n\n可能数据库中没有该记录";
    JOptionPane.showMessageDialog(this,str);
    }

    streamToServer.close();
    }

    catch(Exception ev)
    {
    showStatus("Cannot write to the server"+ev);
    }
    Student todata=new Student();




    }

    return;
    }

    if(obj==jb2)
    {  
    if(a==0)
    {
    jtf1.setText("");
    jtf2.setText("");
    jtf3.setText("");
    jtf4.setText("");
    }
    if(a==1)
    {

    jtf5.setText("");
    jtf6.setText("");
    jtf7.setText("");
    jtf8.setText("");
    }
    if(a==2)
    {

    jtf9.setText("");
    jtf10.setText("");
    jtf11.setText("");
    jtf12.setText("");
    jtf13.setText("");
    }
    if(a==3)
    {
    jtf14.setText("");
    jtf15.setText("");
    jtf16.setText("");
    jtf17.setText("");
    jtf18.setText("");
    }
    return;
    }

    if(obj==jb3)
    {
    System.exit(0);
    }
    }

    public void stateChanged(ChangeEvent e)
    {
    a=jtp.getSelectedIndex(); 
    }



    }
      

  10.   

    我晕,JAVA版的啊。我想看DELPHI的:(不过还是要谢谢RomandAccessFile(goodghost)
      

  11.   

    to:zhujunfeng(ericss) 
    我的数据库记录基本上维持在5W笔记录,用SELECT TOP的速度很快,所以我估计不是数据库操作的问题,主要还是在数据的发送上。如果兄台有利用SOCKET多线程发送的DELPHI例程可否发一个给我呢?MAIL:[email protected] 谢谢!
      

  12.   

    发到你信箱了,不过是个服务器端,客户端更简单,自己改一下吧呵呵,我做的短消息发送程序,不用数据库可以到400条每秒,用数据库只能20条,就算你用select top,连一下数据库也要几毫秒的时间
      

  13.   

    我有多线程网络文件传输的源码,但不一定适合你的情况。是直接调用Socket的。
      

  14.   

    to:zhujunfeng(ericss) 
    server端已收到,研究ING......to:forgot(忘记forgot2000) 
    平台是sql server 2000,每条记录不超过0.5k,但条数很大
    另外至于源码只要是DELPHI的就可以,反正学会了以后说不定会有用的 :)
      

  15.   

    想要源码的话可以给我发信:[email protected],主题写上:“forgot和forgot2000互为马甲”即可,这样做的目的是因为我每天会收到许多信件,不是我指定的那些主题的话我会视为垃圾信件,看都不看加以删除。我的电脑曾经中过E-mail病毒,来历不明的信件我根本不会打开,切记!