求指导,尚学堂 马士兵上课讲的那个小程序TalkServer/TalkClient有点问题搞不懂
单独用OutputStreamWrite()读取时可以的,但是放到这个for循环里就不可以了。
过程:连接服务器之后,首先client端发送一个消息到Server端,用write()方法(即注释掉的方法不可以),而用PrintWriter的println()方法就可以成功,两者有什么区别吗?马士兵老师课堂上讲的是第二种方法自己尝试别的方法出错!
具体代码:
TCP编程 服务器端:
public class TalkServer {
public static void main(String[] args){
try {
ServerSocket ss=new ServerSocket(6666);
Socket s=ss.accept();
System.out.println("hello client "+s.getInetAddress());
InputStreamReader cisr = new InputStreamReader(s.getInputStream());
BufferedReader cbfr=new BufferedReader(cisr);
System.out.println("client: "+cbfr.readLine());
InputStreamReader sisr= new InputStreamReader(System.in);
BufferedReader sbr=new BufferedReader(sisr);
String str=sbr.readLine();
//OutputStreamWriter osw;
//osw=new OutputStreamWriter(s.getOutputStream());
PrintWriter spr=new PrintWriter(s.getOutputStream());
while(! str.equals("bye")) {
spr.println(str);
spr.flush();
// osw.write(str);
// osw.flush();
System.out.println("server:"+str);
System.out.println("client: "+cbfr.readLine()); //客户端再读入一行
str=sbr.readLine();
}
sbr.close();
//osw.close();
// spr.close();
cisr.close(); cbfr.close();
s.close();
ss.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端程序
public class TalkClient {
public static void main(String[] args){
try {
Socket s=new Socket("localhost",6666);
InputStreamReader cisr =new InputStreamReader(System.in);
BufferedReader cbr=new BufferedReader(cisr);
String str=cbr.readLine();
// OutputStreamWriter osw=new OutputStreamWriter(s.getOutputStream()) ;
//!!!这里使用PrintWriter()而使用osw.write()区别???为什么使用这种方法server端接收不到数据?相互发送不成功???
// BufferedWriter sbw=new BufferedWriter(osw);;
PrintWriter pw=new PrintWriter(s.getOutputStream());
InputStreamReader sin =new InputStreamReader(s.getInputStream());
BufferedReader sbr=new BufferedReader(sin);
while(! str.equals("bye")) {
pw.println(str);
pw.flush();
// sbw.write(str);
// sbw.flush();
System.out.println("client: "+str);
System.out.println("server: "+sbr.readLine());
str=cbr.readLine();
}
cbr.close(); sin.close(); sbr.close();
//pw.close();
s.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}