处理java.net.SocketException:多线程时Socket关闭了吗?

时间:2017-10-26 09:25:53

标签: java multithreading sockets server

我正在做一个学校项目,我们应该创建一个简单的酒店预订系统,然后将其用于服务器/客户端通信。 由于我想推动项目并做一个多线程程序,我得到了一个Socket Exception,我不确定如何处理。我到处寻找答案,我知道异常发生,因为我试图使用已经关闭的套接字。但是从我在Oracle-docs上读到的内容来看,他们的例子也是如此。

那么,这实际上是好的,只是我需要处理异常吗?因为我的代码运行正常,我只看到例外,因为我已经把e.printStackTrace();在我的捕获。

我的客户端类:

package client;

import java.io.*;
import java.net.Socket;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;

public class Client {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        try {

            Socket client = new Socket("localhost", 6066);

            //System.out.println("Just connected to " + client.getRemoteSocketAddress());

            OutputStream outToServer = client.getOutputStream();
            DataOutputStream out = new DataOutputStream(outToServer);

            InputStream inFromServer = client.getInputStream();
            DataInputStream in = new DataInputStream(inFromServer);

            LocalDate localDate = LocalDate.now();
            String date = DateTimeFormatter.ofPattern("yyy/MM/dd").format(localDate);

            System.out.println(in.readUTF());
            System.out.print("Namn: ");
            String name = sc.nextLine();
            System.out.print("Ålder: ");
            String age = sc.nextLine();

            out.writeUTF(name);
            out.writeUTF(age);
            out.writeUTF(date);

            System.out.println(in.readUTF());


            client.close();
        }catch(IOException e) {
            e.printStackTrace();
        }
    }

}

我的服务器类:

package server;

import java.io.IOException;
import java.net.*;


public class Server {

    public static void main(String [] args) throws IOException {

        int port = 6066;
        ServerSocket server = new ServerSocket(port);
        while(true) {
            System.out.println("Listening for client..");

            try {

                Socket connectedClient = server.accept();
                ClientHandle ch = new ClientHandle(connectedClient);
                Thread t = new Thread((Runnable) ch);
                t.start();

            }catch (IOException e) {

            }
        }
    }
}

然后我的ClientHandle类有服务器端的run():

package server;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.*;
import resources.*;

public class ClientHandle implements Runnable{

    Socket connectedClient;
    DataInputStream in;
    DataOutputStream out;

    public ClientHandle(Socket connectedClient) {
        this.connectedClient = connectedClient;
        try{
            this.in = new DataInputStream(this.connectedClient.getInputStream());
            this.out = new DataOutputStream(this.connectedClient.getOutputStream());
        }catch(IOException ex) {

        }
    }

    Hotel hotel = new Hotel();
    Ticket yourTicket = new Ticket();
    Server server = new Server();

    @Override
    public void run() {
            while (true) {
                try {

                    InetAddress host = InetAddress.getLocalHost();
                    System.out.println("Client " + host + " has connected.");

                    out.writeUTF("Välkommen till Hotel Gisslevik!\nVänligen fyll i nedan information för att slutföra din bokning.\n");

                    String yourName = in.readUTF();
                    String age = in.readUTF();
                    int yourAge = Integer.parseInt(age);

                    String date = in.readUTF();
                    yourTicket.setDate(date);

                    Person guest = new Person(yourName, yourAge);
                    hotel.setRooms();
                    Integer room = hotel.getRoom();
                    String rent = "J";

                    if (rent.indexOf("J") >= 0) {
                        yourTicket.setId(yourName);
                        if (hotel.checkIn(guest, room, yourTicket.getId(), yourTicket.getDate())) {
                            String yourId = yourTicket.getId();
                            out.writeUTF("\nDitt rum är nu bokat den " + date + ". \nBokningsnummer: " + yourId);
                        }
                    }

                    out.flush();
                    connectedClient.close();


                }catch (EOFException e) {


                } catch (IOException e) {
                    e.printStackTrace();
                    break;
                }
            }
    }
}

如果我只是评论e.printStackTrace();例外没有显示,但我想知道如何处理它们(如果它们应该被处理)。我已经在互联网上搜索了几天并检查了教程,但我找不到合适的答案。

我非常感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:2)

  

处理java.net.SocketException:Socket关闭

请勿关闭套接字,然后继续使用它。

  

多线程时?

不相关。

connectedClient.close()循环中有while (true)。解决方案:将其移到外面。