Socket中PrintStream,PrintWriter的print无法被readUTF获取

发现一个问题

Socket编程中要慎用

PrintStream和PrintWriter,首先创建时要注意加上 true,自动flush,否则数据无法发送出去,

其次它们的println()要用它们的readLine来读取,如果你用用DataInputStream.readUTF读取将导致阻塞,一直都读取不到数据,见下面代码就是。

Java代码   收藏代码
  1. package com.chat.server.io;  
  2.   
  3. import java.io.DataInputStream;  
  4. import java.io.DataOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.io.OutputStream;  
  8. import java.io.PrintStream;  
  9. import java.net.InetAddress;  
  10. import java.net.ServerSocket;  
  11. import java.net.Socket;  
  12.   
  13. public class Server  
  14. {  
  15.   
  16.     /** 
  17.      * @param args 
  18.      * @throws IOException  
  19.      */  
  20.     public static void main(String[] args) throws IOException  
  21.     {  
  22.         InputStream is = null;  
  23.         DataInputStream dis = null;  
  24.         OutputStream os = null;  
  25.        // DataOutputStream dos = null;  
  26.         PrintStream pos = null;  
  27.         ServerSocket ss = new ServerSocket(10001);  
  28.         try  
  29.         {  
  30.             while(true)  
  31.             {  
  32.                 Socket soc = ss.accept();  
  33.                 is = soc.getInputStream();  
  34.                 dis = new DataInputStream(is);  
  35.                 os = soc.getOutputStream();  
  36.                // dos = new DataOutputStream(os);  
  37.                 pos = new PrintStream(os,true);  
  38.                 try  
  39.                 {  
  40.                     InetAddress clientAddr = soc.getInetAddress();  
  41.                     String str = "欢迎客户" + clientAddr + "到访,该客户占用端口"  
  42.                             + soc.getPort() ;  
  43.                     pos.print(str+"\r\n\n");  
  44.                     //pos.flush();  
  45.                     //dos.writeUTF(str);  
  46.                    // dos.flush();  
  47.                     str = dis.readUTF();  
  48.                     while (!"quit".equals(str))  
  49.                     {  
  50.                         System.out.println("client said:" + str);  
  51.                         str = dis.readUTF();  
  52.                     }  
  53.                     System.out.println(clientAddr + " leave");  
  54.                 }  
  55.                 catch (Exception e)  
  56.                 {  
  57.                     e.printStackTrace();  
  58.                 }  
  59.                 finally  
  60.                 {  
  61.                     is.close();  
  62.                     os.close();  
  63.                     soc.close();  
  64.                 }  
  65.             }  
  66.         }  
  67.         finally  
  68.         {  
  69.             if(ss != null){  
  70.                 ss.close();  
  71.             }  
  72.         }  
  73.   
  74.     }  
  75.   
  76. }  

 

 

Java代码   收藏代码
  1. package com.chat.server.io;  
  2.   
  3. import java.io.DataInputStream;  
  4. import java.io.DataOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.io.OutputStream;  
  8. import java.io.PrintStream;  
  9. import java.net.InetAddress;  
  10. import java.net.InetSocketAddress;  
  11. import java.net.Socket;  
  12. import java.net.SocketAddress;  
  13. import java.net.UnknownHostException;  
  14. import java.util.Arrays;  
  15.   
  16. public class Client  
  17. {  
  18.   
  19.     public static void initArray(byte[] arr)  
  20.     {  
  21.         Arrays.fill(arr, (byte)0);  
  22.     }  
  23.     /** 
  24.      * @param args 
  25.      * @throws IOException  
  26.      */  
  27.     public static void main(String[] args) throws IOException  
  28.     {  
  29.         InputStream is = null;  
  30.         DataInputStream dis = null;  
  31.         OutputStream os = null;  
  32.         DataOutputStream dos = null;  
  33.         Socket soc = new Socket();  
  34.         InetAddress address = InetAddress.getLocalHost();  
  35.         InetSocketAddress endpoint = new InetSocketAddress(address,10001);  
  36.         soc.connect(endpoint);  
  37.         byte bmsg[] = new byte[1024];  
  38.         initArray(bmsg);  
  39.         String msg = null;  
  40.         try  
  41.         {  
  42.             is = soc.getInputStream();  
  43.             dis = new DataInputStream(is);  
  44.             os = soc.getOutputStream();  
  45.             dos = new DataOutputStream(os);  
  46.             String str = dis.readLine();  
  47.            //String str = dis.readUTF();  
  48.             System.out.println("Server said:"+ str);  
  49.             int num = System.in.read(bmsg);  
  50.             msg = new String(bmsg,0,num);  
  51.             msg = msg.substring(0,msg.length() -2);  
  52.             while(!"quit".equals(msg))  
  53.             {  
  54.                 dos.writeUTF(msg);  
  55.                 dos.flush();  
  56.                 num = System.in.read(bmsg);  
  57.                 msg = new String(bmsg,0,num);  
  58.                 msg = msg.substring(0,msg.length() -2);  
  59.             }  
  60.             dos.writeUTF(msg);  
  61.             dos.flush();  
  62.         }  
  63.         finally  
  64.         {  
  65.             if(soc != null)  
  66.             {  
  67.                 soc.close();  
  68.             }  
  69.         }  
  70.           
  71.   
  72.     }  
  73.   
  74. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值