今天在使用java的socket写网络通信,作为服务端向对端传送数据。
建立连接后,首先发4个字节的内容,存放文件大小,然后再发送文件正文内容
代码是这样写的
Socket client = new Socket("192.168.60.1", 9999);
OutputStream ops = client.getOutputStream();
InputStream ifs = new BufferedInputStream(new FileInputStream(pic_path));
client.setTcpNoDelay(true);
int fileSize = ifs.avaliable(); //获取文件大小
if (fileSize > 0) {
// ops .write(fileSize); // 错误行
byte bytes[] = new bye[4]; // 正确写法
bytes[0] = (byte) (fileSize & 0xFF); // 正确写法
bytes[1] = (byte) ((fileSize >> 8) & 0xFF); // 正确写法
bytes[2] = (byte) ((fileSize >> 16) & 0xFF); // 正确写法
bytes[3] = (byte) ((fileSize >> 24) & 0xFF); // 正确写法
ops .write(bytes, 0, 4); // 正确写法
ops .flush();
测试时使用 ifs.write写入int型的文件大小到socket输出流,通过tcpdump抓包发现只发出去第一个字节,通过将int型转换为4字节的byte数组发送,就没有问题。
在这里记录下,以后java通信还是使用wirte中的数组形参的方法比较好