Java实现简单的socket通讯时发现客户端上送的内容在服务端输出为null

在本机处理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();
        }
        
    }
    

}

 


版权声明:本文为u010448750原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。