问答详情
源自:3-5 使用多线程实现多客户端的通信

我想基于老师的代码,实现聊天的功能,请问该怎么写啊?

我发觉, 我像老师那样写,必须  socket.shutdownOutput();

否则,数据根本发不过去。  

但是一旦关闭了 输出流, 又无法重新打开输出流,从而导致只能输一次话。。


public class Client {
public static void main(String[] args) {
        try
        {
        Socket socket=new Socket("localHost",8886);
            OutputStream os = socket.getOutputStream();
            BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os));
            while (true)
            {
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(System.in));
                String line = reader.readLine();
                bw.write(line);
                bw.newLine();//添加了写一行操作,  服务端勉强能接收消息了
                bw.flush();
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}
/*
 *服务端接收
 */
public class Server {
public static void main(String[] args) {
//1.创建一个服务器端Socket,指定绑定端口
try {
ServerSocket server=new ServerSocket(8886);
System.out.println("服务器启动,等待客户端连接");
Socket socket=server.accept();
System.out.println("客户端连接成功,"+socket.toString());
InputStream is=socket.getInputStream();
while(true){
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
if((br.readLine())!=null){//说是勉强,因为我发觉必须把if语句去掉后, 才能收到消息,请问是怎么回事啊?
System.out.println(br.readLine());
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

1.当客户端不加newLine()的时候,没接收到消息过。除非shutdownOutput()才能输出一次,看了API,关闭输出流的时候把数据发送过去了。 所以说是没法过去的原因。\t\n之类的也知道一点,但是,为何加newLine()有机会收到?

2.说是有机会收到,因为我在客户端加了newLine(),去掉服务端的 If 才能收到,我完全部知道为什么能在客户端读到,为什么又读不到

if((br.readLine())!=null){

System.out.println(br.readLine());

}

感觉没错啊, 为啥上面的代码不能输出, 去掉If就能输出了,因为if是有问题可以肯定, 但是具体错在哪儿了?

3. 如何设置IP才能放在朋友那里执行客户端, 能够跟我通信,  直接百度得到我的IP,但是朋友根本连不上这个IP。

public void newLine()
            throws IOException

写入一个行分隔符。行分隔符字符串由系统属性 line.separator 定义,并且不一定是单个新行 ('\n') 符。 


提问者:风中过客 2015-05-29 15:33

个回答

  • 风中过客
    2015-05-29 21:27:12

    用其他包装流 写出来了。 但是这个问题还是没搞懂。

  • 风中过客
    2015-05-29 19:17:04

    public class Client {

    public static void main(String[] args) {

            try

            {

            Socket socket=new Socket("localHost",8886);

                OutputStream os = socket.getOutputStream();

                BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os));


                while (true)

                {

                    BufferedReader reader = new BufferedReader(

                            new InputStreamReader(System.in));

                    String line = reader.readLine();

                    bw.write(line);

                    bw.newLine();//添加了写一行操作,  服务端勉强能接收消息了

                    bw.flush();

                }

            }

            catch (IOException e)

            {

                e.printStackTrace();

            }


        }

    }

    /*

     *服务端接收

     */


    public class Server {

    public static void main(String[] args) {

    //1.创建一个服务器端Socket,指定绑定端口

    try {

    ServerSocket server=new ServerSocket(8886);

    System.out.println("服务器启动,等待客户端连接");

    Socket socket=server.accept();

    System.out.println("客户端连接成功,"+socket.toString());

    InputStream is=socket.getInputStream();

    while(true){

    InputStreamReader isr=new InputStreamReader(is);

    BufferedReader br=new BufferedReader(isr);

    if((br.readLine())!=null){//说是勉强,因为我发觉必须把if语句去掉后, 才能收到消息,请问是怎么回事啊?

    System.out.println(br.readLine());

    }

    }

    } catch (IOException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    }

    1. 当客户端不加newLine()的时候,没接收到消息过。除非shutdownOutput()才能输出一次,看了API,关闭输出流的时候把数据发送过去了。 所以说是没法过去的原因。\t\n之类的也知道一点,但是,为何加newLine()有机会收到?

    2. 说是有机会收到,因为我在客户端加了newLine(),去掉服务端的 If 才能收到,我完全部知道为什么能在客户端读到,为什么又读不到

      if((br.readLine())!=null){

      System.out.println(br.readLine());

      }

      感觉没错啊, 为啥上面的代码不能输出, 去掉If就能输出了,因为if是有问题可以肯定, 但是具体错在哪儿了?


    public void newLine()
                throws IOException

    写入一个行分隔符。行分隔符字符串由系统属性 line.separator 定义,并且不一定是单个新行 ('\n') 符。