关于SOCKET通信的奇怪问题

seaforce 2007-11-05 06:00:12
我的SOCKET服务器通信是这样的:
函数1:
public class Connectors extends Thread {
public Connectors(ConnectPara para) {
start();
}
public void run(){
//int count=0;
try{
ServerSocket serversocket = new ServerSocket(m_para.ListenPort);
while(true){
Socket socket=serversocket.accept();
// 启动连接服务进程
if(m_para.CheckAccess(socket)){
new Connector(socket,m_para);
}
else{
socket.close();
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
函数2:

import java.io.*;
import java.net.*;
import java.util.*;

public class Connector extends Thread{

/** 网络连接*/
private Socket socket;

/** 网络输入数据流*/
private InputStream in;
/** 网络输出数据流*/
private OutputStream out;


/** 构造函数*/
public Connector(Socket s,ConnectPara para){
socket=s;

m_para=para;
try{
socket.setSoTimeout(600);//超时时间
in=socket.getInputStream();
out=socket.getOutputStream();
start();
} catch(Exception e){
if(QuietMode==0){
e.printStackTrace();
}
}
}

public void run(){
actived=1;
try{
byte[] tmp=new byte[3652];
byte[] buf=new byte[3652];
int count=0,received=0;
while(true){
try{
System.out.println("开始读取");//这行打出来了
count=in.read(tmp,0,3652);//此处死了,执行到此处就不往下走了!是否跟Socket通信函数读取器有关系????
System.out.println("结束读取");//这行没打出来
received+=count;
}catch(Exception e){
e.printStackTrace();
break;
}
}

buf="fdsafds".getBytes();
out.write(buf);
out.flush();

} catch(Exception e){
e.printStackTrace();
actived=0;
}
}
}
-----------------------
客户端是这么掉用的:
public String send(String sendstring)throws Exception{
String returnstring = "";
try{
//新建Socket通信
Socket socket = new Socket(ip,port);
//通信输出字节流
OutputStream out = socket.getOutputStream();
out.write(sendstring.getBytes("GBK"));
out.flush();
log.info("send:"+sendstring);

//-----------开始接收-------------
byte[] buf = new byte[65536];
InputStream in=socket.getInputStream();
int count = in.read(buf);
returnstring = new String(buf,"GBK");
System.out.println(returnstring);
}catch(Exception e){
e.printStackTrace();
}
return returnstring ;
}

-------------
问题如下:
正常情况下能进行通信,但每回新建立连接时第一次服务器就读取不到数据,接下来可以读取!
有人遇到过这种问题么???
一般第一次服务器启动时才会出现,问题在服务器端的Connector下的读取器死了,出不来了!!!
...全文
134 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
seaforce 2007-11-07
  • 打赏
  • 举报
回复
按照楼上的方法的话,如果我客户端发送后就关闭了,那么我怎么能收到服务器返回的数据呢???对于服务器端来说,虽然可以接收刚关闭的客户端数据,但服务器端怎么能返回数据呢???不会再新建一个Socket吧???
seaforce 2007-11-06
  • 打赏
  • 举报
回复
更正一下楼主的:
我传入的是sendstring(这是参数传入的),而returnstring是返回的数据.
---------------------------------------------------------
我自己开两个Ecplise测试了一下,还是不行,并且会出现这种情况:
客户端传入数据较大时,但没有超过服务器接收的最大长度,此时服务器端会将数据分开来接收,也就是说一次只接收传入的部分数据,如以下调试结果所示:
服务器:
开始接收数据
接收到了:4380个字节数据.
开始接收数据
接收到了:526个字节数据.
---------
客户端:
发送长度:4906字节
返回数据:526字节

-------------------------------------------------------
求高手们帮帮我看看这种传送机制到底会有什么问题???
楼上说的机传输机制怎么实现呢?以前没做过,只做过这种简单的
beiouwolf 2007-11-06
  • 打赏
  • 举报
回复
String returnstring = " ";
out.write(sendstring.getBytes( "GBK "));

你传了一个空字符串过去,但是在你的服务器端却要指定接收从0开始的3652字节的数据
服务器没有读完3652字节数据前是一直处于阻塞状态的,当然没有响应了

一般来说传TCP数据的话,最好制定一个消息协议
比如,一次传送的数据包开头的4字节指定需要传送的数据大小,接下来跟着是数据部分
服务器先接收数据包大小信息,然后以1024单位循环读取数据包
这样才不容易造成服务器端的阻塞假死
seaforce 2007-11-06
  • 打赏
  • 举报
回复
还是会出现这样的问题
piaopiao11 2007-11-06
  • 打赏
  • 举报
回复
client端发送的数据长度不够3652吧
改 count=in.read(tmp);试试
千里冰封820 2007-11-06
  • 打赏
  • 举报
回复
你的程序最根本的问题就是你在建立连接以后,没有明确这个连接所能发送的数据,你在客户端在发完之后,并且没有close掉,所以在你服务器的那一块,才会卡死在count=in.read(tmp,0,3652);
因为服务器处理连接的线程并不知道这个socket怎么样了,所以它会一直尝试着从里面读取数据,直到你设了超时的话,到了超时为止,或者你没有设超时的话,就直到socket关闭为止,它才会返回.

你应该在客户端发完数据后再调用一下,socket.close(),把这个socket关了,然后服务器那边读的等待方法会抛出一个异常,你捕获这个异常就可以了
seaforce 2007-11-06
  • 打赏
  • 举报
回复
怎么没人帮我了
千里冰封820 2007-11-05
  • 打赏
  • 举报
回复
没有道理啊,按理说是读到了多少都会返回的,你把你的那个read方法改成read(byte[] data)的方法,也就是不要指定它从哪读到哪就可以了

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧