나는 서로 연동하는 두 개의 응용 프로그램이 있습니다. 하나는 GUI 인터페이스가 없으며 데이터베이스에 대한 쿼리를 처리하고 클라이언트의 요청을 처리하는 "서버"유형의 앱입니다. 다른 하나는 주로 GUI이고 사용자가 구조화 된 방식으로 데이터베이스 정보와 상호 작용하는 "클라이언트"입니다.스트림 - ObjectOutputStream NULL을 제공
호/트러블/HELP는
내가 서버에 성공적으로하고 아무런 문제없이 하나의 객체 (문자열 [])로 보낼 수 있다는 데 문제를 필요로했다. 클라이언트 응용 프로그램이 그것을 전송, 서버 응용 프로그램이 그것을 처리 성공적으로 처리합니다.
두 번째 String []을 보내려고하면 클라이언트가 배열을 컴파일하고 보낸다 고 생각하지만 서버는 결코 수신하지 않고 (null 만 가져옴) IOException을 생성합니다.
동일한 위치와 동일한 텍스트를 정확히 동일한 형식 및 위치에 포함하는 배열의 경우에도 마찬가지입니다.
의 printStackTrace (의해 생성 된 에러)이다
Java.io.OptionalDataException
at java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1367)
at java.io.ObjectInputStream.readObject (ObjectInputStream.java:369)
at server.ConnectionThread.processClientRequests(ConnectionThread:204)
at server.ConnectionThread.processClientRequests(ConnectionThread:50)
at javalang.Thread.run(Thread.java:722)
ObjectStream의이으로부터 판독되고있는 점이다 라인 (204)에서 코드 :
String[] addArray = (String[]) ois.readObject();
OIS는 ObjectInputStream를이고이
private ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
CLIE NT 코드는 서버 응용 프로그램 이러한 개체를 전송하는 데 사용되는 클라이언트 코드
입니다이 동일한 코드 형식이라는 것이다
ObjectToServer.writeObject(String[] var);
ObjectToServer.flush();
ObjectToServer.reset();
코멘트 나에게 이해가되지 않습니다 무엇
"null"을 보내지 않고도 SERVER의 objectOutputStream에 대한 String []을 성공적으로 클라이언트 응용 프로그램에 전송하는 데 사용됩니다.
Google에서이 모든 것을 검색했습니다. 절대 아무 소용이 없습니다.
가능한 경우 도움을 받으십시오.
ADDITIONAL CODE
// CONNECTION THREAD IS ON SERVER APP, SETS UP STREAMS AND WAITS FOR MESSAGES FROM CLIENT
// HANDLES COMMUNICATION FROM CLIENT AND REST OF SERVER
public class ConnectionThread implements Runnable
{
private Socket socket;
private SystemCore core;
//Streams for connections
private InputStream is;
private OutputStream os;
//Writers and readers for communication of Strings
private PrintWriter toClient;
private BufferedReader fromClient;
// Writers and readers for sending and receiving Objects between server and client.
private ObjectInputStream ois = null;
private ObjectOutputStream oos = null;
//Protocol
static final String CLIENT_QUITTING = "Exit";
public ConnectionThread(Socket s, SystemCore aSysCore)
{
socket = s;
// State of the SystemCore as taken from HelloServer
core = aSysCore;
}
public void run()
{
try
{
openStreams();
toClient.println(MESSAGE_TO_CLIENT);
processClientRequests();
closeStreams();
this.socket.close();
}
catch (OptionalDataException ode)
{
System.out.println("OptionalDataException: ");
System.out.println("length is: " + ode.length);
}
catch (IOException ioe)
{
System.out.println("IO trouble with a connection in ConnectionThread run() " + ioe.getMessage());
ioe.printStackTrace();
}
catch (ClassNotFoundException cnf)
{
System.out.println("Class trouble with a connection in ConnectionThread run() " + cnf.getMessage());
cnf.printStackTrace();
}
catch(ParseException pe)
{
System.out.println("Parse trouble with a connection in ConnectionThread run() " + pe.getMessage());
pe.printStackTrace();
}
}
/**
* Opens streams between the server and the client.
*
* @throws IOException
*/
private void openStreams() throws IOException
{
final boolean AUTO_FLUSH = true;
this.is = this.socket.getInputStream();
this.fromClient = new BufferedReader(new InputStreamReader(is));
this.os = this.socket.getOutputStream();
this.toClient = new PrintWriter(os, AUTO_FLUSH);
//Object streams.
oos = new ObjectOutputStream(socket.getOutputStream());
ois = new ObjectInputStream(socket.getInputStream());
System.out.println("...Streams set up");
}
/**
* Private method that accepts arguments from a client and executes the related
* commands in the systemcore as long as the command passed from the client
* is not CLIENT_QUITTING.
*
* @throws IOException
* @throws ClassNotFoundException
*/
private void processClientRequests() throws IOException, ClassNotFoundException, ParseException
{
String commandFromClient;
commandFromClient = fromClient.readLine();
while (!(commandFromClient.equals(CLIENT_QUITTING)))
{
if (commandFromClient.equals("addProjectPrepare"))
{
String[] addArray = (String[]) ois.readObject();
core.addProjectPrepare(addArray);
}
if (commandFromClient.equals("editProjectPrepareDetails"))
{
String[] editArray = (String[]) ois.readObject();
recruit.editProjectPrepareDetails(editArray);
}
}
commandFromClient = fromClient.readLine();
}
**// CLIENT SIDE (User GUI) CODE THAT SENDS STRING[] TO THE SERVER**
public void saveAction()
{
// TEST TO SEE IF THE DATE ENTERED IS CORRECT FORMAT, IF NOT NO SAVE OCCURRS
boolean parsedOk = false;
if (this.arrivalDateTextField.getText().isEmpty() == false)
{
try
{
// Check if date is correct format. Nothing will be done with
// the testDate object
MyDate testDate = new MyDate(
this.arrivalDateTextField.getText());
//Allow write to server to occur.
parsedOk = true;
//If date is okay, send form data to server.
}
catch (ParseException pe)
{
this.arrivalDateTextField.setText(""); // Set text field to blank
int messageIcon = javax.swing.JOptionPane.ERROR_MESSAGE;
JOptionPane.showMessageDialog(this, "Invalid date",
"Warning", messageIcon);
}
}
else
{
parsedOk = true; // No date entered so allow blank.
}
if (parsedOk == true)
{
// WRITE DATA TO SERVER OCCURS HERE:
try
{
**//getPersonDetails() returns a String[]**
ManageClientConnections.toServer.println("addNewData");
ManageClientConnections.objectToServer.writeObject(this.getPersonDetails());
ManageClientConnections.objectToServer.flush();
ManageClientConnections.objectToServer.reset();
}
catch (IOException ioe)
{
System.out.println(
"While writing new person to server, there was an error: " + ioe.getMessage());
}
// And dispose of the GUI, inside the parseok if clause
this.dispose();
}
}
일부 코드가 표시됩니다. – jtahlborn
'OptionalDataException'을 잡아 내고'exception.length' 필드를 출력 할 수 있습니까? 또한 위의 의견. – ddmps
왜 출력 스트림을 재설정합니까? – Fildor