TCP를 사용하여 클라이언트 / 서버간에 12 개의 객체를 송수신하고 싶습니다. 개체는 고유하지만 순서는 항상 동일합니다. 예 : 클라이언트는 항상 "object 1"을 전송하여 시작하고 서버는 항상 "object 2"로 응답합니다. 이를 위해 큐 또는 스택을 설정하고 Java 표준 라이브러리만을 사용하여 객체의 송수신을 동기화하려면 어떻게해야합니까? 나는 아래 코드 (1 패키지의 3 클래스 파일)에서 작업했지만 작동하지 않지만 (파일 끝 오류) 내가 현재 위치를 보여줍니다.
import java.net.*;
import java.io.*;
class SimpleClient {
public static void main(String args[]){
int counter = 0;
try{
Socket s = new Socket("localhost",2002);
OutputStream os = s.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
testobject to = new testobject(1,"object 1","field1","field2","field3","field4");
System.out.println("sending object 1"); //debug
oos.writeObject(to);
//Socket ss = s.accept();
InputStream is = s.getInputStream();
ObjectInputStream ois = new ObjectInputStream(is);
testobject too = (testobject)ois.readObject();
while (counter != 2) {
while ( too.value != 3 ) {
if (to==null) {
System.out.println("object is null!");
} else if (to.value==1){
System.out.println("receiving object 2"); //debug
System.out.println(to.id);
os = s.getOutputStream();
oos = new ObjectOutputStream(os);
testobject to0 = new testobject(2,"object 3","field1","field2","field3","field4");
oos.writeObject(to0);
System.out.println("object 3 sent!");
} else if (to.value==2){
System.out.println("receiving object 4"); //debug
System.out.println(to.id);
os = s.getOutputStream();
oos = new ObjectOutputStream(os);
testobject to0 = new testobject(3,"object 5","field1","field2","field3","field4");
oos.writeObject(to0);
System.out.println("sending object 5");
}
}
is.close();
s.close();
//System.out.println((String)ois.readObject());
counter = counter + 1;
}
oos.close();
os.close();
s.close();
} catch(Exception e) {
System.out.println(e);
}
}
}
class SimpleServer {
public static void main(String args[]) {
int port = 2002;
int counter = 0;
try {
ServerSocket ss = new ServerSocket(port);
while (counter != 1) {
Socket s = ss.accept();
InputStream is = s.getInputStream();
ObjectInputStream ois = new ObjectInputStream(is);
testobject to = (testobject)ois.readObject();
while ( to.value != 1 ) {
if (to==null) {
System.out.println("object is null!");
} else if (to.value==1){
System.out.println("receiving object 1"); //debug
System.out.println(to.id);
OutputStream os = s.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
testobject to0 = new testobject(2,"object 2","field1","field2","field3","field4");
oos.writeObject(to0);
System.out.println("sending object 2");
} else if (to.value==2){
System.out.println("receiving object 3"); //debug
System.out.println(to.id);
OutputStream os = s.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
testobject to0 = new testobject(4,"object 4","field1","field2","field3","field4");
oos.writeObject(to0);
System.out.println("sending object 4");
}
}
is.close();
s.close();
counter = counter + 1;
}
ss.close();
} catch(Exception e) {
System.out.println(e);
}
}
}
class testobject implements Serializable {
int value;
String id;
String field1;
String field2;
String field3;
String field4;
public testobject(int v, String s, String s1, String s2, String s3, String s4) {
this.value=v;
this.id=s;
this.field1 = s1;
this.field2 = s2;
this.field3 = s3;
this.field4 = s4;
}
}
문제는 귀하의 while (to.value != 1)
. 서버는 값이 1 인 첫 번째 개체를받습니다. while 루프를 전혀 실행하지 않고 대신 소켓을 즉시 닫습니다. 따라서 클라이언트가 ObjectInputStream
해당 소켓의 입력 스트림에서 를 만들려고 할 때 개체 스트림 헤더를 예상하는 닫힌 연결이 발생합니다. 따라서 EOFException
.
대화를 구현하는 가장 쉬운 방법은 루프를 완전히 피하는 것입니다. 결국 루프를 수행하지만 루프 내에서 대소 문자 구분을 수행하여 각 패스에서 특수 코드를 실행합니다. 선형 프로그램을 작성하고 필요한 경우 공통 코드를 메서드 호출에 포함 할 수 있습니다. 예제에는 공통 코드가 거의 없습니다.
class SimpleClient {
public static void main(String args[]) throws Exception {
// Connection setup
Socket s = new Socket("localhost",2002);
OutputStream os = s.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
InputStream is = s.getInputStream();
ObjectInputStream ois = new ObjectInputStream(is);
testobject to;
// Conversation
System.out.println("sending object 1");
to = new testobject(1,"object 1","field1","field2","field3","field4");
oos.writeObject(to);
System.out.println("receiving object 2");
to = (testobject)ois.readObject();
System.out.println(to.id);
System.out.println("sending object 3");
to = new testobject(2,"object 3","field1","field2","field3","field4");
oos.writeObject(to);
System.out.println("receiving object 4");
to = (testobject)ois.readObject();
System.out.println(to.id);
// Connection shutdown
ois.close();
oos.close();
s.close();
}
}
class SimpleServer {
public static void main(String args[]) throws Exception {
// Connection setup
ServerSocket ss = new ServerSocket(2002);
Socket s = ss.accept(); // only handle a single connection
ss.close(); // so we can immediately stop listening for more
OutputStream os = s.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
InputStream is = s.getInputStream();
ObjectInputStream ois = new ObjectInputStream(is);
testobject to;
// Conversation
System.out.println("receiving object 1");
to = (testobject)ois.readObject();
System.out.println(to.id);
System.out.println("sending object 2");
to = new testobject(2,"object 2","field1","field2","field3","field4");
oos.writeObject(to);
System.out.println("receiving object 3");
to = (testobject)ois.readObject();
System.out.println(to.id);
System.out.println("sending object 4");
to = new testobject(4,"object 4","field1","field2","field3","field4");
oos.writeObject(to);
// Connection shutdown
ois.close();
oos.close();
s.close();
}
}
큐에서 항목을 정말로 보내고 싶다면 간단히 반복 할 수 있습니다.
import java.net.*;
import java.io.*;
import java.util.*;
class SimpleClient {
public static void main(String args[]) throws Exception {
// Preparing the queues
List<testobject> sendQueue = Arrays.asList(
new testobject(1,"object 1","field1","field2","field3","field4"),
new testobject(2,"object 3","field1","field2","field3","field4"));
List<testobject> receiveQueue = new ArrayList<testobject>();
// Connection setup
Socket s = new Socket("localhost",2002);
OutputStream os = s.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
InputStream is = s.getInputStream();
ObjectInputStream ois = new ObjectInputStream(is);
testobject to;
// Conversation, we start by sending
for (testobject toSend: sendQueue) {
System.out.println("Sending " + toSend.id);
oos.writeObject(toSend);
testobject received = (testobject)ois.readObject();
System.out.println("Received " + received.id);
receiveQueue.add(received);
}
// Connection shutdown
ois.close();
oos.close();
s.close();
}
}
class SimpleServer {
public static void main(String args[]) throws Exception {
// Preparing the queues
List<testobject> sendQueue = Arrays.asList(
new testobject(2,"object 2","field1","field2","field3","field4"),
new testobject(4,"object 4","field1","field2","field3","field4"));
List<testobject> receiveQueue = new ArrayList<testobject>();
// Connection setup
ServerSocket ss = new ServerSocket(2002);
Socket s = ss.accept(); // only handle a single connection
ss.close(); // so we can immediately stop listening for more
OutputStream os = s.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
InputStream is = s.getInputStream();
ObjectInputStream ois = new ObjectInputStream(is);
testobject to;
// Conversation, we start by receiving
for (testobject toSend: sendQueue) {
testobject received = (testobject)ois.readObject();
System.out.println("Received " + received.id);
receiveQueue.add(received);
System.out.println("Sending " + toSend.id);
oos.writeObject(toSend);
}
// Connection shutdown
ois.close();
oos.close();
s.close();
}
}
그러나이 경우 모든 데이터가 미리 알려지기 때문에 인터리빙하지 않고 모든 데이터를 별도의 스레드를 사용하여 즉시 전송하여 네트워크 왕복 시간을 절약 할 수 있습니다. 그러나 그것은 당신의 예에서 훨씬 멀어 질 것이므로 이에 대한 코드를 포함하지 않을 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다