在本机处理Java实现简单的socket通讯时发现客户端上送的内容在服务端输出为null,客户端收到服务端的响应也是null,经过排查发现以下问题:
1、针对客户端上送至服务端的i/o流处理至缓存流时,使用while循环while(!"".equals(bufer.readLine()) 当读到流的末尾时该方法会返回null,所以输出null。将while循环改成if即可处理;
2、BufferedReader 的readLine()方法每次读取一行数据,且可能会在读取过程中跑出IOException异常,调用该方法时需要捕获处理异常。底层也是将数据一个读取后放置StringBuilder然后再一次性返回。
3、BufferedReader 的readLine()方法读取字符串第一个字符不展示,后来发现bufer.readLine()每次都会先读出一个字符,后来修改了读取后显示正常。
!"".equals(info=bufer.readLine())
附带源码如下:
package com.weixin.TCP_IP;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/*
* @实现TCP/IP socket 通信服务端
* @auther help
*/
public class TcpServer{
public static void main(String[] args) {
//1、创建一个serverSocket服务端,绑定监听端口
try {
ServerSocket serverScoket = new ServerSocket(8082);
//2、调用accept()方法开始监听,等待客户端链接
System.out.println("服务即将启动,等待客户端链接"+serverScoket.getInetAddress());
Socket socket = serverScoket.accept();
//3、获得输入流信息,用来读取客户端发送 的信息
InputStream input = socket.getInputStream();//输入字节流
//System.out.println("input"+input.read());//此处read()会将第一个字符干掉
//将输入字节流转为字符流
InputStreamReader inputStR = new InputStreamReader(input);//An InputStreamReader is a bridge from byte streams to character streams
BufferedReader bufer = new BufferedReader(inputStR);//为输入流增加缓冲信息
//System.out.println("我是服务端,客户端上送信息为:"+bufer.readLine());
//循环读取客户端上送信息,此时使用while循环读取服务端收到信息为null
//String info ="";
//while(!"".equals(bufer.readLine())){
// info = bufer.readLine();
// System.out.println("我是服务端,客户端上送信息为:"+info);
//}
//这种方式也可以实现
// if((info=bufer.readLine()) != null){
// //info += '\n';
// //info1 += info;
// System.out.println("我是服务端,客户端上送信息为:"+info);
// }
String info ="";
while((info=bufer.readLine()) != null){
//info += '\n';
//info1 += info;
System.out.println("我是服务端,客户端上送信息为:"+info);
}
//方式2
// byte[] byts = new byte[1024];
// int len;
// StringBuilder sb = new StringBuilder();
// while((len=input.read()) != -1){
// //注意指定编码格式,发送方和接收方一定要统一,建议使用UTF-8
// sb.append(new String(byts,0,len,"UTF-8"));
// }
// System.out.println("我是服务端,客户端上送信息为:"+sb);
// input.close();
//关闭输入流,防止造成阻塞
socket.shutdownInput();
/************获取输出流,响应客户端的请求*******************/
//4、服务端向客户端响应
OutputStream out = socket.getOutputStream();
PrintWriter write = new PrintWriter(out);//将响应信息打包为打印流
write.print("欢迎您!");
//write.write("欢迎您!");
write.flush();//调用flush刷新缓存输出
//5、关闭资源
write.close();
out.close();
bufer.close();
inputStR.close();
socket.close();
serverScoket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.weixin.TCP_IP;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
/*
* 实现TCP/IP socket 通信客户端
*/
public class TcpClient{
public static void main(String[] args) {
String xmlStr1 = "<?String version='1.0' encoding='UTF-8'?><info><city><id>0101</id><name>太原</name></city><town><town_id>0102</town_id><town_name>周陵</town_name></town></info>";
//1、创建客户端Socket服务,指定服务器和端口
try {
Socket socket = new Socket("127.0.0.1", 8082);
//2、获取输出流向服务端发送消息
OutputStream out = socket.getOutputStream();//字节输出流
PrintWriter pw = new PrintWriter(out);//将输出流打包为打印流
//socket.getOutputStream().write(xmlStr1.getBytes("UTF-8"));
//输入流
pw.print(xmlStr1);
//pw.println();
pw.flush();
//out.close();
//3、关闭输出流,防止造成阻塞
socket.shutdownOutput();
/***********************等待响应****************/
//4、获取输入流,并读取服务端响应信息
InputStream in = socket.getInputStream();//字节流对象
InputStreamReader inputReder = new InputStreamReader(in);//将响应的字节流转化为字符流
BufferedReader bufReader = new BufferedReader(inputReder);//为服务端响应流增加缓冲信息
//System.out.println("我是客户端,服务器端说:"+bufReader.readLine());
String info = "";
//这种方法也可以
//if(!"".equals(info=bufReader.readLine())){
// System.out.println("我是客户端,服务器端说:"+info);
//}
while((info=bufer.readLine()) != null){
//info += '\n';
//info1 += info;
System.out.println("我是服务端,客户端上送信息为:"+info);
}
//5、关闭资源
bufReader.close();
inputReder.close();
in.close();
pw.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}