socket编程,服务器端抛出EOFException异常

yqsshr 2009-06-22 10:12:44

import java.net.*;
import java.io.*;
//服务器端程序
public class Server
{
public static void main(String[] args) throws Exception
{
ServerSocket ss = new ServerSocket(6666);
Socket s = ss.accept();

DataInputStream dis = new DataInputStream(s.getInputStream());
byte [] b = new byte[1024];
int i = 0;
while(dis.readByte() != -1) {
b[i] = dis.readByte();
i++ ;
}
FileOutputStream fos = new FileOutputStream("c:/ClientData.txt");
fos.write(b);
fos.flush();
fos.close();
dis.close();
s.close();
}
}
//客户端程序
import java.net.*;
import java.io.*;

public class Client
{
public static final String fileName = "c:" + File.separator + "TestClient.java";

public static void main(String[] args) throws Exception
{
Socket s = new Socket("127.0.0.1",6666);
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
FileInputStream fis = new FileInputStream(fileName);
byte[] b = new byte[fis.available()];
int len = fis.read(b); //读取数据到数组b中,返回读到的字节数len
dos.write(b, 0, len-1);
dos.flush();
fis.close();
dos.close();
}
}

/*单独运行Server.java和Client.java都不会报错,说明socket编程是没有问题的,但当运行Server.java后再运行Client.java抛出如下错误:
Exception in thread "main" java.io.EOFException
at java.io.DataInputStream.readByte(DataInputStream.java:250)
at Server.main(Server.java:15)
*/

我知道这是读取文件取到末尾的错误,但不知道怎么回事,Server.java:15(b[i] = dis.readByte();
)怎么会错呢?已经判断了文件结尾的啊(while(dis.readByte() != -1))!希望达人不吝赐教~
...全文
402 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yqsshr 2009-06-28
  • 打赏
  • 举报
回复
谢谢各位,学了不少,结贴了。
「已注销」 2009-06-24
  • 打赏
  • 举报
回复
1.readByte()每次都会读出一个字节,因此不能条件里判断一次,后面再读一次
2.判断流的结尾是用 read()!=-1而不是readByte()!=-1

readByte()返回 -128~127的byte值,如果到达流的结尾则会抛出 EOFException
read()如果有内容时返回0~255,等效于readByte()&0xFF
无内容可读时返回 -1
yqsshr 2009-06-23
  • 打赏
  • 举报
回复
只是为了想实现功能,呵呵,就没关注了,谢谢提醒!
97095639 2009-06-23
  • 打赏
  • 举报
回复
楼主要注意异常处理
yqsshr 2009-06-23
  • 打赏
  • 举报
回复
谢谢楼上的各位,都很有用!
diggywang 2009-06-23
  • 打赏
  • 举报
回复
这个异常可以不用理会
IniY0_0 2009-06-23
  • 打赏
  • 举报
回复
public final byte readByte() throws IOException {
int ch = in.read();
if (ch < 0)
throw new EOFException();
return (byte)(ch);
}
这是dis.readByte()调用的内部源码,楼主程序如果读到了末尾就肯定会抛出异常了
sunwei0325 2009-06-23
  • 打赏
  • 举报
回复
我根据自己以前的东西改了一下Server端,楼主可以参考一下

package test;

import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

public class Toyqsshr {
boolean started = false;
ServerSocket ss = null;

public static void main(String[] args) {
new Toyqsshr().start();
}

public void start() {
try {
ss = new ServerSocket(50000);
started = true;
} catch (BindException e) {
System.out.println("端口使用中....");
System.out.println("请关掉相关程序并重新运行服务器!");
System.exit(0);
} catch (IOException e) {
e.printStackTrace();
}

try {
while (started) {
Socket s = ss.accept();
Save2File r = new Save2File(s);
System.out.println(s.getInetAddress().toString() + " connected!");

new Thread(r).start();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (!ss.isClosed()) {
ss.close();
ss = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

/**
* 保存到文件
*/
class Save2File implements Runnable {
private Socket s = null;
private DataInputStream dis = null;
private PrintWriter pw = null;
byte[] buffer = new byte[2000];
String fileName = "c:/clientData.txt";

public Save2File(Socket s) {
this.s = s;
try {
dis = new DataInputStream(s.getInputStream());
pw = new PrintWriter(new BufferedWriter(new FileWriter(fileName, true/* 写入文件末尾 */)), true/* 自动刷新 */);
} catch (IOException e) {
e.printStackTrace();
}
}

@Override
public void run() {
try {
while (true) {
int num = dis.read(buffer);
System.out.println("读取了" + num + "个字节");
for (int i = 0; i < num; i++) {
pw.printf("0x%02X ", buffer[i]);
}
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (dis != null) {
dis.close();
dis = null;
}
if (pw != null) {
pw.close();
pw = null;
}
if (!s.isClosed()) {
s.close();
s = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
xiemk2005 2009-06-23
  • 打赏
  • 举报
回复
            ServerSocket ss = new ServerSocket(6666);
Socket s = ss.accept();

DataInputStream dis = new DataInputStream(s.getInputStream());
FileOutputStream fos = new FileOutputStream("c:/ClientData.txt");
byte [] b = new byte[1024];
int i = 0;
while((i = dis.read(b)) != -1) {
fos.write(b);
}
// fos.write(b);
fos.flush();
fos.close();
dis.close();
s.close();
sunwei0325 2009-06-23
  • 打赏
  • 举报
回复
写文件用PrintWriter比较好

PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("c:/ClientData.txt", true/*写入文件末尾*/)), true/*自动刷新*/);
gordonkkk 2009-06-22
  • 打赏
  • 举报
回复
你怎么跳着读啊?

while(dis.readByte() != -1) {
b[i] = dis.readByte();
i++ ;
}

你while条件里读的那个Byte就不要了?
你在那里判断没到末尾,怎么能确定下一个Byte没到末尾呢?
而且你最起码套一个Buffer流吧,而且可以用read(byte[] b)这个方法读啊。你这样写效率太低。

62,615

社区成员

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

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