为了账号安全,请及时绑定邮箱和手机立即绑定

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

我发觉, 我像老师那样写,必须  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') 符。 


正在回答

2 回答

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

0 回复 有任何疑惑可以回复我~
#1

Mass0

请问您现在搞懂这个问题了吗?我也遇到了类似的问题,我按照老师的代码敲得,可是客户端的console没有任何反应,服务器端的反应正常。我发现是因为服务器传回的消息是null 我很奇怪 明明调用了PrintWriter
2016-01-24 回复 有任何疑惑可以回复我~

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') 符。 


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信