站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题高手才进来,ServerSocket传送字节丢失的问题

高手才进来,ServerSocket传送字节丢失的问题

摘要: 高手才进来,ServerSocket传送字节丢失的问题


我用ServerSocket传送一组byte[]到client端,一共是86个字节,但是到client端后,只接收到82个字节, 后来,我分把server端传送的byte[]和client端接收的byte[]当成int型打印出来,发现丢失的字节是前四个,分别为-84,-19,0,5,原来我以为是client端接收的方式不当,后来发现,无论用BufferedInputStream或DataInputStream来包装输入流,都一样会有丢失的情况,请问这是什么原因造的?怎么解决呢?




学习


不很清楚.不过你可以搞哈对象序列流


看看代码


把代码贴出来


把代码贴出来看看


好像如果让负数转化为byte后不好怎么恢复呢



hehe, 楼主能保证接收方没有别的代码在 read() 吗?


先讲意图,其实我是想通过ServerSocket来传一个对象给Client,然后在Client端把对象还原,我以前在项目中已经用开源项目hessian来做到传送对象,由于近期在补基础,所以想自己来写一个,原理是先把一个对象通过ObjectOutputStream写在一个临时的文件中,然后用FileInputStream读取,再通过Socket把FileInputStream读到的字节一个个传过去,然后在Client端用ObjectInputStream还原。

________________Server端_________________________________-

package shuffle;

import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import sun.security.krb5.internal.bp;

public class TServer implements Runnable
{
public void launch() throws Exception
{
TBean bean=new TBean();
bean.setId(-#34;111-#34;);
bean.setName(-#34;terry-#34;);
Objecter objer=new Objecter(bean);
byte b[]=objer.objectToBytes();
//这两行就是我写的Objecter,可以把Object对象变成byte[],代码在下面

ServerSocket server=new ServerSocket(TTestSocket.PORT);
System.out.println(-#34;Server is starting......-#34;);

while(true)
{
Socket client=server.accept();
OutputStream os=client.getOutputStream();
if(os!=null)
{
BufferedOutputStream bos=new BufferedOutputStream(os);
System.out.println(-#34;Server sended -#34;+b.length+-#34; bytes.-#34;);
String sendedContent=new String(b,0,b.length);
System.out.println(senedContent);
System.out.println(-#34;#################################-#34;);
for (int i = 0; i -#60; b.length; i++)
{
System.out.print((int)b[i]);
System.out.print(-#39;,-#39;);
}
System.out.println(-#39;/n-#39;);
bos.write(b);
bos.flush();
os.close();
bos.close();
}
else
{
System.out.println(-#34;disconnect....-#34;);
}

os.close();
client.close();
}
}

public void run()
{
try
{
launch();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}


-----------------Client---------------------------------

package shuffle;

import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.net.Socket;

public class TClient implements Runnable
{
public void launch() throws Exception
{
System.out.println(-#34;Client is starting......-#34;);
Socket client=new Socket(-#34;127.0.0.1-#34;,TTestSocket.PORT);
InputStream is=client.getInputStream();

//*************** BufferedInputStream的方式********************
if(is!=null)
{
BufferedInputStream bis=new BufferedInputStream(is);
ObjectInputStream ois=new ObjectInputStream(bis);
byte b[]=new byte[bis.available()];
bis.read(b);
System.out.println(-#34;client received:-#34;+b.length+-#34; bytes-#34;);
System.out.println(-#34;**********************************-#34;);
for (int i = 0; i -#60; b.length; i++)
{
System.out.print((int)b[i]);
System.out.print(-#39;,-#39;);
}
System.out.println(-#39;/n-#39;);
String msg=new String(b,0,b.length);
System.out.println(msg);
// TBean bean=(TBean)ois.readObject();
// System.out.println(-#34;@@ name:-#34;+bean.getName());
bis.close();
ois.close();

FileOutputStream fos=new FileOutputStream(-#34;after.txt-#34;);
fos.write(b);
fos.flush();
fos.close();
}
else
{
System.out.println(-#34;received null....-#34;);
}
is.close();
client.close();
}

public void run()
{
try
{
launch();
//Thread.sleep(3000);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}

____________________Objecter________________________________

package shuffle;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class Objecter
{
Object obj;
public Objecter(Object obj)
{
this.obj=obj;
}

public byte[] objectToBytes() throws Exception
{
byte b[]=null;
File tmp=new File(-#34;tmp.txt-#34;);
FileOutputStream fos=new FileOutputStream(tmp);
BufferedOutputStream bos=new BufferedOutputStream(fos);
ObjectOutputStream oos=new ObjectOutputStream(bos);

oos.writeObject(obj);
oos.flush();

FileInputStream fis=new FileInputStream(tmp);
BufferedInputStream bis=new BufferedInputStream(fis);
b=new byte[bis.available()];
bis.read(b);

fos.close();
bos.close();
oos.close();
fis.close();
bis.close();

return b;
}
}

-----------------调用测试类------------------------------

package shuffle;

public class TTestSocket
{
public static int PORT=13564;
public static void main(String[] args) throws Exception
{
Thread t1=new Thread(new TServer());
Thread t2=new Thread(new TClient());

t2.start();
t1.start();
}
}





代码较长,希望大家有耐性看完,如果解决了,我加分再结贴。




TBean bean=new TBean();
这个对象要序列化



对了。。请问大家一个问题?怎么用JAVA进行对数组的操作?如:添加,修改,删除?

我这几天碰到的JAVA面试题?大家有空帮我看看,最好写出代码。谢谢!


你的客户端程序既用了 BufferedInputStream,又用了 ObjectInputStream,搞不好会乱掉。你如果只用 BufferedInputStream 的话,还会丢 4 个字节吗?


我刚刚替你查了一下 ObjectInputStream 的源代码,发现在 ObjectInputStream ois=new ObjectInputStream(bis); 的时候,它已经从 bis 里面读掉 4 个字节了(两个 short, 0xACED, 0x0005,恰好是你说的 -84,-19,0,5)


↑返回目录
前一篇: 大家帮帮我,烦!
后一篇: 已知自1970年的毫秒数(double类型),怎么转换为日期?