簡體   English   中英

PrintWriter 是 java 服務器中的 null

[英]PrintWriter is null in java Server

我在為 java 中的機器人設置服務器 - 客戶端連接時遇到問題。 我有兩個客戶端監聽兩個不同的端口。 當服務器發送錯誤時,PrintWriter 為 null。

也許這些方法在兩種不同的情況下。 但是我該如何解決呢?

服務器代碼:


import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;


public class Server {

    // port for the TCP/IP network
    private static int port = 30001;
    public void setPort(int newPort) {
        port = newPort;
    }
    private ServerSocket serverSocket;
    private Socket socket;

    private PrintWriter pw;

    public void start() throws IOException {
        System.out.println("Server: Hi, I am ready to serve you!");
        System.out.println("Server: Trying to connect.");
    
        // get a connection
        try {
            serverSocket = new ServerSocket(port);
            socket = serverSocket.accept();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("Server: I got a connection!");

        pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
    }

    public void sendString(String msg) {
        pw.println(msg);
        pw.flush(); 
    }

    public void stop() throws IOException {
        pw.close();
        socket.close();
        serverSocket.close();
        System.out.println("Server has stopped");
    }
}

協調 class 的代碼:

package ServerV4Test;

import java.io.IOException;

public class CoordinateServer {
    
    private Server myServer01 = new Server();
    private Server myServer02 = new Server();
    
    public void sendString(String msg) {
                    myServer01.sendString(msg);
                    myServer02.sendString(msg);
    }

    public void startServerMaster () throws IOException {
        System.out.println("The server coordinator started!");
        
                Server myServer01 = new Server();
                
                myServer01.setPort(30001);
                myServer01.start();
                
                Server myServer02 = new Server();

                myServer02.setPort(30002);
                myServer02.start();
    }
}

程序代碼:


import java.io.IOException;

public class ProgramServer {
        
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub

        CoordinateServer coordServer = new CoordinateServer();
        coordServer.startServerMaster();


            String sendString = "hello world";
    
            coordServer.sendString(sendString);
            
            coordServer.closeServerMaster();
    }
}

錯誤信息:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.io.PrintWriter.println(String)" because "this.pw" is null
    at ServerV4Test.Server.sendString(Server.java:40)
    at ServerV4Test.CoordinateServer.sendString(CoordinateServer.java:11)
    at ServerV4Test.ProgramServer.main(ProgramServer.java:16)

客戶端代碼:

import java.io.*;

import java.net.*;
import java.util.ArrayList;

public class Client {

    // set port and IP for the server
    private String hostname =  "localhost"; 
    private int port;
    public void setHostname (String sHost) {
        hostname = sHost;
    }
    public void setPort(int sPort) {
        port = sPort;
    }
    private InetSocketAddress address;
    private void createAddress() {
        address = new InetSocketAddress(hostname, port);
    }

    // create a list for the received strings
    private ArrayList<String> receivedList= new ArrayList<String>();

    public String getReceivedString() {
        String temp = receivedList.get(0); 
        receivedList.remove(0);
        return temp;
    }

    public boolean hasReceivedString() throws IOException {
        receiveString();
        if (receivedList.size() > 0) { 
            return true;
        }
        else {
            return false;
        }
    }

    private Socket socket;
    private BufferedReader bufReader;

    public void start() throws IOException {
        System.out.println("Client: I start myself!");
        System.out.println("Client: creating connection!");

        socket = new Socket();
        createAddress();

        socket.connect(address);

        System.out.println("Client: I got a connection!");

        InputStreamReader iStreamReader = new InputStreamReader(socket.getInputStream());
        bufReader = new BufferedReader(iStreamReader);
    }

    private void receiveString() throws IOException {
        while (bufReader.ready()) {
            if(bufReader.ready()) {
                String message = bufReader.readLine();
                receivedList.add(message);
            }
        }
    }

    public void stop() throws IOException {
        bufReader.close();
        socket.close();
        System.out.println("Client has stopped");
    }
}

客戶端程序:


import java.io.IOException;

public class ProgramUseClient1 {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        System.out.println("client testprogram started");

        // create an instance of the server
        Client myClient = new Client();

        myClient.setPort(30001);

        // start client
        myClient.start();

        // repeat receiving and sending
        boolean progRunning = true;
        while(progRunning) {

            // test if something is received
            if(myClient.hasReceivedString()) {
                String receivedString = myClient.getReceivedString();
                System.out.println("The client 1 received: " + receivedString);
                // test if client should be stopped
                myClient.stop();
                progRunning = false;
            }

        }
        System.out.println("Goodbye");
    }
}

您已經創建了陰影變量myServer01myServer02 ,其中全局變量沒有初始化PrintWriter pw 代替

Server myServer01 = new Server();

myServer01 = new Server();

同樣對於myServer02

這都是關於事件的時間安排......

當你實例化一個Server object 時,全局變量pw是 null。 直到調用Server#start()才正確實例化編寫器。 對您來說不幸的是, CoordiateServerServer對象運行之前調用sendString (從不調用start() )。

IMO,沒有理由需要延遲PrintWriter的創建。 確保它在Server構造函數中被實例化。

暫無
暫無

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

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