gpt4 book ai didi

java - 如何修复java中的 "java.net.SocketException"错误

转载 作者:行者123 更新时间:2023-12-03 11:53:44 25 4
gpt4 key购买 nike

关闭客户端窗口时出错,打开新客户端窗口时服务器终端出现错误。我的英语生疏了:P

关闭客户端时出现服务器错误

java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:210)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at main.java.Manager.run(Manager.java:45)

重新打开以获取对象时出现客户端错误
java.io.StreamCorruptedException: invalid stream header: 73720013
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:866)
at java.io.ObjectInputStream.(ObjectInputStream.java:358)
at main.java.controllers.VendedoresUI.load(VendedoresUI.java:69)
at main.java.controllers.VendedoresUI.initialize(VendedoresUI.java:54)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
at main.java.controllers.Controller.loadUI(Controller.java:150)
at main.java.controllers.Controller.changeUI(Controller.java:111)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3470)
at javafx.scene.Scene$ClickGenerator.access$8100(Scene.java:3398)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3766)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:394)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$353(GlassViewEventHandler.java:432)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:431)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:937)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
at java.lang.Thread.run(Thread.java:748)

1.服务器类

1.1。服务器.java
公共(public)类服务器扩展线程{
    public Server(){}

public void run() {

try{

ServerSocket listener = new ServerSocket(4444);
listener.setSoTimeout(0);

System.out.println("Server is now running");

try {
while (true) {

Socket socket = listener.accept();

new Manager(socket).start();
}
} finally {
listener.close();
}

} catch (IOException ioexception){

System.out.println("\u001B[31mError opening server, more info: ");
System.out.println(ioexception);
System.out.println("Closing server...");
System.exit(0);

}

}

}

1.2.管理器.java
public class Manager extends Thread{
private Socket socket;
private BufferedReader in;
private PrintWriter out;

public Manager(Socket socket){
this.socket = socket;
System.out.println("\u001B[32m" + socket.getLocalAddress() + ":" + socket.getPort() + " connected");
}

@Override
public void run() {

try {

out = new PrintWriter(socket.getOutputStream(), true);

out.println("Connected");

while(true) {
ObjectOutputStream objectOutput = new ObjectOutputStream(socket.getOutputStream());
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));



if(in.readLine().contains(Protocols.VENDEDOR_GET_ALL)) {
ResultSet res = SQLManager.Query("SELECT * FROM vendedores");
List list = new ArrayList();

while (res.next()) {
Vendedor vendedor = new Vendedor();
vendedor.setNOME(res.getString("NOME"));
vendedor.setCPF(res.getString("CPF"));
vendedor.setCONTATO(res.getString("CONTATO"));
vendedor.setCONTA(res.getInt("CONTA"));
vendedor.setBANCO(res.getInt("BANCO"));
vendedor.setAGENCIA(res.getString("AGENCIA"));
vendedor.setCORRENTE(res.getString("CORRENTE"));
list.add(vendedor);
}
objectOutput.writeObject(list);
}
objectOutput.flush();
}

} catch (IOException e) {
System.out.println("\u001B[31m" + socket.getLocalAddress() + ":" + socket.getPort() + " disconnected");
e.printStackTrace();
interrupt();
} catch (SQLException | ClassNotFoundException e) {
Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, e);
}

}
}

2.客户端类

2.1。 ClientSocket.java
public class ClientSocket {

private static Socket socket = null;
private static BufferedReader in;
private static PrintWriter out;

public static void load(){
try {

socket = new Socket("127.0.0.1", 4444);
in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);

System.out.print(ClientSocket.getIn().readLine());

} catch(IOException ioexception){
Logger.getLogger(ClientSocket.class.getName()).log(Level.SEVERE, null, ioexception);
}
}

public static Socket getSocket() {
return socket;
}

public static BufferedReader getIn() {
return in;
}

public static PrintWriter getOut() {
return out;
}
}

2.2 VendoresUI.java
public class VendedoresUI implements Initializable {

@FXML
private TableView table;

@FXML
private TableColumn colName;

@FXML
private TableColumn colCPF;

@FXML
private TableColumn colContato;

@FXML
private TableColumn colConta;

@FXML
private TableColumn colBanco;

@FXML
private TableColumn colAgencia;

@FXML
private TableColumn colCorrente;

ObservableList list;

@Override
public void initialize(URL location, ResourceBundle resources) {

load();

}

private void load(){
try {
if(ClientSocket.getSocket().isClosed()){
ClientSocket.load();
}

PrintWriter escritor = new PrintWriter(ClientSocket.getSocket().getOutputStream(), true);

escritor.println(Protocols.VENDEDOR_GET_ALL);


ObjectInputStream obi = new ObjectInputStream(ClientSocket.getSocket().getInputStream());
List mList = (List) obi.readObject();

list = FXCollections.observableArrayList(mList);

colName.setCellValueFactory(new PropertyValueFactory("NOME"));
colCPF.setCellValueFactory(new PropertyValueFactory("CPF"));
colContato.setCellValueFactory(new PropertyValueFactory("CONTATO"));
colConta.setCellValueFactory(new PropertyValueFactory("CONTA"));
colBanco.setCellValueFactory(new PropertyValueFactory("BANCO"));
colAgencia.setCellValueFactory(new PropertyValueFactory("AGENCIA"));
colCorrente.setCellValueFactory(new PropertyValueFactory("CORRENTE"));
table.setItems(list);

} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}

}
}

最佳答案

对于第一个问题:关闭客户端时服务器错误,在关闭客户端之前,通知服务器并允许服务器停止处理。您可能可以忽略此异常,但有条不紊地关闭连接会很好。

在第二个问题上,客户端重新打开时出错(java.io.StreamCorruptedException:无效的流 header ):
调试后发现问题所在。下面的代码显示了问题所在。

复制粘贴并以 Junit 身份运行以查看它。

import org.junit.Test;    
import java.io.*;
import java.net.*;
import static java.lang.System.*;

public class ServerSocketTest {

/**
* Runs first to start server. This is the corrected server
*/
@Test
public void startServerTest() throws Exception {
ServerSocket listener = new ServerSocket(4444);
while (true) {
try (Socket socket = listener.accept()) {
new PrintWriter(socket.getOutputStream(), true).println("Connected");
new BufferedReader(new InputStreamReader(socket.getInputStream())).readLine();//read "ALL" from client
new ObjectOutputStream(socket.getOutputStream()).writeObject("String Object");
}
}
}

/**
* Run client Twice to see error
*/
@Test
public void startClientTest() throws Exception {
Socket s = new Socket("127.0.0.1", 4444);
out.println(new BufferedReader(new InputStreamReader(s.getInputStream())).readLine());
new PrintWriter(s.getOutputStream(), true).println("ALL");//tell server we want all the data
out.println(new ObjectInputStream(s.getInputStream()).readObject());
}

/**
* This implementation will error out on second test
*/
@Test
public void errorServerTest() throws Exception {
ServerSocket listener = new ServerSocket(4444);
while (true) {
try (Socket socket = listener.accept()) {
new PrintWriter(socket.getOutputStream(), true).println("Connected");
/*
* Issue is here. The sequence of object construction matters.
* The Constructor has side effects. To correct, move this contructor below InputStreamReader.
* */
ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
new BufferedReader(new InputStreamReader(socket.getInputStream())).readLine();//read "ALL" from client
objectOutputStream.writeObject("String Object");
}
}
}
}

基本上,问题在于 BufferedReader 和 ObjectOutputStream 之间的对象创建顺序。

要修复您的错误,请最后构造 ObjectOutputStream。

关于java - 如何修复java中的 "java.net.SocketException"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53896017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com