簡體   English   中英

如何防止套接字在具有多個線程的程序中變為空(Java套接字線程編程)

[英]How to prevent socket from becoming null in a program with multiple threads (java socket thread programming)

錯誤信息:

Exception in thread "Thread-1" java.lang.NullPointerException
    at DirectMessengerServer$2.run(DirectMessengerServer.java:72)

錯誤截圖

第72行:

OutputStream os = socket.getOutputStream();

我正在嘗試從上一個線程(ServerRecieve)中獲得相同的套接字,但是此時套接字為null,我不確定如何防止套接字為null或是否有辦法將套接字設置為非如果可能的話,全局為null也可以。

我正在嘗試創建程序的服務器端,在該程序中同時發送和接收消息(例如兩個人在電話上使用Text Messenger應用程序)

服務器代碼:

import java.io.*;
import java.net.*;
import java.util.*;

import javax.imageio.IIOException;
//import static java.nio.charset.StandardCharsets.*;
public class DirectMessengerServer
{
    private static Socket socket;
    boolean KeepRunning = true;
    void ServerRun(String[] args) 
    {
        Thread ServerRecieve = new Thread () 
        {
            public void run ()
            {   
                System.out.println("Server recieve thread is now running");
                try
                {
                    System.out.println("Try block begins..");
                    int port_number1= Integer.valueOf(args[1]);
                    System.out.println("Port number is: " + port_number1);
                    ServerSocket serverSocket = new ServerSocket(port_number1);
                    //SocketAddress addr = new InetSocketAddress(address, port_number1);
                    System.out.println( "Listening for connections on port: " + ( port_number1 ) );

                    while(KeepRunning)
                    {
                        //Reading the message from the client

                        socket = serverSocket.accept();    
                        InputStream is = socket.getInputStream();
                        InputStreamReader isr = new InputStreamReader(is);
                        BufferedReader br = new BufferedReader(isr);
                        String MessageFromClient = br.readLine();
                        System.out.println("Message received from client: "+ MessageFromClient);


                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                finally
                {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        };ServerRecieve.start();

          Thread ServerSend = new Thread () 
            {

                public void run ()
                {   
                    System.out.println("Server sending thread is now running");
                    //if(socket!=null)
                    //{
                        try
                        {         
                    //  int port_number1= Integer.valueOf(args[1]);

                     //  ServerSocket serverSocket = new ServerSocket(port_number1);
                        //socket = serverSocket.accept();    
                        //Send the message to the server
                        OutputStream os = socket.getOutputStream();
                        OutputStreamWriter osw = new OutputStreamWriter(os);
                        BufferedWriter bw = new BufferedWriter(osw);

                        //creating message to send from standard input
                        String newmessage = "";
                        try 
                        {
                            // input the message from standard input
                            BufferedReader input= new BufferedReader( 
                            new InputStreamReader(System.in));
                            String line = "";

                            line= input.readLine(); 
                                newmessage += line + " ";

                        }
                        catch ( Exception e )
                        {
                            System.out.println( e.getMessage() );
                        }
                        String sendMessage = newmessage;
                        bw.write(sendMessage + "\n");
                        bw.flush();
                        System.out.println("Message sent to client: "+sendMessage);

                        }

                        catch (IOException e) 
                        {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    finally
                    {

                    }
              //  }
                }
            };ServerSend.start();

    }
}

客戶端和服務器以及主文件的完整代碼(更多上下文):

服務器無法將消息發送到客戶端(Java線程套接字編程)

我的問題是:如何在保持套接字與上一個線程(ServerRecieve)相同的同時解決第72行的錯誤?

您假設System.in()是線程安全的。 您應該將此部分放在這樣的同步塊中

synchronized(input){    
    line= input.readLine();
}

您將不得不移動聲明

BufferedReader input= new BufferedReader( 
                            new InputStreamReader(System.in));

到主線程,然后將輸入的引用傳遞給工作線程。

暫無
暫無

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

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