java中BufferedInputStream的方法问题

问题描述

java中BufferedInputStream的方法问题

解决方案

while循环会结束的,InputStream流输入到达尾部时,br.read(buf)返回的就是-1了,就标识输入结束。
这个是由客户端发送的Socket决定的,客户端Socket发送完毕,这段代码读取发送数据也就结束了。

解决方案二:

客户端发送了什么内容?正常情况下可以打印出客户端发送过来的数据,打印完就结束了。另外,客户端发送完数据要给一个结束标记。

解决方案三:

服务器端

 import java.net.*;
import java.io.*;
public class  Server
{
    public static void main(String[] args) throws Exception
    {
        ServerSocket server = new ServerSocket(8888);
        System.out.println("Wait for connection...");
        Socket socket = server.accept();
        BufferedInputStream is = new BufferedInputStream(socket.getInputStream());
        byte[] buff = new byte[1024];
        int size;
        while((size = is.read(buff)) != -1){
            System.out.println(new String(buff,0,size));
        }
    }
}

客户端

 import java.net.*;
import java.io.*;
public class  Client
{
    public static void main(String[] args) throws Exception
    {
        Socket socket = new Socket("localhost",8888);
        BufferedOutputStream  out = new BufferedOutputStream(socket.getOutputStream());
        byte[] buff = new byte[2048];
        for(int i = 0 ; i < 2048 ; i ++){
            buff[i] = 'a';
        }
        out.write(buff);
        out.flush();//你可能没有写这个,我测试的时候,没写会出现socketexception:connection reset异常
        out.close();
        socket.close();
        System.out.println("Send Over!");
    }
}

解决方案四:

对应的客户端写入刘未关闭导致另一端等待输入流read阻塞了。解决办法:
服务器端:

        ServerSocket server;
        try {
            server = new ServerSocket(8800);
            System.out.println("Wait for connection...");
            Socket socket = server.accept();
            BufferedInputStream is = new BufferedInputStream(
                    socket.getInputStream());
            byte[] buff = new byte[1024];
            int size;
            while ((size = is.read(buff)) != -1) {
                System.out.println(new String(buff, 0, size));
            }

            OutputStream os = socket.getOutputStream();
            os.write("您好,我是Server端".getBytes());
            os.flush();
            os.close();
            System.out.println("ok,client send over.");
            server.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

客户端端:

 public static void main(String[] args) throws Exception
    {
        Socket s = new Socket("localhost",8800);
        OutputStream os = s.getOutputStream();
        os.write("您好,我是客户端".getBytes());
        os.close();

        InputStream in = s.getInputStream();
        byte[] buff = new byte[1024];
        BufferedInputStream is = new BufferedInputStream(in);
        int size;
        while((size = is.read(buff)) != -1){
            System.out.println(new String(buff,0,size));
        }
        System.out.println("over...");
        s.close();
    }

解决方案五:

服务器

import java.net.*;
import java.io.*;
public class  Server
{
    public static void main(String[] args) throws Exception
    {
        ServerSocket server = new ServerSocket(8888);
        System.out.println("Wait for connection...");
        Socket socket = server.accept();
        BufferedInputStream is = new BufferedInputStream(socket.getInputStream());
        byte[] buff = new byte[1024];
        int size;
        //当客户端的输出流没有close时,服务器端收不到-1,会一直在沉睡在while里面,
        while((size = is.read(buff)) != -1){
            String str = new String(buff,0,size);
            System.out.println(str);
            /****************************************************/
            if(str.indexOf('n') > 0){//存在消息结束标志
                break;
            }
            /*****************************************************/
        }
        //is.close();
        System.out.println("Received");
        System.out.println("Sending...");
        BufferedOutputStream  out = new BufferedOutputStream(socket.getOutputStream());
        out.write("你好,我是服务器".getBytes());
        out.flush();
        out.close();
        is.close();
        socket.close();
        System.out.println("Send Over!");
    }
}

客户端

import java.net.*;
import java.io.*;
public class  Client
{
    public static void main(String[] args) throws Exception
    {
        Socket socket = new Socket("localhost",8888);
        BufferedOutputStream  out = new BufferedOutputStream(socket.getOutputStream());
        /********************表示发送结束*****************************/
        out.write("你好,我是客户端n".getBytes());
        out.flush();
        //out.close();有这句话时,服务器可以读到一个-1
        System.out.println("Send Over!");
        System.out.println("Receiving...");
        BufferedInputStream is = new BufferedInputStream(socket.getInputStream());
        byte[] buff = new byte[1024];
        int size;
        while((size = is.read(buff)) != -1){
            System.out.println(new String(buff,0,size));
        }
        is.close();
        out.close();
        socket.close();
        System.out.println("Received!");
    }
}

时间: 2024-08-29 13:28:42

java中BufferedInputStream的方法问题的相关文章

java中关于dismiss方法的使用

问题描述 java中关于dismiss方法的使用 myDialog.dismiss( )比如这条语句中是关闭一个对话框的意思吗dismiss还有哪些方面的应用 解决方案 看下这个函数的源码上面的注释信息,jdk源码上的英文注释就是很好的参考文档的. 解决方案二: 这和java语言没有关系,这只是dialog对象定义的方法罢了.你也可以写一个类,定义一个叫dismiss的方法. 在英文字面看来,dismiss就是消失的意思. 解决方案三: java中waitnotifynotifyAll的使用方法

java中this作为方法名的时候的问题,不知道我把它看成方法名正步正确

问题描述 java中this作为方法名的时候的问题,不知道我把它看成方法名正步正确 如下代码所示, public MyView(Context context) { this(context null); } //this在这里是方法吗,this是一个方法名吗? 解决方案 this用来调用你这个类中定义的一个构造方法 解决方案二: this不是方法名,而是Java中对当前对象的引用.例如当前对象的引用用this,父类对象的引用用super 解决方案三: 一个类中定义两个构造函数,在一个构造函数中

java中不能修饰方法不能修饰变量不能修饰类的关键词分别是什么

问题描述 java中不能修饰方法不能修饰变量不能修饰类的关键词分别是什么 java中不能修饰方法不能修饰变量不能修饰类的关键词分别是什么 实现现多个接口的类是不是必须重写其所有方法, 解决方案 首先,第一个问题,了解哪些关键词能修饰方法.变量.类比较容易些. 修饰方法的关键字:public/private/protected/default ,static, 修饰变量了:final ,static:修饰类的:public/private/protected/default,static 其次,实

如何理解java中 对象.this方法 还有 类.this.方法的 意义

问题描述 如何理解java中 对象.this方法 还有 类.this.方法的 意义 如何理解java中 对象.this方法 还有 类.this.方法的 意义 有没有这两种语法规则呢 解决方案 this.方法是在某个对象的实例方法内,this代表当前实例.一般情况下不用写,除非它和参数重名才需要: class A { int a; int b; public void seta(int a) { this.a = a; //因为参数a和成员变量a都叫a,所以需要区分. b = a; //相当于th

java中对象调用方法返回一个对象的问题

问题描述 java中对象调用方法返回一个对象的问题 例如session.createQuery(hql); 那么这条语句返回的对象属于哪个类呢,如何判断呢? 解决方案 ctrl加鼠标点击createQuery,会有返回方法,或者你在通过session点的时候也可以看到返回方法. 解决方案二: 按住ctrl点击方法,自己去看方法的返回值. 解决方案三: 在java中将一个对象的所有方法打印出来java中远程对象方法调用中的安全策略问题java中返回局部对象问题 解决方案四: 事实上他返回的还是qu

如何理解java中的某些方法不是线程安全的(不能同步访问)。

问题描述 如何理解java中的某些方法不是线程安全的(不能同步访问). 如何理解java中的某些方法不是线程安全的(不能同步访问). 能同步访问的方法有哪些,如何判断一个方法能不能同步访问 解决方案 不是线程安全的(不能同步访问) 你说反了.不是线程安全的才需要同步访问.同步访问的意思就是串行执行,等前面执行完了,再执行后面的. 线程不安全的场合很多,比如像操作系统中的用户界面.打印机等外设.控制台输出,都不允许并发(设想两个程序同时要输出文字到同一个屏幕,那还不乱套了) 在代码中,每个线程有自

java中有关get方法的使用(具体程序分析)

问题描述 java中有关get方法的使用(具体程序分析) 最近在学习java,用的徐彩霞的java基础教程. 有个例子不太明白. /* /注释部分的get部分有和没有结果一样,想知道为什么要用get? 又必须要用的情况吗? 刚学,懂得比较少,谢谢了~ class Person { private String name; private int age; private void talk() { System.out.print("I'm "+name+" and &quo

java中关于add方法的使用

问题描述 java中关于add方法的使用 add方法单独使用吗 一定要有对象吗,对象.add( ) add方法前面的对象的选取范围是什么,哪些类的对象才可以使用add方法 解决方案 可能你有点钻牛角尖了. add()方法跟其它方法在本质上并没有太大的区别,每个方法实现什么样的功能,也都是我们或者定义这个方法的人赋予的. 所有方法最终必须是基于类的,所以我们在调用方法的时候,才会有对象.add(),或者对象.remove()等 可能有的时候,你见到了一个方法使用的时候前边并没有对象或者类来调用,这

对象-java中重写equals方法为什么不直接在里面比较hashcode()?

问题描述 java中重写equals方法为什么不直接在里面比较hashcode()? 看书上说只要重写在一个类中重写equals方法,那就一定要重写hashcode方法,因为两个对象只要equals返回值为true,那么他俩的hashcode就一定相同. 那为什么不可以提前先写好hashcode函数,然后在equals函数里面直接来一行if(this.hashcode() == otherObject.hashcode()) return true;else return false;就行了?