我想基于老师的代码,实现聊天的功能,请问该怎么写啊?
我发觉, 我像老师那样写,必须 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') 符。