java.net.SocketException错误。我究竟做错了什么?

时间:2019-04-28 05:29:52

标签: java sockets exception serversocket

我在JDeveloper上使用套接字适配器创建了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)

4 个答案:

答案 0 :(得分:0)

发生这种情况是因为您的服务器代码在接受套接字连接后退出。因此,该服务器的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();
    }
  }
}

答案 1 :(得分:0)

服务器代码:

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);

    }
}

以这种方式做。

答案 2 :(得分:0)

@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();
        }
    }

}

答案 3 :(得分:-1)

这应该做到

        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);
        }