java网络通信如何使用字节类传送字节数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java网络通信如何使用字节类传送字节数据相关的知识,希望对你有一定的参考价值。

各位大侠,你们好!小弟是一名学生,为了完成老师的一个作业,刚学java网络通信,是这样的,
我想实现由java客户端控制台读入一串字符(包括中文),然后将这串字符存储在字节数组里面,并发到java服务器端,java服务器端接收到字节数组数据后转化为字符串后打印在服务器端输出设备上。通信问题基本能实现了,现在是怎样用java里面的哪些字节类来完成这个过程,如能快点解决,万分感谢!
各位大侠就不要谦虚了,帮帮小弟吧,万分感谢

这是我写的,看看对你有没帮助:

服务器端:
package com.test.tcp;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Map;

import org.nutz.json.Json;

import com.test.card.CardInterface;
import com.test.card.TaideImplement;

public class ServerCode

/**
* @param args服务器端接收请求代码
*/
/**
* 设置一个与客户端通讯的公共端口
*/
public static int portNo=8888;
private String jsonString="";//用于给本地的客户端传递执行结果信息,以便将此信息返回给vclient服务器端

public static void main(String[] args)throws IOException

ServerSocket s=new ServerSocket(portNo);
System.out.println("启动公共端口对应的服务通讯:++++++——————sfdgdf : "+s);//在服务器本地控制台打印信息
/**
* 阻塞,直到有客户端连接
*/
Socket socket=s.accept();
System.out.println("接收到客户请求+++++++++++++=== "+socket);//在服务器本地控制台打印信息
/**
* 设置IO句柄
*/
BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));//得到客户端发送来的信息流

PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);//服务器端发送给客户端的信息流
out.write("收到信息");
out.flush();//刷新清除缓存

System.out.println("关闭流");
socket.close();
s.close();


public String getJsonString()
return jsonString;

public void setJsonString(String jsonString)
this.jsonString = jsonString;



客户端:

package com.test.tcp;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

public class ClientCode

/**
* @param args 客户端发送请求的代码
*/

/**
*定义 需要传送给服务器端的信息
*/
static String clientName="Charlie";
/**
* 设置一个与服务器端通讯的公共端口号
*/
public static int portNo=8888;

public static void main(String[] args) throws IOException
/**
* 设置连接地址类,连接本地
*/
InetAddress address=(InetAddress) InetAddress.getByName("localhost");//此处的address为对应服务器端的ip地址
/**
*要对应服务器端的8888端口号
*/
Socket socket=new Socket(address,portNo);
ServerCode serverCode=new ServerCode();
clientName=serverCode.getJsonString();//得到card刷卡服务器端扣款实现返回的信息,并(此客户端针对)将返回的信息传回给vclient的服务器端
try
System.out.println("++++—————— ::: "+socket);
/**
* 设置IO句柄
*/
BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
out.write(clientName);
out.flush();
out.println("1111111111111111111111—— "+clientName);//out.println() ---是将信息写到流中,然后在服务器端打印出来
String string=in.readLine();//就收客户端返回的信息流
System.out.println(string);
out.println("88");//out.println() ---是将信息写到流中,然后在服务器端打印出来
catch (Exception e)
e.printStackTrace();

finally
System.out.println("--++++++++------");//在本地客户端控制台上输出信息
socket.close();



参考技术A /**
*
* 概述:读取文件保存到byte数组中
*/
public static byte[] fileTobyte(String file)
if (file == null || "".equals(file))
return null;

File f = new File(file);
if (!f.isFile())
return null;

ByteArrayOutputStream baos = null;
try
baos = new ByteArrayOutputStream();
FileInputStream in = new FileInputStream(file);
int c;
byte buffer[] = new byte[1024];
while ((c = in.read(buffer)) != -1)
for (int i = 0; i < c; i++)
baos.write(buffer[i]);

in.close();
baos.close();
catch (Exception e)
log.error(e);
throw new RuntimeException();

byte[] buf = baos.toByteArray();
return buf;
参考技术B 服务器端
DataInputStream inData;
socket = serverSocket.accept();
inData = new DataInputStream(socket.getInputStream());
outData = new DataOutputStream(socket.getOutputStream());
byte[] b = ("hello world").getBytes();
outData.write(b,0,b.lenth);
客户端是
out = new DataOutputStream(socket.getOutputStream());
in = new DataInputStream(socket.getInputStream());
byte[] b ;
ByteArrayOutputStream out1 = new ByteArrayOutputStream();
while (in.available() != 0)
out1.write(in.read());

b = out1.toByteArray();
return new String(b);

转换的时候有问题
out = new DataOutputStream(socket.getOutputStream());
in = new DataInputStream(socket.getInputStream());
byte[] b = new byte[in.available()];
for(int i = 0;i < b.length;i++)
b[i] = (byte)in.read();


String s = new String(b);
参考技术C head first java 上网络编程那张有个列子..你去看看就知道了

Java IO 接口--- 字节操作 字符操作 磁盘操作 网络操作

1、IO类库的基本结构

基于字节操作的IO接口分别是InputStream和OutputStream,InputStream的类结构图如下所示:

同InputStream类似,OutputStream类也有着相同的类结构图。

 

 关于各个子类的使用可以参考JDK 的 API 说明文档,这里我们需要注意的是:操作数据的方式是可以组合的,如下所示:

InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("h:\\\\haha.txt"), "utf-8");

从上面代码可以看出,InputStreamReader可以从FileInputStream中读取数据,从源码中可以看出来,其实不仅是InputStreamReader,所有的IO类都可以以这种方式来组合使用。

还有一点需要注意的是必须制定流最终写入到什么地方,是磁盘还是网络,从OutputStream类图中可以看出,写入网络中实际也是写文件操作,只不过底层是通过网络传输了。

2、 基于字符的IO操作接口

        不管是磁盘还是网络数据传输,都是以字节为单位的,但是程序中一般常见的数据操作都是以字符为单位的(Java中char占用2字节,C/C++中 char占用1字节),这就需要我们有一个操作字符的IO接口,来处理字符与字节见的编码转换问题,也就是Write和Reader接口及其实现类,他们 二者的类接口图如下:

 

 

 

 读字符接口Reader的最主要操作方法为read(),其读取字符并返回读取的字符数,不管是 Writer 还是 Reader 类它们都只定义了读取或写入的数据字符的方式,也就是怎么写或读,但是并没有规定数据要写到哪去(比如磁盘或者网络)。

3、字节与字符的转化接口

有时数据持久化和网络传输是以字节进行的,所有需要字节和字符之间的相互转换。

                   

/**
 * 使用FileReader进行读取文件
 */
@Test
public void testFileReader() throws IOException {
    FileReader fileReader = new FileReader("h:\\\\haha.txt");
    char[] buff = new char[512];
    StringBuffer stringBuffer = new StringBuffer();

    while (fileReader.read(buff) > 0) {
        stringBuffer.append(buff);
    }
    fileReader.close();

    System.out.print(stringBuffer.toString());
}

/**
 * 使用FileReader进行读取文件,然后FileWriter写入另一个文件
 */
@Test
public void testFileReaderAndFileWriter() throws IOException {
    FileReader fileReader = new FileReader("h:\\\\haha.txt");
    char[] buff = new char[512];
    StringBuffer stringBuffer = new StringBuffer();

    while (fileReader.read(buff) > 0) {
        stringBuffer.append(buff);
    }
    System.out.println(stringBuffer.toString());

    FileWriter fileWriter = new FileWriter("h:\\\\haha2.txt");
    fileWriter.write(stringBuffer.toString().trim());

    fileWriter.close();
    System.out.println("写入文件成功");
}
/**
 * 使用InputStreamReader进行读取文件
 */
@Test
public void testInputStreamReader() throws IOException {
    InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("h:\\\\haha.txt"), "utf-8");
    char[] buff = new char[512];
    StringBuffer stringBuffer = new StringBuffer();

    while (inputStreamReader.read(buff) > 0) {
        stringBuffer.append(buff);
    }
    System.out.println(stringBuffer.toString());
}

@Test
public void testIntputStream2() throws IOException {
    InputStreamReader inputStreamReader = new InputStreamReader(new StringBufferInputStream("hello world"));
    char[] buff = new char[512];

    int n = inputStreamReader.read(buff);
    System.out.println(n);
    System.out.println(buff);
}

/**
 * 使用inputStreamReader进行读取文件,然后OutputStreamWriter写入另一个文件
 */
@Test
public void testOutputStreamWriter() throws IOException {
    InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("h:\\\\haha.txt"), "utf-8");
    char[] buff = new char[512];
    StringBuffer stringBuffer = new StringBuffer();

    while (inputStreamReader.read(buff) > 0) {
        stringBuffer.append(buff);
    }
    System.out.println(stringBuffer.toString());

    OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("h:\\\\haha2.txt"), "utf-8");
    outputStreamWriter.write(stringBuffer.toString().trim());
    outputStreamWriter.close();
}

      注意:FileReader类继承了InputStreamReader,FileReader读取文件流,通过StreamDecoder解码成char,其解码字符集使用的是默认字符集。在Java中,我们应该使用File对象来判断某个文件是否存在,如果我们用FileOutputStream或者FileWriter打开,那么它肯定会被覆盖。

 

 

文件材料取自于:https://www.ibm.com/developerworks/cn/java/j-lo-javaio/

 

以上是关于java网络通信如何使用字节类传送字节数据的主要内容,如果未能解决你的问题,请参考以下文章

Java对象序列化

如何正确解析Java中的字节流

java序列化技术

Java序列化

Java序列化技术

javad对象序列化(转)