`
newslxw
  • 浏览: 207857 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

阅读更多

发现一个问题

Socket编程中要慎用

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

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

package com.chat.server.io;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class Server
{

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException
    {
        InputStream is = null;
        DataInputStream dis = null;
        OutputStream os = null;
       // DataOutputStream dos = null;
        PrintStream pos = null;
        ServerSocket ss = new ServerSocket(10001);
        try
        {
            while(true)
            {
                Socket soc = ss.accept();
                is = soc.getInputStream();
                dis = new DataInputStream(is);
                os = soc.getOutputStream();
               // dos = new DataOutputStream(os);
                pos = new PrintStream(os,true);
                try
                {
                    InetAddress clientAddr = soc.getInetAddress();
                    String str = "欢迎客户" + clientAddr + "到访,该客户占用端口"
                            + soc.getPort() ;
                    pos.print(str+"\r\n\n");
                    //pos.flush();
                    //dos.writeUTF(str);
                   // dos.flush();
                    str = dis.readUTF();
                    while (!"quit".equals(str))
                    {
                        System.out.println("client said:" + str);
                        str = dis.readUTF();
                    }
                    System.out.println(clientAddr + " leave");
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
                finally
                {
                    is.close();
                    os.close();
                    soc.close();
                }
            }
        }
        finally
        {
            if(ss != null){
                ss.close();
            }
        }

    }

}

 

 

package com.chat.server.io;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;
import java.util.Arrays;

public class Client
{

    public static void initArray(byte[] arr)
    {
        Arrays.fill(arr, (byte)0);
    }
    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException
    {
        InputStream is = null;
        DataInputStream dis = null;
        OutputStream os = null;
        DataOutputStream dos = null;
        Socket soc = new Socket();
        InetAddress address = InetAddress.getLocalHost();
        InetSocketAddress endpoint = new InetSocketAddress(address,10001);
        soc.connect(endpoint);
        byte bmsg[] = new byte[1024];
        initArray(bmsg);
        String msg = null;
        try
        {
            is = soc.getInputStream();
            dis = new DataInputStream(is);
            os = soc.getOutputStream();
            dos = new DataOutputStream(os);
            String str = dis.readLine();
           //String str = dis.readUTF();
            System.out.println("Server said:"+ str);
            int num = System.in.read(bmsg);
            msg = new String(bmsg,0,num);
            msg = msg.substring(0,msg.length() -2);
            while(!"quit".equals(msg))
            {
                dos.writeUTF(msg);
                dos.flush();
                num = System.in.read(bmsg);
                msg = new String(bmsg,0,num);
                msg = msg.substring(0,msg.length() -2);
            }
            dos.writeUTF(msg);
            dos.flush();
        }
        finally
        {
            if(soc != null)
            {
                soc.close();
            }
        }
        

    }

}

 如果Client中的dis.readLine改成dis.readUTF,则会在dis.readUTF一直阻塞。

分享到:
评论

相关推荐

    java 输出流中的PrintStream 和 PrintWriter有什么区别

    java 输出流中的PrintStream 和 PrintWriter有什么区别

    浅谈PrintStream和PrintWriter的区别和联系

    主要介绍了浅谈PrintStream和PrintWriter的区别和联系,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    PrintStream和PrintWriter的区别简介

    主要介绍了PrintStream和PrintWriter的区别简介,具有一定借鉴价值,需要的朋友可以参考下

    PrintStream,StringBuilder,Formatter

    PrintStream,StringBuilder,Formatter

    PrintStream 介绍_动力节点Java学院整理

    PrintStream 是打印输出流,它继承于FilterOutputStream。...它产生的IOException会被自身的函数所捕获并设置错误标记, 用户可以通过 checkError() 返回错误标记,从而查看PrintStream内部是否产生了IOException。

    Socket编程实验报告.docx

    实验报告 实验一 Socket编程 一、实验目的 通过socket程序的编写、调试,掌握socket编程的基本方法,了解客户端与服务器端的特点,掌握并熟悉运用socket类与ServerSocket类。 实验内容 学习socket编程使用的类和接口...

    Java 中的Printstream介绍_动力节点Java学院整理

    PrintStream 是打印输出流,它继承于FilterOutputStream。接下来通过本文给大家介绍Java 中的Printstream,需要的朋友参考下吧

    java学习笔记--PrintStream分享.pdf

    java学习笔记--PrintStream分享.pdf

    PrintStream的用法2---马克-to-win java视频

    PrintStream的用法2---马克-to-win java视频

    PrintStream的用法1---马克-to-win java视频

    PrintStream的用法1---马克-to-win java视频的详细描述与介绍

    chatRoom 聊天室

    PrintStream ps = new PrintStream(s.getOutputStream()); /* 产生发消息的时刻 */ Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); /* 向客户端发消息,消息...

    java键盘输入输出练习.java

    对于不同数据类型的数据进行输入输出练习。过程中使用导入Scanner包,Scanner中创建Scanner类型的变量,内容详细易懂,适合Java新手练习

    Java代码实现时间服务器.rar

    Java代码实现时间服务器,让客户端设备通过服务器校准和获取最新的时间,和Windows时间自动更新的功能类似。  int port=13; //端口号  ServerSocket serverSocket; //服务器套接字  public TimeServer(){  ...

    廖雪峰 Java 教程.doc

    PrintStream和PrintWriter 日期与时间 基本概念 Date和Calendar LocalDateTime ZonedDateTime DateTimeFormatter Instant 最佳实践 单元测试 编写JUnit测试 使用Fixture 异常测试 条件测试 参数化测试

    fluffyThreadPool:Java中的另一个线程池实现

    /* Constructor needs max Number of Threads and PrintStream to print messages to (or null). */ Pool pool = new Pool ( 1 , System . out); Runnable exampleRun = new Runnable () { @O

    Java创建一个简单的时间服务器.rar

    这是用Java创建一个简单的时间服务器的...  PrintStream out=new PrintStream(client.getOutputStream()); //得到输出流   Date now=new Date(); //获取当前时间   out.println(now); //输出当前时间到客户端  }

    JAVA的剪刀石头布游戏设计方案.doc

    目 录 1剪刀石头布游戏设计思路阐述2 2程序概要设计2 2.1功能需求分析2 2.2性能需求分析2 2.3程序框图3 2.4 JAVA类及自定义类相互继承的层次关系3 2.4.1 Java类及自定义类的说明3 2.4.2类中成员及作用4 String data...

    java经典面试2010集锦100题(不看你后悔)

    C) 在show()方法中无法调用父类的print()方法。 D) 在show()方法中可以为day进行赋值,因为Test2继承了Test,则在Test2中也继承了父类的day变量。 题目13: 下面哪个关键字,使类不能在被其他的类继承?c...

    java学习中调试过程中经常遇到的错误

    w我们在进行java学习中经常遇到各种错误,对大家来说谅解调试过程中的错误能够加快我们的调试进度!

    Java之IO流学习总结

    File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。 9....

Global site tag (gtag.js) - Google Analytics