服务器代码如下
public class server {
public static void main(String[] args) throws IOException {
ServerSocket server=new ServerSocket(5678);
Socket socket=server.accept();
InputStream is=socket.getInputStream();
OutputStream os=socket.getOutputStream();
Scanner input=new Scanner(is);
PrintWriter out=new PrintWriter(os,true);
out.print("链接服务器成功");
out.print("end");
String sr;
while (true) {
sr=input.nextLine();
if (sr.equals("end")) {
break;
}
System.out.println(" 客户端说"+sr);
}
socket.close();
}
}
客户端代码如下
public class Clint {
public static void main(String[] args) throws UnknownHostException, IOException {
// TODO 自动生成的方法存根
Socket socket=new Socket(InetAddress.getLocalHost(), 5678);
InputStream is=socket.getInputStream();
OutputStream os=socket.getOutputStream();
Scanner in=new Scanner(is);
PrintWriter out=new PrintWriter(os,true);
String sr,sw;
while (true) {
sr=in.nextLine();
System.out.println("服务器说 "+sr);
if (sr.equals("end")) {
break;
}
}
Scanner input=new Scanner(System.in);
while (true) {
System.out.print(" 客戶端說");
sw=input.next();
out.println(sw);
if (sw.equals("end")) {
break;
}
}
socket.close();
}
}
最初客户端一直无法读取到服务器返回的消息,后来发现是在服务器如下两行代码的问题
out.print("链接服务器成功");
out.print("end");
应该修改为如下代码
out.println("链接服务器成功");
out.println("end");
print的源码如下
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}
而println的源码如下
public void println(String x) {
synchronized (lock) {
print(x);
println();
}
}
而在println(String x)中又调用了println()方法
public void println() {
newLine();
}
其中调用了newLine()方法
源码如下
private void newLine() {
try {
synchronized (lock) {
ensureOpen();
out.write(lineSeparator);
if (autoFlush)
out.flush();
}
}
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}
可以看出println()方法中多了一个out.write(lineSeparator);
添加了一个分隔符,并且可以设置自动flush
因为默认的autoFlush=false,可以在创建PrintWriter时设置为true。
PrintWriter writer = new PrintWriter(socket.getOutputStream(),true);
有如下代码
inReader.readLine()
可看出readLine()是一行一行读取数据,而标识一行的方式就是使用分隔符。