2016-11-24 9 views
0

私はチャットアプリケーションを作りたいと思います。クライアントはjavaで書かれ、サーバはCで書かれます。サーバ側では、メッセージはstructとして送られます。クライアント側では、メッセージをJavaでどのように読んだり分離したりするのですか?JavaのTCPクライアントとCのサーバ

ここ
struct s_packet{ 
int text_color; 
char text[TEXTSIZE]; 
char alias[ALIASIZE]; 
}; 

は(Cで)サンプルサーバである送信機能:

ここ
send(iter->client.sockfd, (void *)se_packet, sizeof(s_packet), 0); 

は、サンプルクライアントrecv関数である。ここ

は、サンプルのパケット構造でありますC:

recv(m_sockfd, (void *)&se_packet, sizeof(s_packet),0); 

printf("\x1b[3%dm <%s>: %s \x1b[0m\n", se_packet.text_color, se_packet.alias, se_packet.text); 

Cでs_packetとseparateを読むことはできますが、どのようにjavaで行うことができますか?

は、どのように私はJavaでそのように分けることができます。

printf("\x1b[3%dm <%s>: %s \x1b[0m\n", se_packet.text_color, se_packet.alias, se_packet.text); 
+0

[Javaネイティブインタフェース](https://en.wikipedia.org/wiki/Java_Native_Interface)をチェックしてください! –

+0

構造体をネットワークプロトコールとして使用しないでください。ネットワークプロトコルをネットワークプロトコルとして使用する。あなたは間違った場所から出発しています。 – EJP

答えて

1

明確な答えは、それはそう簡単ではないということです。最初に理解しておきたいことは、tcpがどのように動作するかです。 これはストリーム指向のプロトコルであり、tcpには「メッセージ」はありません。バイトストリームを送受信するだけです。

コードrecvのスニペットでは、サーバーから送信されたメッセージの一部を読み取った後に終了できます。代わりに、ローカルバッファをjavaに保持し、これまでに受け取ったすべてのデータを削除する必要があります。 whileループでは、処理の準備ができているメッセージが受信されたかどうかを検出できます。あなたのメッセージがそれほど大きくない場合(MTU未満)、あなたは幸運になり、常に「メッセージ」全体を受け取るかもしれません。あなたがそれに心配していない場合は、java.io.InputStream.read(byte[])メソッドを使用することができます。

あなたが受け取ったメッセージをどのように解釈するかを考慮する必要があります。 他の選択肢はありませんが、それをJavaのbyte []として処理する必要があります。まず、s_packet.text_colorとしてください。おそらく最初の4バイトとしてメッセージに配置されます。あなたはバイトからintを構築することができます(たとえば、Convert 4 bytes to intを参照してください)。 しかし、これは良い習慣ではありません。これは、s_packetrepresented in memoryであることに依存するバイナリデータを送信するためです。実生活では、通常、intやcharのサイズは何か分からず、プラットフォームに依存します。あるいは、int内部のバイト順が異なる場合もあります。その代わりに、独自のシリアライゼーションプロトコルを宣言し、メッセージをバイナリデータに変換する方法とその逆を宣言する必要があります。 お手伝いをしてください。

+0

Javaでメッセージを受信する方法については、豊富な選択肢があります。 MTUとデータの欠落に関する部分は理解できません。 – EJP

関連する問題