我的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下的读取器死了,出不来了!!!
函数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下的读取器死了,出不来了!!!
改 count=in.read(tmp);试试
out.write(sendstring.getBytes( "GBK ")); 你传了一个空字符串过去,但是在你的服务器端却要指定接收从0开始的3652字节的数据
服务器没有读完3652字节数据前是一直处于阻塞状态的,当然没有响应了一般来说传TCP数据的话,最好制定一个消息协议
比如,一次传送的数据包开头的4字节指定需要传送的数据大小,接下来跟着是数据部分
服务器先接收数据包大小信息,然后以1024单位循环读取数据包
这样才不容易造成服务器端的阻塞假死
我传入的是sendstring(这是参数传入的),而returnstring是返回的数据.
---------------------------------------------------------
我自己开两个Ecplise测试了一下,还是不行,并且会出现这种情况:
客户端传入数据较大时,但没有超过服务器接收的最大长度,此时服务器端会将数据分开来接收,也就是说一次只接收传入的部分数据,如以下调试结果所示:
服务器:
开始接收数据
接收到了:4380个字节数据.
开始接收数据
接收到了:526个字节数据.
---------
客户端:
发送长度:4906字节
返回数据:526字节-------------------------------------------------------
求高手们帮帮我看看这种传送机制到底会有什么问题???
楼上说的机传输机制怎么实现呢?以前没做过,只做过这种简单的
因为服务器处理连接的线程并不知道这个socket怎么样了,所以它会一直尝试着从里面读取数据,直到你设了超时的话,到了超时为止,或者你没有设超时的话,就直到socket关闭为止,它才会返回.你应该在客户端发完数据后再调用一下,socket.close(),把这个socket关了,然后服务器那边读的等待方法会抛出一个异常,你捕获这个异常就可以了