오류 메시지와 함께 프로그램에서 널 (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 행의 오류를 해결합니까?
@SteveSmith 두 번째 스레드에서 해당 주석을 제거하면 "주소가 이미 사용 중입니다"라는 오류가 발생합니까? 또는 코드에서 다른 라인을 참조하고 있습니까 (라인 72 근처가 아님)? –