2017-05-15 1 views
0

오류 메시지와 함께 프로그램에서 널 (null)가되는 소켓을 방지하기 위해 이전 스레드 (ServerRecieve)에서 동일한 소켓을 얻으려면이 시점에서 소켓이 null 인 경우, 소켓이 null이되는 것을 방지하는 방법이나 그렇게 설정할 수있는 방법이 없는지 확실하지 않습니다. 가능한 경우 작동 할 것입니다.방법은 여러 스레드 (자바 소켓 스레드 프로그래밍)

메시지 전송과 동시에 수신되고 어디는 프로그램의 서버 측을 만들려고하고 서버의

코드 (전화에 텍스트 메신저 응용 프로그램을 사용하여 이명 등) :

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

    } 
} 
클라이언트 및 서버와 주요 파일 (더 문맥)의

전체 코드 :

Server unable to send messages to client (java thread socket programming)

내 질문은 : 어떻게 이전 스레드 (ServerRecieve)의 소켓과 소켓을 동일하게 유지하면서 72 행의 오류를 해결합니까?

+0

@SteveSmith 두 번째 스레드에서 해당 주석을 제거하면 "주소가 이미 사용 중입니다"라는 오류가 발생합니까? 또는 코드에서 다른 라인을 참조하고 있습니까 (라인 72 근처가 아님)? –

답변

0

System.in()은 스레드로부터 안전하다고 가정합니다. 당신은 당신이 당신의 마스터 스레드 선언을

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

를 이동 한 다음 작업자 스레드에 입력의 참조를 전달해야합니다이

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

같은 동기화 블록에이 절을 넣어해야합니다.

+0

"line = input.readLine(); newmessage + = line +"행을 "synchronized (input) {line = input.readLine();"로 바꾸면 "여전히 nullpointer 예외와 같은 오류가 발생합니다 ... null이되지 않고 모든 스레드가 소켓에 액세스 할 수있게하는 방법이 있습니까? (ServerRecieve 스레드의 마스터 스레드 또는 다른 파일의 기본 파일 스레드입니까?) –