java网络流的问题

我估计是输入输出流的问题。在eclipse下运行时总不能得到设想的结果。。import java.net.*;
import java.io.*;

public class ServerTCP {

public static void main(String[] args) throws Exception
{
ServerSocket serversocket=null;
Socket socket=null;

DataInputStream in=null;
DataOutputStream out=null;

serversocket=new ServerSocket(8000);
socket=serversocket.accept();

in=new DataInputStream(socket.getInputStream());
out=new DataOutputStream(socket.getOutputStream());

byte[] buf=new byte[100];
in.read(buf);
String str=new String(buf);
System.out.println("On Server..."+" "+str);
str="message form server...";
buf=str.getBytes();
out.write(buf);
}

}

import java.net.*;
import java.io.*;
public class UserTCP {
public static void main(String[] args) throws Exception
{
Socket socket=new Socket("localhost",8000);
DataInputStream in=new DataInputStream(socket.getInputStream());
DataOutputStream out=new DataOutputStream(socket.getOutputStream());

String str="I am client";
byte[] buf =new byte[100];
buf=str.getBytes();
out.write(buf);
in.read(buf);
str=new String(buf);
System.out.println("On client..."+" "+str);
}

}
首先,谢谢各位大大们的解答。大大们提到的错误我改正了下,可是仍无法得到我想要的答案。。以下是我修改后运行的结果:
server端: byte[] bufR=new byte[100];
byte[] bufW=new byte[100];
in.read(bufR);
String str=new String(bufR);
System.out.println("On Server..."+" "+str);
str="message form server...";
bufW=str.getBytes();
out.write(bufW);
user端:
String str="I am client";
byte[] bufW =new byte[100];
bufW=str.getBytes();
out.write(bufW);
byte[] bufR=new byte[100];
in.read(bufR);
str=new String(bufR);
System.out.println("On client..."+" "+str);

On Server... I am client□□□□□□□□□□□□□□□□□□□□□□□□□□□□

问题是,server端的write方法没运行起?还是user端没收到数据?

悲剧的是。第二次运行得到
On client... message form server...□□□□□□□□□□□□□□□□□□□□□□□□□□□□
两个只有一个显示出来了!!郁闷啊

问题出在这里buf=str.getBytes();
这一句把getBytes() 返回的引用赋给了buf所以buf 指向的已经不是原来的new byte[100];的内存空间了,那么这个byte 数组的长度和内容都不是原来的那样了。
--JAVA 中除了基本类型 (int double char ... 是值传递之外,其它的都是引用传递,了解C或C++的朋友都很容易理解,java 里所有的对象的实例都是放在它预先申请的堆内存里面的--方面它管理内存)
**************************补充********************************
你的程序结运行结果应是这样的
1,有server端On Server... I am client□□□□□□□□□□□□□□□□□□□□□□□□□□□□
2 在client端 On client... message form server...□□□□□□□□□□□□□□□□□□□□□□□□□□□□
运行的时候,要先运行server端的,不然server 和client都会处于阻塞状态。
至于为什么怎么会有这么多的小格子,是这样的,你读数据的时候应加一个记录读入长度的标记int len =in.read(bufR);
String str=new String(bufR,len);这样空格就会没有了。因为java 和C或C++不一样,C和C++string 都是一个以\0结尾 char 数组,程序从数组头读到\0就结束不管这个char 数组还有多大。java 的String 对象设计得不一样,它用两个byte 储存一个char 所以你长度为100的byte数组只能存50个字;。。。。
任何疑问
shmilyhe@163.com
blog.csdn.net/shmilyhe
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2016-07-28
你一看就是新手!
import java.net.*;
import java.io.*;
class UserTCP {
public static void main(String[] args) throws Exception
{
Socket socket=new Socket("localhost",8000);
DataInputStream in=new DataInputStream(socket.getInputStream());
DataOutputStream out=new DataOutputStream(socket.getOutputStream());

String str="I am client";
byte[] bufW =new byte[100];//读取缓冲区
byte[] bufR =new byte[100];//写入缓冲区
bufW=str.getBytes();

out.write(bufW);
in.read(bufR);
str=new String(bufR);
System.out.println("On client..."+" "+str);
}

}
你错误的原因:
byte[] buf =new byte[100]; //这里定义100个字符的缓冲区
buf=str.getBytes();//这时:buf就只有str.length大小的缓冲区了
所以你在Client里只显示前面11个字符。Do you Kown?
out.write(buf);
in.read(buf);本回答被提问者采纳
第2个回答  2010-05-04
这个问题比较隐晦。
主要错误出现在你对buf的复用上。
当你用 buf=str.getBytes();时,buf记录的是str的hashcode,也就是说buf实际上是记录str在内存中的位置和大小(注意,包括大小)!这里的str一开始是11个字符("I am client"),那么buf以后只会装载11个字符,别问我为什么,jvm就是这么搞的。后来你总结收到“message for”是吧?这就是因为它只接收11个字符的原因,不信你把"I am client"中加几个空格(到比"message form server..."这句话还长,那么结果是全部接收到了)。

正确的办法是重新定义一个byte数组用来接收,别用之前用过的byte数组了。

java中网络流的read方法,什么时候会返回
itjobjava老师讲过流的末尾会返回-1, 像你这种情况就是当对方将socket的输出流关闭后, 你将对方的输出都读完后,再读下一个字节就会返回-1.如果是用阻塞IO的话,它会选择阻塞,不会返回-1,直到timeout抛出异常。

为什么会报java.io.IOException: Unable to read entire header; 0...
1. 文件或网络资源不可用或已损坏。检查资源是否正常可用,文件或网络连接是否正常。2. 输入流的读取位置未正确设置。确保在调用`read()`方法前,输入流的读取位置正确设置。3. Java虚拟机(JVM)内存不足。在尝试读取大量数据时,JVM可能因内存不足而无法完成操作。增加JVM的堆内存大小可能会解决此问题...

javaio文件流read方法返回-1?
当文件读取完毕,read方法将返回-1,表示EOF状态。其次,针对标准输入(stdin),当没有更多的输入数据时,read方法同样会返回-1。最后,对于网络流(socket),在没有接收到数据或连接关闭后,read方法也会返回-1,提示EOF状态。

字节流VS字符流:揭秘两者的神秘面纱!
Java中的流可以分为文件流、网络流和过滤流三种类型。文件流用于处理文件,网络流用于处理网络连接,而过滤流用于对其他类型的流进行过滤和转换。在Java编程语言中,字节流处理的最基本单位为单个字节,它通常用来处理二进制数据。Java中最基本的两个字节流类是InputStream和OutputStream,它们分别代表了基本...

j2me开发,向文件写入中文字符时,末尾的数据丢失
b1 就可以进行下面的操作了。我的回答的依据是:用蓝牙进行 PC 与 J2ME 作网络流来传输数据时,若用你操作的方法,会出错,在手机的 RMS 中保存的是缺胳膊断腿的内容,我排除了网络连接的问题,因为我使用的是单一字节传输,不存在字节漏传的问题。在 JAVA 中用流可以解决很多问题,祝你成功!

谁知道什么是节点流和处理流
文件只是流可操作的IO设备之一,除了文件流,还有网络流,内存流,磁带流等等。数据流是一串连续传输的数据的集合,就像水管里的水流一样,在水管的一端一点一点的供水,而在水管的另一端看到的是一股连续不断的水流,用于写入数据的程序可以一段接一段的向数据流管道中写入数据,这些数据段按先后顺序...

java中的序列化和持久化之间的关系是什么
序列化就诞生了。工程师可以通过网络流的方式将类信息发送出去,也可以存在文件中。这种方式称为序列化。持久化呢,何谓持久?说白了就是将数据存在数据库中,这样数据就不会丢失。两者的关系就是雷锋和雷峰塔的关系,就是没有关系。好咯~ 如果想了解更多或是需要视频教程之类进阶一下的,可艾特我 ...

有个JAVA程序,读取实时视频,求可以修改为录像的工具,或者方法
将Java程序从读取实时视频修改为录像工具,可以遵循以下步骤和方法:修改数据源:确保程序能够接收来自视频流的数据,并保持数据流稳定。如果原程序已支持从实时视频源(如摄像头或网络流)读取,这部分可能不需要修改。添加存储逻辑:引入文件操作库(如Java NIO或Apache Commons IO),用于创建和管理文件。...

java方面的几个名词解释
Java虚拟机有自己想象中的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。4、节点流 流是字节序列的抽象概念。流和文件的差别:文件是数据的静态存储形式,而流是指数据传输时的形态。文件只是流的操作对象之一。流按其操作的对象不同可以分为文件流、网络流、内存流、磁带流等。Java流类可分为...

socket传输中,java的对象序列化和反序列化过程中是如何确保数据的完整...
·ObjectInputStream和ObjectOutputStream类所读写的对象必须实现了Serializable接口。对象中的transient(一种标记,表示变量是临时的)和static类型的成员变量不会被读取和写入。这两个类可以用于网络流中传送对象。( transient:java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,...

相似回答