Javasocket(60分)

  • 主题发起人 主题发起人 hotsoup
  • 开始时间 开始时间
H

hotsoup

Unregistered / Unconfirmed
GUEST, unregistred user!
各位高手:
在下使用java socket客户端访问server端(vc),建立链接发送包后,
在读取返回包时发生错误。
错误代码为:
java.netSocketException:JVM_recv in socket input stream read (code=10053)

请问是怎么回事,谢谢了!
 
WSAECONNABORTED (10053)
Software Caused Connection Abort -- A connection was aborted by software on the host computer.
 
那位高手再给指点指点!
 
我是低手,关注一下。
问题应该出在vc那边主动地把socket连接给断开了,这也很正常,不能算错误,因为很可能
server端已经完成了数据的发送。所以我觉得你最主要的是在client端判断出是不是已经收到
完整的数据包了,如果是就可以正常退出(当然是在有try保护的前提下),不是再进行错误处理。
至于如何判断是否完成数据传送,这跟两边的具体协议有关了。我也刚刚接触到这一部分的编程,
我想应该可以用某个(段)特殊字符为发送结束标志,这样接收到这个(段)字符就认为没有错误发生,
就有可能在server端断开之前正常退出了。
 
把源代码贴出来吧
不然怎么看
怎么知道问题出在哪里
 
部分源码如下:
Send为发送包
Accept接收
问题出现在:client_in.read(cbuf);
public class H2Sock
{
private BufferedReader client_in ;
private PrintStream client_out;
private Socket sock;
//
public H2Sock(){
try{
sock = new Socket("redhat",8009);
sock.setSoTimeout(5000);
DataOutputStream cl_out= new DataOutputStream(sock.getOutputStream());
client_out=new PrintStream(cl_out);
client_in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
}catch(Exception e)
{
System.out.println("Error:"+e);
}
}
//
public H2Sock(String host,int port){
try{
sock = new Socket(host,port);
sock.setSoTimeout(5000);
DataOutputStream cl_out= new DataOutputStream(sock.getOutputStream());
client_out=new PrintStream(cl_out);
client_in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
}catch(Exception e)
{
System.out.println("Error:"+e);
}
}
public void Send(String sendStr)
{
try{
String overFlag = "/u001a";
String sendPackage = sendStr + overFlag;
client_out.println(sendPackage);
client_out.flush();
System.out.println("SendSuccess!");
}catch(Exception e){
System.out.println("SendError:"+e);
}
}
public Vector Accept()
{
String result = "";
Vector resultBuf = new Vector();
char cbuf[] = new char[20480];
try{
client_in.read(cbuf);
int bufLen = lenOfbuf(cbuf);
System.out.println("Length :"+bufLen);
boolean more = true;
int index = 0;
while(more)
{
result = result + cbuf[index];
if(index == bufLen-1)
more = false;
if(index == 79){
resultBuf.add(result);
result = "";
}
index ++;
}
resultBuf.add(result);
}catch(Exception e){
System.out.println("AcceptError:"+e);
}
return resultBuf;
}
}
 
如果你是和不同语言开发的程序(如C)通讯的话,
将字符串转换成一个BYTE流传输要好一些
因为BYTE是JAVA传输单位中最小的(除了位以外)
因此什么数据都能用其表示
不要用client_out.println之类的想传一个字符串
我是开发过这种程序才告诉你
不是信口开河
给你一个小例子:
socket = new Socket("test",8888);
socket.setSoTimeout(20000) ;
DataOutputStream dataOutStream=new DataOutputStream(socket.getOutputStream ());
dataOutStream.write(byte[]型数据);
byte的处理虽然麻烦一些
但是绝对可靠一些
 
我也有类似问题,和WINDOWS程序通信没问题,但是和UNIX的C程序通信就会经常断。
 
我写的通讯程序没有这个问题(UNIX的C程序通信就会经常断)
你处理了JAVA通信的异常没有
 
后退
顶部