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

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();
		
	}
}


你可能感兴趣的:(JAVA Socket通信中自定义TCP通信协议)