我正在使用java套接字构建一个简单的客户端/服务器应用程序并尝试使用ObjectOutputStream等.
当我讨论通过套接字传输对象时,我一直在这个URL http://java.sun.com/developer/technicalArticles/ALT/sockets开始关注教程.
请参阅我的客户端代码http://pastebin.com/m37e4c577然而,这似乎不起作用,我无法弄清楚什么是不起作用.底部注释掉的代码直接从教程中复制出来 - 当我只使用它而不是创建客户端对象时,这就有效.
任何人都可以看到我做错了吗?
我在applet端有以下代码:
URL servlet = new URL(appletCodeBase, "FormsServlet?form=requestRoom");
URLConnection con = servlet.openConnection();
con.setDoOutput(true);
con.setDoInput(true);
con.setUseCaches(false);
con.setRequestProperty("Content-Type", "application/octet-stream");
ObjectOutputStream out = new ObjectOutputStream(con.getOutputStream());
out.writeObject(user);//user is an object of a serializable class
out.flush();
out.close();
ObjectInputStream in = new ObjectInputStream(con.getInputStream());
status = (String)in.readObject();
in.close();
if("success".equals("status")) {
JOptionPane.showMessageDialog(rootPane, "Request submitted successfully.");
} else {
JOptionPane.showMessageDialog(rootPane, "ERROR! Request cannot be made at this
time");
}
Run Code Online (Sandbox Code Playgroud)
在servlet方面,我收到如下代码:
form = request.getParameter("form");
if("requestRoom".equals(form)) {
String fullName, eID, reason;
UserRequestingRoom user;
try {
in = new ObjectInputStream(request.getInputStream());
user = (UserRequestingRoom)in.readObject(); …Run Code Online (Sandbox Code Playgroud) public static void main(String[] args) throws Exception {
Socket socket = new Socket("127.0.0.1", 2345);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
Map<Integer, Integer> testMap = new HashMap<Integer, Integer>();
testMap.put(1,1);
oos.writeObject(testMap);
oos.flush();
testMap.put(2,2);
oos.writeObject(testMap);
oos.flush();
oos.close();
}
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(2345);
Socket s = ss.accept();
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
System.out.println((HashMap<Integer, Integer>) ois.readObject());
System.out.println((HashMap<Integer, Integer>) ois.readObject());
ois.close;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码来自两个文件.运行它们时,控制台会打印相同的结果:
{1=1}
{1=1}
Run Code Online (Sandbox Code Playgroud)
怎么会发生这种情况?
在客户端和服务器类中,我有一个完全相同的内部类,称为Data.使用以下命令从服务器发送此Data对象:
ObjectOutputStream output= new ObjectOutputStream(socket.getOutputStream());
output.writeObject(d);
Run Code Online (Sandbox Code Playgroud)
(其中d是Data对象)
在客户端接收此对象并强制转换为Data对象:
ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
Object receiveObject = input.readObject();
if (receiveObject instanceof Data){
Data receiveData = (Data) receiveObject;
// some code here...
}
Run Code Online (Sandbox Code Playgroud)
我正在接受java.lang.ClassNotFoundException: TCPServer$Data这条线Object receiveObject = input.readObject();
我的猜测是它试图在服务器端寻找Data类而无法找到它,但我不确定......我该如何解决这个问题?
java tcp objectoutputstream objectinputstream classnotfoundexception
我对java有一个奇怪的问题.我想在ObjectOutputStream中写一个byte []并从那里写到一个新文件.该字节数组表示从磁盘读取的另一个文件.
之后,在写入新创建的文件后,我想从该文件中读取.但是现在从ObjectInputStream读取的byte []与写入的不同.
这就是我的问题:为什么这个字节[]不同?
为了清楚说明并让每个人都检查,我写了一个简短的程序,它将准确地表明我的意思:
import java.io.*;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.security.MessageDigest;
import org.bouncycastle.util.encoders.Hex;
public class MyTest {
public static void main(String[] args) throws Exception {
// 1st step:
// ------------------------------------------------
byte[] data = openFile();
// Create file to write
FileOutputStream fos = new FileOutputStream(new File("test"));
ObjectOutputStream oosf = new ObjectOutputStream(fos);
// Write byte[]-length and byte[]
oosf.writeInt(data.length);
oosf.write(data);
// Flush & Close
fos.flush();
fos.close();
// Print hash value of saved byte[]
try {
final MessageDigest messageDigest …Run Code Online (Sandbox Code Playgroud) 我对编程完全陌生,所以我很难解决自己的错误。有人建议我在这个网站上尝试一下,所以我想为什么不试一试。
我发现的有关此错误的其他帖子似乎不太相关:大多数人建议关闭输入流,但我的代码已经这样做了。
我想要它做什么:将一个名为“photo”的 Photo 对象写入一个名为“test.ser”的文件中。然后读取文件“test.ser”并将“test.ser”中对象(“photo”)的路径返回给我。
它的实际作用:将一个名为“photo”的 Photo 对象写入“test.ser”。读取“test.ser”,返回一个 EOFException 并且没有路径。
返回路径实际上并不是很重要,只要它返回对我有价值的东西即可。但是当我使用“System.out.println(photo)”或“photo.getId()”时,我遇到了同样的错误。
我不太确定我需要在这里粘贴什么,所以我将发布用于序列化和反序列化对象的两个 try/catch-es:
序列化对象:
File test = new File("path.../something.ser");
Photo photo = new Photo(2, "..\\images\\2.jpg", getImage("..\\images\\2.jpg"));
try {
FileOutputStream fos = new FileOutputStream(test);
ObjectOutputStream out = new ObjectOutputStream(fos);
if (!test.exists()) {
test.createNewFile();
}
out.writeObject(photo);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
反序列化对象:
try {
FileInputStream fis = new FileInputStream(test);
ObjectInputStream in = new ObjectInputStream(fis);
in.readObject();
photo = (Photo)in.readObject();
photo.getPath();
in.close();
} catch (Exception e) {
e.printStackTrace();
} …Run Code Online (Sandbox Code Playgroud) 我写了以下简单的代码
public static void main(String args[]) throws FileNotFoundException, IOException, ClassNotFoundException
{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("data.txt")));
Human human = new Human();
human.setAge(21);
human.setName("Test");
System.out.println("Human : " + human);
oos.writeObject(human);
human.setName("Test123");
oos.writeObject(human);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("data.txt")));
Human newHuman1 = (Human)ois.readObject();
System.out.println("newHuman1 :" + newHuman1);
Human newHuman2 = (Human)ois.readObject();
System.out.println("newHuman2 :" + newHuman2);
}
Run Code Online (Sandbox Code Playgroud)
它打印 -
Human : Human [age=21, name=Test]
newHuman1 :Human [age=21, name=Test]
newHuman2 :Human [age=21, name=Test]
Run Code Online (Sandbox Code Playgroud)
我无法理解为什么它不打印
newHuman2 :Human [age=21, name=Test123]
Run Code Online (Sandbox Code Playgroud)
为什么更改实例状态不会反映在序列化对象中?
java serialization objectoutputstream objectinputstream deserialization
是否可以从ObjectInputStreamwhile 循环中读取,该循环将因套接字超时引发的异常而终止socket.setSoTimeout(4000);
while(Object obj = ois.readObject()) { <-- Not Working
//do something with object
}
Run Code Online (Sandbox Code Playgroud) 我正在用Java 制作网络程序。正如标题所示,服务器尝试发送的对象在接收它的客户端中发生了变化。我试图在从服务器收到新对象之前更改客户端中存在的对象。这是我的代码。第一个是 Server.sendIdea,第二个是 Client.rcvIdea。
void sendIdea(Idea _idea) throws IOException {
objectOS.flush();
Idea idea = _idea;
//when I look into 'idea' it's fine
objectOS.writeObject(idea);
}
Run Code Online (Sandbox Code Playgroud)
..
Idea rcvIdea(int _ideaCode) throws ClassNotFoundException, IOException {
objectOS.writeObject("sendIdea");
objectOS.writeObject(_ideaCode);
Idea returnValue = (Idea) objectIS.readObject();
//when I look into 'returnValue', it is not the one 'sendIdea' has sent.
return returnValue;
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,正在使用方法sendIdea(Idea _idea)从类发送对象。并通过使用方法接收对象。(我相信你不必详细了解类)。客户端通过这种方法实际上在程序启动时收到了一些s,没有任何问题。但是,当我尝试通过此方法接收相同但略有更改的对象时,在类中该对象不会更改,不像在类中将通过方法发送的对象被正确更改。我尝试了大约5个小时来解决这个问题。我逐行检查了所有代码,没有发现任何结果。我很确定 writeObject 或 readObject 方法有问题。我试图澄清这条流和许多其他试验。我希望我能找到问题所在。下面是我程序中的一些代码IdeawriteObjectrcvIdea()readObject()IdeaIdeaIdeaClientServersendIdeaobjectOS.flush()
Client.class包ideaOcean;
import java.awt.HeadlessException;
import java.io.IOException;
import …Run Code Online (Sandbox Code Playgroud) 我的 Android 应用程序中有以下代码,不确定是否是我的谷歌搜索技能,但找不到关于如何监控 InputStream 进度的好教程。
private void restoreFromUri(Uri uri) {
try {
InputStream is = getContentResolver().openInputStream(uri);
ObjectInputStream ois = new ObjectInputStream(is);
ArrayList<String> myList = (ArrayList) ois.readObject();
ois.close();
is.close();
} catch (Exception e) {
Snackbar.make(snackView, e.getMessage(), Snackbar.LENGTH_LONG).show();
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码运行良好,但在内容来自 GMail 的情况下,即使是一个小文件也需要几秒钟来读取和填充 ArrayList。
是否可以显示带有文件/内容读取百分比的进度条?
java ×10
eofexception ×2
sockets ×2
android ×1
bytearray ×1
hashmap ×1
inputstream ×1
stream ×1
tcp ×1
uri ×1