JAVA Socket通信中自定义TCP通信协议

时间:2021-12-15 10:21:08

JAVA中Socket通信是以流的形式传输数据,对于InputStream和OutputStream的装饰问题,如果只是传输一串字符串,可以通过简单的BufferedReader和PrintWriter实现,但是在实际的客户端与服务端通信中不可能只是传递简单字符串,会有各种不同形式的信息,若是传输对象,则可以用 ObjectInputStream和ObjectOutputStream来实现,但是这种方法局限性也很明显,所以需要自己定义通信协议,用到DataInputStream和DataOutputStream。

以下是利用DataInputStream和DataOutputStream实现的将person类实例中的数据在文件中存取的过程,在Socket通信中也类似。

person.class

public class person {
private String name;
private int age;
public person(String name,int age){
this.name=name;
this.age=age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
}

文件存取过程:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;



public class DataInputstream {
public static void main(String[] args) throws IOException {
person a=new person("ba1",20);
String path="F:/aaa.txt";
String name=null;
int age=0;
File file=new File(path);
if(!file.exists())
file.createNewFile();
FileOutputStream fos=new FileOutputStream(file);
DataOutputStream dos=new DataOutputStream(fos);
dos.writeByte(0x17);//用byte数据可以表示后面的数据类型,这里代表person类
dos.writeChar('\t');//用\t符来分隔不同的数据
dos.writeChars(a.getName());
dos.writeChar('\t');
dos.writeInt(a.getAge());
dos.close();
fos.close();
DataInputStream dis=new DataInputStream(new FileInputStream(file));
switch(dis.readByte()){
case 0x17:
dis.readChar();//跳过分隔符
StringBuffer n=new StringBuffer();
char c;
while((c=dis.readChar())!='\t')//因为readchar方法只能一个一个读,所以要一位一位的加到字符串中
n.append(c);
name=n.toString();
age=dis.readInt();
}
System.out.println("name is "+name+",age is "+age);
dis.close();

}
}