[英]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();
}
}
客戶端和服務器以及主文件的完整代碼(更多上下文):
我的問題是:如何在保持套接字與上一個線程(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.