- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试制作一个套接字程序来同步两台电脑上的文件。所以基本上,我首先尝试进行单向同步。那么发生的事情是..
我的错误出现在服务器端,它显示:
java.net.SocketException: Socket is closed
at java.net.Socket.getOutputStream(Unknown Source)
at ee4210.TcpServer$ConnectionRequestHandler.run(TcpServer.java:116)
at ee4210.TcpServer.handleClientRequest(TcpServer.java:80)
at ee4210.TcpServer.startServer(TcpServer.java:72)
at ee4210.TcpServer.main(TcpServer.java:39)
我相信它与ObjectOutputStream和ObjectInputStream有关,因为如果我不关闭ObjectOutputStream或ObjectInputStream,它就可以工作。
客户端可以同时使用ObjectOutputStream和ObjectInputStream来发送/接收对象吗?同样,服务器也可以两者兼得吗?
感谢您的帮助。抱歉发了这么长的帖子。我喜欢尽可能详细。
我的客户代码:
package ee4210;
import java.io.* ;
import java.net.* ;
import java.util.* ;public class TcpClient{
static ObjectOutputStream out;
static ObjectInputStream in;
String message;
int portNo=2004;
static Socket _socket = null;
InetAddress host = null;
static LinkedList destinationfiles = new <String>LinkedList();
static LinkedList sourcefiles = new <String>LinkedList();
static LinkedList missingfiles = new <String>LinkedList();
String filename=null;
TcpClient(){}
public static void listFilesForFolder(final File folder) { //no need to read this
for (final File fileEntry : folder.listFiles()) {
if (fileEntry.isDirectory()) {
listFilesForFolder(fileEntry);
} else {
//System.out.println(fileEntry.getName());
destinationfiles.add(fileEntry.getName());
}
}
}
public static void getListfromPeer() {
try {
in=new ObjectInputStream(_socket.getInputStream());
sourcefiles = (LinkedList) in.readObject();
//in.close(); //if i close, got error
} catch (ClassNotFoundException | IOException classNot) {
System.err.println("data received in unknown format");
}
}
public static void compareList() {
// go through each of the peer's filename, check against urs. If dont
// have, download
ListIterator iter = sourcefiles.listIterator();
String filename;
while (iter.hasNext()) {
// System.out.println(iter.next());
filename=(String) iter.next();
if (!destinationfiles.contains(filename)) //file cannot be found
{
missingfiles.add(filename);
}
}
}
public static void main(String[] args) {
/*Check if directory exist, create one if doesnt exit*/
File theDir = new File("src/ee4210/files");
// if the directory does not exist, create it
if (!theDir.exists()) {
System.out.println("creating directory..");
boolean result = theDir.mkdir();
if (result) {
System.out.println("Successfully created directory");
}
}
/*Get the list of files in that directory and store the names in array*/
listFilesForFolder(theDir);
/*Connect to peer*/
try {
new TcpClient().connect();
//new TcpClient().checkForInput();
} catch (Exception e) {
System.out.println("Something falied: " + e.getMessage());
e.printStackTrace();
}
}
public void connect() throws IOException
{
try {
host = InetAddress.getLocalHost();
//_socket = new Socket(host.getHostName(), portNo);
_socket = new Socket("172.28.177.125", portNo);
//System.out.println(host.getHostAddress()); //get the IP address of client
/*Get list from peer and compare list*/
getListfromPeer(); //receive from Server
compareList();
System.out.println(missingfiles);
/*Send to server the list of missing files*/
do
{
//busy wait till socket is open
}while (_socket.isClosed());
out = new ObjectOutputStream(_socket.getOutputStream());
out.flush();
out.writeObject(missingfiles);
out.flush();
System.out.println("Client have finished sending missing linkedList over");
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
服务器代码:
package ee4210;
import java.io.*;
import java.net.*;
import java.util.*;
public class TcpServer extends Thread
{
ServerSocket providerSocket;
Socket connection = null;
static ObjectOutputStream out;
ObjectInputStream in;
String message;
int portNo=2004; //portNo is 2004
TcpClient tcpclientobject = new TcpClient();
static LinkedList destinationfiles = new <String>LinkedList();
static LinkedList missingfiles = new <String>LinkedList();
public static void main(String[] args)
{
/*Check if directory exist, create one if doesnt exit*/
File theDir = new File("src/ee4210/files");
// if the directory does not exist, create it
if (!theDir.exists()) {
System.out.println("creating directory..");
boolean result = theDir.mkdir();
if (result) {
System.out.println("Successfully created directory");
}
}
/*Get the list of files in that directory and store the names in array*/
listFilesForFolder(theDir);
/*Connect*/
try {
new TcpServer().startServer();
} catch (Exception e) {
System.out.println("I/O failure: " + e.getMessage());
e.printStackTrace();
}
/*Rest of the code in run()*/
}
public static void listFilesForFolder(final File folder) {
for (final File fileEntry : folder.listFiles()) {
if (fileEntry.isDirectory()) {
listFilesForFolder(fileEntry);
} else {
//System.out.println(fileEntry.getName());
destinationfiles.add(fileEntry.getName());
}
}
}
public void startServer() throws Exception {
ServerSocket serverSocket = null;
boolean listening = true;
try {
serverSocket = new ServerSocket(portNo);
} catch (IOException e) {
System.err.println("Could not listen on port: " + portNo);
System.exit(-1);
}
while (listening) {
handleClientRequest(serverSocket);
}
serverSocket.close();
}
private void handleClientRequest(ServerSocket serverSocket) {
try {
new ConnectionRequestHandler(serverSocket.accept()).run();
} catch (IOException e) {
e.printStackTrace();
}
}
public class ConnectionRequestHandler implements Runnable{
private Socket _socket = null;
public ConnectionRequestHandler(Socket socket) {
_socket = socket;
}
public void run() {
System.out.println("Client connected to socket: " + _socket.toString());
/*Send the linkedlist over*/
try {
out = new ObjectOutputStream(_socket.getOutputStream());
//out.flush();
out.writeObject(destinationfiles);
out.flush();
//out.close(); //if I close, will have errors
} catch (IOException e) {
e.printStackTrace();
}
receiveMissingFileNames(); //this one is still ok
try { //if i put the close here its ok
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
out = new ObjectOutputStream(_socket.getOutputStream()); //when I add this line it shows the error
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void receiveMissingFileNames()
{
try {
in=new ObjectInputStream(_socket.getInputStream());
System.out.println("Is the socket connected="+_socket.isConnected());
missingfiles=(LinkedList) in.readObject();
System.out.println(missingfiles);
in.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
最佳答案
java.net.SocketException: Socket is closed
该异常意味着您关闭了套接字,然后继续尝试使用它。
关闭套接字的输入流或输出流会关闭另一个流和套接字。
关于java - 多个 ObjectOutputStream 和 ObjectInputStream 出错(套接字已关闭),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15130271/
我正在尝试按照只能处理 GET 查询的指令编写一个最简单的 Java Web 服务器程序。主要思想是从套接字获取一个ObjectOutputStream,使用ObjectInputStream打开本地
我曾经使用带有 Java 的 Android Studio 在 Android 中保存项目。但是现在我想在我用 Flutter SDK(Dart 语言)重写的应用程序中准确地读取这些数据。但似乎编写的
我正在尝试使用 ObjectOutputStream 将几个对象写入文件。之后,我使用 ObjectInputStream 读取该文件。问题是,我只能读取文件中的第一个对象。当我用 Notepad++
我在解决一个实现问题时遇到了麻烦,我有一个类,它的行为类似于列表,但不是将文件保存在某个集合中,而是将它们保存在磁盘上。 当我想向列表中添加一些元素时,就会出现问题。在文件的开头,我有一个 int 告
有没有办法强制 ObjectOutputStream 不依赖以前的写入,应该每次都写入对象属性和完整信息? 我可以从二进制文件中看到,它只写入以前版本的某种增量,如果您尝试加载随机项,它会失败? 最佳
客户端代码: try { Socket socket = new Socket(ip, port); OutputStream output = soc
Socket Client = new Socket("ip", port); private ObjectOutputStream out; out = new ObjectOutputStream
通过 ObjectOutputStream 发送自制对象时,该对象的服务器类和客户端类必须相同吗? 例如,当某个Action只能在服务器上执行时,因为它需要其他几个仅在服务器上可用的类,那么客户端上的
我的项目由两部分组成:服务器端和客户端。当我启动服务器端时,一切正常,但是当我启动客户端时,我会收到此错误: java.io.IOException: stream active at jav
我有这三个类(class): 命令: package pack; public abstract class Command impements java.io.Serializable {
在我的软件中,我需要通过 ObjectOutputStream 在客户端和服务器之间发送消息。 sender方法的核心如下: .... try { objWriter.writeUnshare
我想向文件添加大量数据。我定义了 HYB 类,因为我的对象包含不同类型的数据(String 和 byte[])。我使用 ObjectOutputStream 和 ObjectInputStream 来
我目前正在学习网络,特别是客户端服务器类(class)。我做了很多研究并实现了各种测试程序,但我无法弄清楚为什么/何时需要使用flush()方法。 总是由输入流读入,怎么可能会有数据误留在输出流中呢?
我正在开发 Android 应用程序,我想提交用户名和密码。我现在正在做的是: 为密码创建哈希值 通过 HTTP 请求连接到身份验证服务器 通过 ObjectOutputStream 发送用户名/哈希
我有一个使用 SSLSocket 连接到服务器的客户端。接下来,我尝试使用 ObjectOutputStream oos = new ObjectOutputStream(sslsocket.getO
这个问题在这里已经有了答案: StreamCorruptedException: invalid type code: AC (1 个回答) 关闭 5 年前。 我试图通过单个 发送不同类的多个可序列
我见过一些人问过类似的问题,但任何人发布的唯一答案是你不应该这样做。 但我已经对这两种方式进行了测试 - 它只适用于这种方式。 服务器端 try { // Obtain inp
我正在尝试编写一款地下城大师游戏,英雄将穿过不同的房间并与怪物战斗并获取元素。我想每次英雄达到新级别时都保存它,但即使我已经在英雄及其使用的所有内容上实现了可序列化,我还是收到了IOException
我正在尝试构建一个客户端-服务器 IDE,但在从内存中编译/运行类获取运行时异常的错误日志/异常日志时遇到问题。 我的代码如下所示: public class ServerThread impleme
我在处理之前提出的 question 时遇到了这个问题。 这可能特定于 ObjectInputStream 而不是一般的二进制读取,因此标题可能具有误导性。 从那里开始的问题基本上是这样的:作者已经将
我是一名优秀的程序员,十分优秀!