今天在写java socket编程server和client进行数据传输时突然遇到了一个问题:
在server.java时,创建了两个输入输出流:
DataInputStream fromclient=new DataInputStream(socket.getInputStream());
DataOutputStream toclient=new DataOutputStream(socket.getOutputStream());
然后等待接收客户端发来的信息,并将信息传回给客户端:
int message=fromclient.read(); //读取客户端的信息
toclient.write(message+2); //将信息传回
在client.java时,同样创建两个输入输出流:
fromserver=new DataInputStream(socket.getInputStream());
toserver=new DataOutputStream(socket.getOutputStream());
然后向服务器发送数据,并接受客户端传来的信息:
toserver.write(Integer.parseInt(message));
int area=fromserver.read();
此时,客户端和服务器都能正确的接收到发送的数据。
但是,当把输入输出流换成文本传输模式的输入输出流时,传输就会出现问题:
在server.java时,创建了两个输入输出流:
BufferedReader serverreader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter serverwriter=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
同样接受客户端的数据: String message=serverreader.readLine();
在client.java时,同样创建两个输入输出流:
clientreader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
clientwriter=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
然后向服务器发送数据,
String message=jtf.getText(); //从文本框中获得输入的字符串
clientwriter.write(message); //写到缓冲区
clientwriter.flush(); //发送给服务器
在运行程序时,却发现,服务器得不到message。
后来经过查资料发现:
在写socket时候,用DataInputStream 怎样都行,但是使用了装饰着模式用了BufferedReader之后就出现了问题,是因为在readLine()时,只有在遇到\r \n的时候才会有返回值,修改后就能过得到数据了。