簡體   English   中英

為什么在Java TCP中發送數據時套接字總是關閉

[英]Why the socket is always close when i send the data in java TCP

服務器類:該程序即將從客戶端接收數據,然后進行回復。 服務器正常...但是問題是服務器將答復發送給客戶端時。 客戶總是說“套接字關閉”。 我嘗試刪除secket close語句,但結果是相同的..,輸出顯示“套接字已關閉”。 所以請幫我解決這個問題...

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;

 public class Nomor3Server {

    public static final int SERVICE_PORT = 2020;

public static void main(String[] args) {
    try {
        ServerSocket server = new ServerSocket(SERVICE_PORT);
        System.out.println("DAytime service started");

        for (;;) {
            Socket nextClient = server.accept();

            BufferedReader pesan = new BufferedReader(new InputStreamReader(nextClient.getInputStream()));
            String messageIn = pesan.readLine();
            System.out.println("Received request from "
                    + nextClient.getInetAddress() + " : "
                    + nextClient.getPort()
                    + "\nIsi Pesan : " + messageIn);
            String messageOut = "انا لا ادر";

            switch (messageIn) {
                case "saya":
                    messageOut = "أنا";
                    break;
                case "kamu":
                    messageOut = "أنت";
                    break;
                default:
                    break;

            }

            OutputStream out = nextClient.getOutputStream();
            PrintStream pout = new PrintStream(out);

            pout.print(messageOut);

            out.flush();
            out.close();
            System.out.println("Message sent");
            //nextClient.close();
        }
    } catch (BindException e) {
        System.err.println("Server Already Running on port : " + SERVICE_PORT);
    } catch (IOException ioe) {
        System.err.println("error : " + ioe);

    }
}

}

客戶類別:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;


public class Nomor3Client {

    public static final int SERVICE_PORT = 2020;

public static void main(String[] args) {
    try {
        String hostname = "localhost";

        System.out.println("Connection Established");

        //for (;;) {

            System.out.println("Enter Your Message : ");
            BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
            String pesan = read.readLine();
            Socket daytime = new Socket(hostname, SERVICE_PORT);

            if (pesan.equals("exit")) {
                System.exit(0);
            } else {

                daytime.setSoTimeout(2000);

                OutputStream out = daytime.getOutputStream();
                PrintStream pout = new PrintStream(out);

                pout.print(pesan);

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



                BufferedReader messageIn = new BufferedReader(new InputStreamReader(daytime.getInputStream()));
                System.out.println("Respond : " + messageIn.readLine());
                System.out.println("diterima");


            }


            daytime.close();
        //}

    } catch (IOException e) {
        System.err.println("Error : " + e);
    }
}

}
            OutputStream out = daytime.getOutputStream();
            PrintStream pout = new PrintStream(out);

            pout.print(pesan);

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

https://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#getOutputStream()

關閉返回的OutputStream將關閉關聯的套接字。

在以下情況下,套接字會關閉:

  • 當您關閉插座時,
  • 當您關閉輸入或輸出套接字流時,
  • 關閉對象時,該對象將直接或間接包裝輸入或輸出套接字流,例如BufferedReaderScanner

服務器等級

            OutputStream out = nextClient.getOutputStream();
            PrintStream pout = new PrintStream(out);

            pout.print(messageOut);

            out.flush();
            out.close(); //Don't close this

客戶代碼:

OutputStream out = daytime.getOutputStream();
PrintStream pout = new PrintStream(out);

pout.print(pesan);

out.flush();
out.close(); //Don't close this

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM