'소켓'에 해당되는 글 1건

  1. 2013.04.25 java.io.StreamCorruptedException: invalid stream header: 6572726F



자바로 C언어로 구현된 서버와 소켓 통신을 하려던 중 다음과 같은 예외가 발생하였다.

 

java.io.StreamCorruptedException: invalid stream header: 6572726F
   at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
   at java.io.ObjectInputStream.<init>(Unknown Source)

 

 

원인은 예외메시지가 보여주는 것처럼 스트림헤더가 유효하지 않기 때문이었다.

 

C언어 기반의 서버와 통신하기 위해서는 ObjectStream이 아닌 DataStream을 사용해야 하는데

 

습관적으로 ObjectOutputStream과 ObjectInputStream를 사용해서 발생한 문제였다.

 

이것은 왜냐하면 JAVA 기반과 C언어 기반이 소켓통신을 하기 위해서는 read와 write를 할 때 byte 타입으로 해 주어야 하기 때문이다.

 

다음은 C언어 기반의 서버에 소켓을 연결해서 한 번 메시지를 주고받는 JAVA 클라이언트의 예제 소스이다. 서버의 소스는 포함하지 않는다.

 

Example.java

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;

public class Example {

	private static final String serverIP = "1.234.56.78";	// your serverIP
	private static final int portNum = 1234;		// your port number
	private static final int buffersize = 100;

	private Socket mSocket = null;
	private DataOutputStream mObjOStream = null;
	private DataInputStream mObjIStream = null;

	public Example()
	{	
	}
	
	public static void main(String args[])
	{
		Example example = new Example();
		example.connect();
	}

	public void connect()
	{
		try
		{
			mSocket = new Socket();
			mSocket.connect(new InetSocketAddress(serverIP, portNum));
			mObjOStream = new DataOutputStream(mSocket.getOutputStream());
			mObjIStream = new DataInputStream(mSocket.getInputStream());
			System.out.println("connection successed");
			
			byte[] out = new byte[buffersize];
			String sendmgs = "kugistory.net";	// your sending message
			out = sendmgs.getBytes();
			mObjOStream.write(out);
			mObjOStream.flush();
			System.out.println("message sended: " + sendmgs);
			
			byte[] in = new byte[buffersize];
			mObjIStream.read(in,0,in.length);
			String response = new String(in,0,in.length);	// your receiving message
			response.trim();
			
			System.out.println("response=" + response + "@end");
			mSocket.close();
		}
		catch ( Exception e )
		{
			e.printStackTrace();
		}
	}
}

Posted by Kugi
,