简体   繁体   English

如何防止套接字在具有多个线程的程序中变为空(Java套接字线程编程)

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

Error message: 错误信息:

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

Screenshot of error 错误截图

Line 72: 第72行:

OutputStream os = socket.getOutputStream();

I am trying to get the same socket from the previous thread (ServerRecieve) but the socket is null at this point, I'm not sure how to prevent socket from being null or if there is a way to set the socket to something non-null globally that would work too if possible. 我正在尝试从上一个线程(ServerRecieve)中获得相同的套接字,但是此时套接字为null,我不确定如何防止套接字为null或是否有办法将套接字设置为非如果可能的话,全局为null也可以。

I am trying to create the server side of a program where messages are being sent and received simultaneously (like two people using a text messenger app on a phone) 我正在尝试创建程序的服务器端,在该程序中同时发送和接收消息(例如两个人在电话上使用Text Messenger应用程序)

Code of Server: 服务器代码:

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

    }
}

Full code of Client and Server and main file (more context): 客户端和服务器以及主文件的完整代码(更多上下文):

Server unable to send messages to client (java thread socket programming) 服务器无法将消息发送到客户端(Java线程套接字编程)

My question is: How do I resolve the error on line 72 while keeping the socket the same as the one in the previous thread (ServerRecieve)? 我的问题是:如何在保持套接字与上一个线程(ServerRecieve)相同的同时解决第72行的错误?

You are assuming that System.in() is thread safe. 您假设System.in()是线程安全的。 You should put this section in a synchronized block like this 您应该将此部分放在这样的同步块中

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

You will have to move the declaration 您将不得不移动声明

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

to your master thread, and then pass the reference of input to your worker threads. 到主线程,然后将输入的引用传递给工作线程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 使用Java中的线程进行套接字编程 - Socket programming using threads in Java 如何从线程的run方法内部的单独文件访问和/或读取命令行参数(Java套接字编程) - How to access and/or read command line arguments from a separate file inside the run method of a thread (java socket programming) 将数据从一个套接字线程广播到Java中所有现有的套接字线程 - Broadcasting Data from one socket thread to all existing socket threads in java Android和Java程序之间的套接字编程问题 - Issue With Socket Programming Between Android and Java Program 使用Java中的套接字编程对程序进行排序 - Sorting program using socket programming in java 使用套接字编程的Java中的聊天程序 - chat program in java using socket programming 如何在套接字编程中从Server(server.java)socket连续侦听PHP(client.php)套接字 - how to continuously listen PHP(client.php) socket from Server(server.java)socket in socket programming 如何防止拒绝服务在Java中耗尽套接字服务器上的线程池? - How do you prevent a denial of service from exhausting a thread pool on a socket server in Java? Java套接字编程中将文件从多个客户端发送到单个服务器 - File sending from multiple client to Single server in Java Socket Programming 如何在Java套接字编程中用单个服务器创建多个客户端? - how to create multiple clients with single server in java socket programming?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM