<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Google Stop Blog - The future is fusion &#187; Network Programming</title>
	<atom:link href="http://googlestop.com/blog/category/network-programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://googlestop.com/blog</link>
	<description>Just another weblog of Charry</description>
	<lastBuildDate>Sat, 10 Jul 2010 13:02:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Java中发送结构体</title>
		<link>http://googlestop.com/blog/2007/03/how-to-construct-a-struct-in-java/</link>
		<comments>http://googlestop.com/blog/2007/03/how-to-construct-a-struct-in-java/#comments</comments>
		<pubDate>Thu, 22 Mar 2007 13:54:22 +0000</pubDate>
		<dc:creator>Charry</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Network Programming]]></category>

		<guid isPermaLink="false">http://googlestop.com/2007/03/22/how-to-construct-a-struct-in-java/</guid>
		<description><![CDATA[最近给个朋友做个网站的客户端，使用C/S模式，Client为VC6开发，Server为Java，通过Socket通信。由于Client这边为C++，所以，在接受Java发过来的数据包时，需要知道发来的包的长度，所以，就要引入变长包的机制。 方法是：首先Server发送一个包头，如下： // packet head typedef struct tagPacketHead{ long PacketID; long PacketLen; }PacketHead; 包头后面跟上包体，其中包体的长度，就是上面结构体中的PacketLen，Clinet首先接受包头，因为包头是两边约定好的，所以可以直接Receive一个定长的消息，也就是这个包头的长度的消息，从包头中取得包体的长度后，就可以再次Receive一个包体长度的消息了。那么Java中如何发送一个结构体呢？下面是解决方法： package org.charry.org; import java.net.*; /** * * 字节转换，参考网络文章 */ class Packet { private byte[] buf = null; /** * 将int转为低字节在前，高字节在后的byte数组 */ private static byte[] toLH(int n) { byte[] b = new byte[4]; b[0] = (byte) (n &#38; 0xff); b[1] = (byte) [...]]]></description>
			<content:encoded><![CDATA[<p>最近给个朋友做个网站的客户端，使用C/S模式，Client为VC6开发，Server为Java，通过Socket通信。由于Client这边为C++，所以，在接受Java发过来的数据包时，需要知道发来的包的长度，所以，就要引入变长包的机制。</p>
<p>方法是：首先Server发送一个包头，如下：</p>
<p>// packet head<br />
typedef struct tagPacketHead{<br />
long PacketID;<br />
long PacketLen;<br />
}PacketHead;</p>
<p><span id="more-19"></span>包头后面跟上包体，其中包体的长度，就是上面结构体中的PacketLen，Clinet首先接受包头，因为包头是两边约定好的，所以可以直接Receive一个定长的消息，也就是这个包头的长度的消息，从包头中取得包体的长度后，就可以再次Receive一个包体长度的消息了。那么Java中如何发送一个结构体呢？下面是解决方法：</p>
<p><code><br />
package org.charry.org;</code></p>
<p>import java.net.*;</p>
<p>/**<br />
*<br />
* 字节转换，参考网络文章 <img src='http://googlestop.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
*/<br />
class Packet {<br />
private byte[] buf = null;</p>
<p>/**<br />
* 将int转为低字节在前，高字节在后的byte数组<br />
*/<br />
private static byte[] toLH(int n) {<br />
byte[] b = new byte[4];<br />
b[0] = (byte) (n &amp; 0xff);<br />
b[1] = (byte) (n &gt;&gt; 8 &amp; 0xff);<br />
b[2] = (byte) (n &gt;&gt; 16 &amp; 0xff);<br />
b[3] = (byte) (n &gt;&gt; 24 &amp; 0xff);<br />
return b;<br />
}</p>
<p>/**<br />
* 将float转为低字节在前，高字节在后的byte数组<br />
*/<br />
private static byte[] toLH(float f) {<br />
return toLH(Float.floatToRawIntBits(f));<br />
}</p>
<p>/**<br />
* 构造并转换<br />
*/<br />
public Packet(int packetID, int packetLen, String packetBody) {<br />
byte[] temp = null;</p>
<p>buf = new byte[packetBody.getBytes().length + 8];<br />
temp = toLH(packetID);<br />
System.arraycopy(temp, 0, buf, 0, temp.length);</p>
<p>temp = toLH(packetLen);<br />
System.arraycopy(temp, 0, buf, 4, temp.length);</p>
<p>System.arraycopy(packetBody.getBytes(), 0, buf, 8, packetBody.length());</p>
<p>}</p>
<p>/**<br />
* 返回要发送的数组<br />
*/<br />
public byte[] getBuf() {<br />
return buf;<br />
}</p>
<p>/**<br />
* 发送测试<br />
*/<br />
public static void main(String[] args) {<br />
try {<br />
String  tmp = &#8220;test string!&#8221;;<br />
Socket sock = new Socket(&#8220;127.0.0.1&#8243;, 8888);<br />
sock.getOutputStream().write(<br />
new Packet(123, tmp.length(), tmp).getBuf());<br />
sock.close();<br />
} catch (Exception e) {<br />
e.printStackTrace();<br />
}<br />
}<br />
}</p>
<p>从Client端发到Server的数据就无须特殊处理了，Java的流可以很好的处理这些。</p>
]]></content:encoded>
			<wfw:commentRss>http://googlestop.com/blog/2007/03/how-to-construct-a-struct-in-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
