今天复习到写一个文本转化器,客户端发一行字符,服务端转为大写后发回来。
前一天我写的时候,还是没问题的:
import java.net.*;
import java.io.*;
public class TCP_Client {
public static void main(String[] args) throws Exception {
try {
Socket tcpClientSocket = new Socket(InetAddress.getLocalHost(),
10002);
OutputStream out = tcpClientSocket.getOutputStream();
InputStream in = tcpClientSocket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
String s = null;
byte[] buf = new byte[1024];
int len = 0;
while ((s = br.readLine()) != null) {
if (s.equals("OVER")) {
out.write(s.getBytes());
System.out.println("...closing.");
Thread.sleep(3000);
break;
}
out.write(s.getBytes());
len = in.read(buf);
System.out.println("Convert : " + new String(buf, 0, len));
}
tcpClientSocket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.net.*;
import java.io.*;
public class TCP_Server {
public static void main(String[] args) throws Exception {
try {
ServerSocket tcpServerSocket = new ServerSocket(10002);
Socket tcpClientSocket = tcpServerSocket.accept();
System.out.println(tcpClientSocket.getLocalAddress()
+ "...connected.");
OutputStream out = tcpClientSocket.getOutputStream();
InputStream in = tcpClientSocket.getInputStream();
byte[] buf = new byte[1024];
int len = 0;
while (true) {
len = in.read(buf);
String s = new String(buf, 0, len);
if (s.equals("OVER")) {
break;
}
System.out.println("Get : " + s);
out.write((s.toUpperCase()).getBytes());
}
tcpServerSocket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
过了一天,我用缓冲区技术再做一次,就怎么都不行了,
每次都是客户端连接上后,输入一行字符就卡住了。
通过对比观察,才发现自己之前一直忽略的一个问题:
readLine() 读取一个文本行。
通过下列字符之一即可认为某行已终止:
换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。
因此,上面的方法我是用read()方法来读取,能够读到换行符号,
改为BufferedReader后用readLine()就不行了。
修改后代码如下:
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) throws UnknownHostException,
IOException {
Socket tcpClientSocket = new Socket(InetAddress.getByName("localhost"),
10004);
BufferedReader keyIn = new BufferedReader(new InputStreamReader(
System.in));
BufferedReader readIn = new BufferedReader(new InputStreamReader(
tcpClientSocket.getInputStream()));
BufferedWriter writeOut = new BufferedWriter(new OutputStreamWriter(
tcpClientSocket.getOutputStream()));
String convertStr = null;
while ((convertStr = keyIn.readLine()) != null) {
if (convertStr.equals("OVER")) {
writeOut.write(convertStr);
writeOut.newLine();
writeOut.flush();
break;
}
writeOut.write(convertStr);
writeOut.newLine();
writeOut.flush();
System.out.println("After:" + readIn.readLine());
}
tcpClientSocket.close();
}
}
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) throws UnknownHostException,
IOException {
ServerSocket tcpServerSocket = new ServerSocket(10004);
Socket tcpClientSocket = tcpServerSocket.accept();
BufferedReader readIn = new BufferedReader(new InputStreamReader(
tcpClientSocket.getInputStream()));
BufferedWriter writeOut = new BufferedWriter(new OutputStreamWriter(
tcpClientSocket.getOutputStream()));
String convertStr = null;
while (true) {
convertStr = readIn.readLine();
writeOut.write(convertStr.toUpperCase());
writeOut.newLine();
writeOut.flush();
}
}
}
主要看BufferedWriter和BufferedReader的配合使用,其他一些逻辑和操作缺少的请自动忽略。
感谢这个百度知道答案:Java的流中为什么BufferedReader要写入一个newLine()才能换行