【问题标题】:java.net.SocketException Error. What am I doing wrong?java.net.SocketException 错误。我究竟做错了什么?
【发布时间】:2019-04-28 05:29:52
【问题描述】:

我在 JDeveloper 上使用 Socket Adapter 创建了一个 SOA 服务,我需要使用 Java 运行/测试它。所以我创建了一个服务器类和一个客户端类,但我得到一个错误

我对如何创建此服务并对其进行测试进行了一些研究,并在网上找到了一些有用的材料,但我遇到了一个错误,我不知道如何修复它。我对制作套接字服务器和其他东西非常陌生。

这是我的服务器类

package client;

import java.net.ServerSocket;
import java.net.Socket;

public class Class1 {

      try {

        ServerSocket socket = new ServerSocket(12110);
    Socket s=socket.accept();

          System.out.println("Connected!");

      } catch (Exception e) {
        e.printStackTrace();
      }

    }
}

这是我的客户端类

package client;

import java.io.BufferedReader;

import java.io.InputStreamReader;
import java.io.OutputStream;

import java.net.Socket;

public class Client{

    public static void main(String[] args) {

        try {
              Socket socket = new Socket("localhost", 12110);
              OutputStream os = socket.getOutputStream();
              os.write("FirstName,LastName\nWaslley,Souza\nJohn,Snow".getBytes());
              os.flush();
              socket.shutdownOutput();
              BufferedReader soc_in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
              String response = soc_in.readLine();
              System.out.println("Response: " + response);
              socket.close();

            } catch (Exception e) {
              e.printStackTrace();
            }

    }
}

这是我得到的错误:

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 client.Client.main(Client.java:23)

【问题讨论】:

  • 这是一个应用程序协议错误,这种情况经常发生。仅仅接受一个连接然后退出势必会让客户感到不安。你的客户正在发送一些东西。服务器需要读取它。你的客户正在阅读一些东西。服务器需要发送它。

标签: java sockets exception serversocket


【解决方案1】:

这是因为您的服务器代码在接受套接字连接后退出。因此,该服务器的 JVM 将退出并(除其他外)关闭它持有的所有套接字连接。这会在客户端生成SocketException。

要解决此问题,您应该阻止服务器的 JVM 退出,例如通过将 accept() 调用嵌套在 while 循环中:

public class Server {
  public static void main(String[] args) {
    try {
      ServerSocket socket = new ServerSocket(12110);
      while (true) {
        Socket s = socket.accept();
        System.out.println("Connected! to " + s);
      }
    } catch (final Exception e) {
      e.printStackTrace();
    }
  }
}

【讨论】:

  • 不完全。它导致connection reset 因为服务器尚未读取待处理的数据。如果没有待处理的数据,它将导致有序关闭。
  • 这不是我所看到的。在确保从传入连接中读取所有数据后,SocketException: Connection reset 仍会引发。我错过了什么?
  • 取决于平台。 Windows 将重置未关闭的套接字。除非有未读的待处理数据,否则 Unix 和 Linux 将正确关闭它们,然后将其重置。但是退出而不关闭总是错误的,关闭而不读取所有待处理的数据同上。
  • 我试过了,虽然我现在没有收到任何错误,但客户端没有显示任何响应。在服务器端,我收到成功消息
  • @Mike 该代码不包含服务器实际从套接字读取并写入回复或关闭它的重要部分。这不是这个问题的答案。
【解决方案2】:

服务器代码:

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;


public class Class1 {

    //static ServerSocket variable
    private static ServerSocket server;
    //socket server port on which it will listen
    private static int port = 12110;

    public static void main(String args[]) throws IOException, ClassNotFoundException {
        //create the socket server object
        server = new ServerSocket(port);
        //keep listens indefinitely until receives 'exit' call or program terminates
        while (true) {
            System.out.println("Waiting for the client request");
            //creating socket and waiting for client connection
            Socket socket = server.accept();
            //read from socket to ObjectInputStream object
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            //convert ObjectInputStream object to String
            String message = (String) ois.readObject();
            System.out.println("Message Received: " + message);
            //create ObjectOutputStream object
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            //write object to Socket
            oos.writeObject("Hi Client " + message);
            //close resources
            ois.close();
            oos.close();
            socket.close();
            //terminate the server if client sends exit request
            if (message.equalsIgnoreCase("exit")) {
                break;
            }
        }
        System.out.println("Shutting down Socket server!!");
        //close the ServerSocket object
        server.close();
    }

}

客户代码:

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {

    public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException, InterruptedException {
        //get the localhost IP address, if server is running on some other IP, you need to use that
        InetAddress host = InetAddress.getLocalHost();
        Socket socket = null;
        ObjectOutputStream oos = null;
        ObjectInputStream ois = null;

        //establish socket connection to server
        socket = new Socket(host.getHostName(), 12110);
        //write to socket using ObjectOutputStream
        oos = new ObjectOutputStream(socket.getOutputStream());
        System.out.println("Sending request to Socket Server");

        oos.writeObject("SEND SOME DATA");
        //read the server response message
        ois = new ObjectInputStream(socket.getInputStream());
        String message = (String) ois.readObject();
        System.out.println("Message: " + message);
        //close resources
        ois.close();
        oos.close();
        Thread.sleep(100);

    }
}

这样做。

【讨论】:

  • 他使用的是线条,而不是物体。
  • 是的,你能用线条演示一下吗?我有这一行 os.write("FirstName,LastName\nWaslley,Souza\nJohn,Snow".getBytes());我希望它能够工作并让我得到适当的回应..
  • @Mike 如果你有这个问题,你会遇到问题,你正在阅读线路但没有发送线路。使用println(),或在消息中添加行终止符。
【解决方案3】:

yo @Mike 抱歉,上次挖掘时不清楚这是完整的服务器代码

import java.net.ServerSocket;
import java.net.Socket;
import java.io.*;
public class Serv1 {
    public static void main(String[] args) {
        new Serv1().start();
    }
    public void start(){
        String input = "";
            try(ServerSocket socket = new ServerSocket(12110)) {
                System.out.println("Connected!");
                while (true) {
                try(Socket server = socket.accept()){
                    BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream(), "UTF-8"));
                    PrintStream echo = new PrintStream(server.getOutputStream());
                    while ((input = in.readLine()) != null && !input.equals(".")) {
                        System.out.println(input);
                        echo.println("Echoed: " + input);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

【讨论】:

    【解决方案4】:

    应该这样做

            String input= "";
            Socket server=socket.accept();
            BufferedReader  in = new BufferedReader(new InputStreamReader(server.getInputStream(), "UTF-8"));
            PrintStream echo = new PrintStream(server.getOutputStream());
            while((input = in.readLine()) != null && !input.equals(".")) {
                System.out.println(input);
                echo.println("echo: "+input);
            }
    

    【讨论】:

    • 我是在客户端还是服务器端写这个?因为我在客户端输入了这个,我在 accept() 上遇到了意外错误
    • @Mike 这是服务器代码。 accept() 告诉你。然而,张贴者当然应该解释他的代码。仅仅代码不是这里的答案。
    • 所以我将代码放在服务器中,作为响应,我得到了消息的第一行而不是其余的。有没有办法得到剩下的?
    • @user207421 我认为这是一种工作。但它只阅读第一行。有没有办法让它阅读整个消息?
    • @Mike 抱歉我上次听的不是很清楚是完整的代码
    猜你喜欢
    • 2014-06-15
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 2015-08-26
    相关资源
    最近更新 更多