求教:怎样才能使发送速度变快? 现做一程序,要求如下:1.用ClientSocket向服务器发送从数据库中读出的数据,若成功则将该条数据删除2.速度至少80条/秒 我只能做20条/秒的速度,请各位高手帮忙啊!!!有源程序的话,分数可以再加哦!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 直接用Socket操作,应该要快些。不过程序不好写,建议还是用ClientSock,如果是局域网,速度还是这样的话,程序就真的有问题了。 先谢谢各位楼上的兄弟们关注此问题!1. 回复人: pazee(耙子) ( ) 信誉:127 2003-10-03 15:08:00 得分:0 问题描述的太不清楚了。没办法确定瓶颈的位置。pazee兄,可能是我的文字功力不行吧,能否说下哪里不清楚呢?2. 回复人: kiboisme(还是铁棒.....针) ( ) 信誉:60 2003-10-03 16:43:00 得分:0 直接用Socket操作,应该要快些。不过程序不好写,建议还是用ClientSock,如果是局域网,速度还是这样的话,程序就真的有问题了。我用的就是clientSocket啊,而且是在本机上测试的不是,但我没有用线程(不太熟悉,所以不没用):( 不知道哪里有关于这方面的源程序呢?如有,可否发一个给我呢? 另:各位高手帮忙看下我的另外一个问题啊http://expert.csdn.net/Expert/topic/2324/2324211.xml?temp=.1825678 to: xinggg(无名风) 肯定不是数据量的关系,我也知道要改发送端,但我太菜了,所以不知道该从哪里着手啊 请指教一二啊 服务端是不是你实现呢?你用的阻塞方式还是非阻塞方式呢?是短连接还是长连接呢?如果是单线程同步方式,我估计发送速度主要受服务端的限制,其实是建立SOCKET连接的时间成本.方式一:(阻塞单线程)客户端 服务器 发送一条记录 ----------------------> (处理) 回应 <------------------------(删除记录)方式二:(非阻塞单线程)客户端 服务器 发送一条记录a ----------------------> 发送一条记录b ----------------------> 回应a <------------------------(删除记录a) 回应b <------------------------(删除记录b)方式三:(阻塞多线程)客户端线程A 客户端线程B 服务器 发送一条记录a -----------------------------------------------> 发送一条记录b ----------------------> 回应a <------------------------------------------------(删除记录a) 回应b <------------------------ (删除记录b)实际上仅看发送数据的时间,是远小于处理过程的花费时间.你先要清楚你整个处理过程,才好找出着手的地方. to:halfdream(哈欠) 我目前预采取的方式是:阻塞多线程,但对于类似的编程技术我之前从未接触过,所以想找一个源程序来学习一下,不知道你那里有吗?有的话能给我一份吗?谢谢! To: halfdream(哈欠)请问怎么样设置阻塞方式或非阻塞方式、短连接或长连接?能给个具体的例子么?indy的client组件是否也有同样的问题? 现成的程序没有....INDY的CLIENT组件好象只是用的阻塞方式.所谓长连接与短连接就是在建立SOCKET连接然后进行发送接收完成后,是不是保持这个SOCKET连接,用来进行下一次发送接收..' 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(); } } 我晕,JAVA版的啊。我想看DELPHI的:(不过还是要谢谢RomandAccessFile(goodghost) to:zhujunfeng(ericss) 我的数据库记录基本上维持在5W笔记录,用SELECT TOP的速度很快,所以我估计不是数据库操作的问题,主要还是在数据的发送上。如果兄台有利用SOCKET多线程发送的DELPHI例程可否发一个给我呢?MAIL:[email protected] 谢谢! 发到你信箱了,不过是个服务器端,客户端更简单,自己改一下吧呵呵,我做的短消息发送程序,不用数据库可以到400条每秒,用数据库只能20条,就算你用select top,连一下数据库也要几毫秒的时间 我有多线程网络文件传输的源码,但不一定适合你的情况。是直接调用Socket的。 to:zhujunfeng(ericss) server端已收到,研究ING......to:forgot(忘记forgot2000) 平台是sql server 2000,每条记录不超过0.5k,但条数很大另外至于源码只要是DELPHI的就可以,反正学会了以后说不定会有用的 :) 想要源码的话可以给我发信:[email protected],主题写上:“forgot和forgot2000互为马甲”即可,这样做的目的是因为我每天会收到许多信件,不是我指定的那些主题的话我会视为垃圾信件,看都不看加以删除。我的电脑曾经中过E-mail病毒,来历不明的信件我根本不会打开,切记! label在TScrollBox里为什么显示不了 请教:ADOQUERY的locate,是否可以定位下一条记录呢? 为什么a 不能把值传递给b? 100分求解DLL中的HOOK问题,是关于做游戏外挂的,发放源码 下面程序有和错误,请指教. 各位高手,请出手 关于adoquery的sql问题 进来看看这一段小程序,解决后马上给分的!up就给分! 请问如果调整DBChart的一个Series的类型 一个送分的题!!!! ADOQuery Join 的问题 如何根据字段值取字段名? flash和dephi的交互问题 (急)
不过程序不好写,建议还是用ClientSock,如果是局域网,速度还是这样的话,程序就真的有问题了。
1. 回复人: pazee(耙子) ( ) 信誉:127 2003-10-03 15:08:00 得分:0
问题描述的太不清楚了。没办法确定瓶颈的位置。
pazee兄,可能是我的文字功力不行吧,能否说下哪里不清楚呢?2. 回复人: kiboisme(还是铁棒.....针) ( ) 信誉:60 2003-10-03 16:43:00 得分:0
直接用Socket操作,应该要快些。不过程序不好写,建议还是用ClientSock,如果是局域网,速度还是这样的话,程序就真的有问题了。我用的就是clientSocket啊,而且是在本机上测试的不是,但我没有用线程(不太熟悉,所以不没用):( 不知道哪里有关于这方面的源程序呢?如有,可否发一个给我呢?
肯定不是数据量的关系,我也知道要改发送端,但我太菜了,所以不知道该从哪里着手啊 请指教一二啊
是短连接还是长连接呢?如果是单线程同步方式,我估计发送速度主要受服务端的限制,其实是建立
SOCKET连接的时间成本.方式一:(阻塞单线程)
客户端 服务器
发送一条记录
----------------------> (处理)
回应
<------------------------(删除记录)
方式二:(非阻塞单线程)客户端 服务器
发送一条记录a
----------------------> 发送一条记录b
---------------------->
回应a
<------------------------
(删除记录a) 回应b
<------------------------(删除记录b)
方式三:(阻塞多线程)客户端线程A 客户端线程B 服务器
发送一条记录a
-----------------------------------------------> 发送一条记录b
---------------------->
回应a
<------------------------------------------------
(删除记录a) 回应b
<------------------------ (删除记录b)实际上仅看发送数据的时间,是远小于处理过程的花费时间.
你先要清楚你整个处理过程,才好找出着手的地方.
我目前预采取的方式是:阻塞多线程,但对于类似的编程技术我之前从未接触过,所以想找一个源程序来学习一下,不知道你那里有吗?有的话能给我一份吗?谢谢!
请问怎么样设置阻塞方式或非阻塞方式、短连接或长连接?
能给个具体的例子么?
indy的client组件是否也有同样的问题?
所谓长连接与短连接就是在建立SOCKET连接然后进行发送接收完成后,
是不是保持这个SOCKET连接,
用来进行下一次发送接收..'
{
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();
}
}
我的数据库记录基本上维持在5W笔记录,用SELECT TOP的速度很快,所以我估计不是数据库操作的问题,主要还是在数据的发送上。如果兄台有利用SOCKET多线程发送的DELPHI例程可否发一个给我呢?MAIL:[email protected] 谢谢!
server端已收到,研究ING......to:forgot(忘记forgot2000)
平台是sql server 2000,每条记录不超过0.5k,但条数很大
另外至于源码只要是DELPHI的就可以,反正学会了以后说不定会有用的 :)