大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
今天在写一个关于socket的程序,无意间把PrintWriter中的print与println混淆了,于是写了个小demo测试了一下,代码如下:
服务端代码:
package com.city.server;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class CityServer {
public static void main(String [] args){
ServerSocket serverSocket=null;
Socket socket=null;
int port=9999;
try {
System.out.println("准备启动服务......");
serverSocket=new ServerSocket(port);
socket=serverSocket.accept();
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter ps=new PrintWriter(socket.getOutputStream(),true);
String b=br.readLine();
System.out.println("客户端发送的消息:"+b);
System.out.println("服务器准备返回信息!");
System.out.println("返回信息时:我是服务器!");
ps.println("我是服务器!");
//ps.print("我是服务器! \n");
//ps.flush();
System.out.println("----------------------");
} catch (Exception e) {
// TODO: handle exception
}
}
}
客户端代码:
package com.city.client;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
public class CityClient {
public static void main(String[] args) {
Socket socket=null;
int port=9999;
try {
System.out.println("准备启动客户端......");
socket=new Socket(InetAddress.getLocalHost(), port);
PrintWriter ps=new PrintWriter(socket.getOutputStream(),true);
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String msg="你好,我是客户端!";
ps.println(msg);
//ps.print(msg+"\n");
//ps.flush();
String b=br.readLine();
System.out.println("服务器返回消息:"+b);
} catch (Exception e) {
// TODO: handle exception
}
}
}
以上代码执行结果为:
服务端结果
客户端结果
把上列程序中的服务端的
ps.println("我是服务器!");
修改为ps.print("我是服务器!");
然后执行!结果如下:
服务端结果:
客户端结果:
然后把修改的代码注释掉,打开服务端以前注释掉的部分,执行结果与第一次相同。那为什么呢?通过百度之后,并对比print与println源码,现总结如下:
printwriter如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作,而不是每当正好输出换行符时才完成。这些方法使用平台自有的行分隔符概念,而不是换行符。
此外,在println中,已经调用过flush()方法,源代码如下:
public void println() {
newLine();
}
private void newLine() {
try {
synchronized (lock) {
ensureOpen();
out.write(lineSeparator);
if (autoFlush)//这里就调用了flush()方法
out.flush();
}
}
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}
在print中则没有,源代码如下:
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}
所以,在使用print方法的时候必须在发送的数据后面添加”\n”换行符标识以及在后面要调用flush()方法。
文章转载自:
https://blog.csdn.net/qq_29306775/article/details/52242033
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/169301.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...