当我试图从客户端向服务器发回数据时(它可以被看作是一种POST,尽管我没有使用http),我得到了一个java.io.EOFException。
我的客户源码:
Socket clientSocket = new Socket(serverIpAddr, IConstant.ServerPort);
OutputStream out = clientSocket.getOutputStream();
out.write(dataByteArray);
out.flush();
if(out!=null)
out.close();
if(clientSocket!=null)
clientSocket.close();我的服务器源代码:
try{
ServerSocket serverSocket = new ServerSocket(IConstant.ServerPort);
while(true)
{
Socket connectionSocket = serverSocket.accept();
ObjectInputStream ois = new ObjectInputStream(connectionSocket.getInputStream());
Object obj = ois.readObject();
byte[] bytes = (byte[])obj;
System.out.println("A notification has been received");
//process bytes
//...
}
} catch(IOException ex){
ex.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}下面是我构建dataByteArray对象的方法(其中PlayList是一个实现java.io.Serializable的POJO ):
private byte[] serializePlayList(PlayList playList) throws IOException{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] byteArray = null;
ObjectOutput out = null;
try {
out = new ObjectOutputStream(bos);
out.writeObject(playList);
out.flush();
byteArray = bos.toByteArray();
} finally {
try {
bos.close();
} catch (IOException ex) {
}
}
return byteArray;
}每当服务器尝试执行ois.readObject()时,都会抛出java.io.EOFException。有谁能解释一下原因吗?
发布于 2017-10-25 00:37:18
您应该在Object中发送playList
客户端:
Socket clientSocket = new Socket(serverIpAddr, IConstant.ServerPort);
ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream();
out.writeObject(playlist);服务器:
ServerSocket serverSocket = new ServerSocket(IConstant.ServerPort);
Socket connectionSocket = serverSocket.accept();
ObjectInputStream ois = new ObjectInputStream(connectionSocket.getInputStream());
PlayList playList = (PlayList) ois.readObject();发布于 2018-11-04 01:42:41
您可以使用thread和get来启动线程,即空间类中的线程
如下所示:
public class receive extends Thread{
public Socket socket = null;
ObjectInputStream din = null;
data_socket respon = null ;
data_socket dtsk = new data_socket();
public receive(Socket skt) {
this.socket=skt;
}
@Override
public void run(){
try {
din = new ObjectInputStream(this.socket.getInputStream());
while(true){
respon=(data_socket)din.readObject();
switch(respon.action){
case "login" : this.check_login(); break;
case "afeef" : this.afeef();break;
default : System.out.println("unknow action");
}
}
} catch (IOException ex) {
System.out.println("::::::::::::::::::ERROR 1::::::::::::::::"+ex.toString());
System.out.println("You r Lost connect to server ");
System.exit(0);
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("::::::::::::::::::ERROR 2::::::::::::::::"+e.getException());
}
}发布于 2017-03-06 11:03:37
我在尝试发送数据时收到
java.io.EOFException
不,你不是。你在尝试接收数据时得到了它。
您的发送代码没有任何意义。您只需将PlayList对象直接序列化为现有的ObjectOutputStream,而不是使用ByteArrayOutputStreams和每次发送一个新的对象流来处理所有这些骗局。
因此,您还应该将readObject()的结果直接转换为PlayList。
读取代码应该循环,直到EOFException被捕获,这意味着对等设备关闭了连接。
注意在您正在测试的点上,clientSocket和out不可能为空。
https://stackoverflow.com/questions/42611998
复制相似问题