黑马程序员-TCP传输练习出现的问题

时间:2023-02-21 15:25:21
---------------------- android培训、java培训、期待与您交流! ----------------------


需求:建立一个文本转换服务器
客户端给服务端发送文本,服务端会将文本转成大写再返回给客户端,而且客户端可以不断的进行文本转换,当客户端输入over时,转换结束

分析:
客户端;
既然是操作设备上的数据,那么就可以使用io技术,并按照io的操作规律来思考。
源:键盘录入。
目的:网络设备,网络输出流。
而且操作的是文本数据,可以选择字符流。同时提高效率,加入缓冲

步骤:
1,建立服务
2,获取键盘录入
3,将数据发给服务端
4,获取服务端返回的大写数据
5,关闭资源

import java.io.*;
import java.net.*;
class TransClient 
{
public static void main(String[] args) throws Exception
{
Socket s = new Socket("192.168.1.232",6000);
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
//定义目的,将数据写入到socket输入流,发送给服务端
BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//定义一个socket读取流,读取服务端返回的大写信息
BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
String line = null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
bufOut.write(line);
bufOut.newLine();
bufOut.flush();//刷新
String str = bufIn.readLine();
System.out.println("server:"+str);
}
bufr.close();
s.close();
}
}

class TransServer
{
public static void main(String args[]) throws Exception
{
ServerSocket ss = new ServerSocket(6000);
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"---connected!");
//读取socket读取流中的数据
BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
//目的,socket输出流,将大写数据写入到socket输出流,并发送给客户端
BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String  line=null;
while((line=bufIn.readLine())!=null)//readLine也是阻塞式方法
{
System.out.println(line);
bufOut.write(line.toUpperCase());
bufOut.newLine();
bufOut.flush();
}
s.close();
ss.close();
}
}
                                  因为该程序使用的是BufferedReader,即缓冲区。当读取数据时,是将数据读到缓冲区中,所以必须要使用bufOut.flush()方法将缓冲区中的数据刷新才能读到。再一个需要注意的地方就是readLine()方法,它是读取从键盘录入的字符,直到遇到回车符,所以在bufOut.write()后,必须要用bufOut.newLine()方法来停止数据录入。都则就会出错。我们还可以使用另一种方法来读取数据,使用PrintWriter()方法,不用再创建缓冲输出流,PrintWriter out = new PrintWriter(s.getOutputStream(),true)即可。它是可以自动刷新的。这样就方便了许多,而且它不仅可以接收字节流,还可以接收字符流。


---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima