在学习TCP的过程中,通过写代码做练习,对网络通信过程还有一些细节有了更进一步的理解.
readLine(),是不读换行符的,在开始写的时候没注意到,导致服务端客户端都无限等待.
newLine();必须加
另外,内部类访问本地变量,需要声明为最终类型,这一点我开始怎么也想不通,后来查阅相关资料,觉得这个理解比较靠谱:
内部类在调用本地变量时,会创建一个同类型的变量,用构造方法赋同样的值,但不管内部怎么操作,外部变量是不变的,这
似乎不符合我们调用本地变量的初衷和逻辑,故而直接规定内部类访问本地变量,需要声明为最终类型
import java.io.*;
import java.net.*;
class TcpClient {
public static void main(String[] args) throws Exception{
Socket s = new Socket(InetAddress.getByName("192.168.100.100"),10761);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
BufferedReader serverIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
for (String line = null; (line=in.readLine())!=null; ) {//readLine不读换行符
out.write(line,0,line.length());
out.newLine();
out.flush();
String serverline = serverIn.readLine();
System.out.println("server:"+serverline);
if ("886".equals(line)){
s.close();
break;
}
}
}
}
class TcpServer {
public static void main(String[] args) throws Exception{
ServerSocket ss = new ServerSocket(10761);
Socket s = ss.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String ip = s.getInetAddress().getHostAddress();
for (String line=null; (line=in.readLine())!=null; ) {
System.out.println(ip+"::"+line);
out.write("\""+line+"\""+"已收到");
out.newLine();
out.flush();
if ("886".equals(line)){
s.close();
break;
}
}
}
}