黑马程序员技术交流社区

标题: 求教,我真的不知道哪里错了!Tcp,socket输出输入流。 [打印本页]

作者: 王晓楠    时间: 2013-1-31 00:56
标题: 求教,我真的不知道哪里错了!Tcp,socket输出输入流。
客户端:
  1. import java.io.BufferedReader;
  2. import java.io.BufferedWriter;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStreamWriter;
  7. import java.io.PrintWriter;
  8. import java.net.Socket;
  9. import java.net.UnknownHostException;

  10. public class CopyOfTransClient {

  11.         public static void main(String args[]) throws UnknownHostException,
  12.                         IOException {
  13.                 run();
  14.                         }

  15.        
  16.         public static void run() throws UnknownHostException, IOException {
  17.                 // 连接服务端、获取客户端输出流。
  18.                 Socket socket = new Socket("192.168.0.3", 10009);

  19.                 BufferedWriter bwso = new BufferedWriter(new OutputStreamWriter(
  20.                                 socket.getOutputStream()));

  21.                 // 获取键盘录入。socket输出流输出。
  22.                 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  23.                
  24.                 // socket输入流。
  25.                 BufferedReader brso = new BufferedReader(new InputStreamReader(
  26.                                 socket.getInputStream()));

  27.                 String str = null;
  28.                 while ((str = br.readLine()) != null) {
  29.                         if (str.equals("over"))
  30.                                 break;
  31.                         bwso.write(str);
  32.                         bwso.flush();

  33.                         // socket输入流。接受服务端的反馈。
  34.                         String strso = brso.readLine();
  35.                         System.out.println(strso);
  36.                         bwso.close();
  37.                         br.close();
  38.                 }

  39.         }
  40. }
复制代码
服务端:
  1. import java.io.BufferedReader;
  2. import java.io.BufferedWriter;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStream;
  7. import java.io.OutputStreamWriter;
  8. import java.net.ServerSocket;
  9. import java.net.Socket;

  10. public class CopyOfTransServer {
  11.         public static void main(String args[]) throws IOException {
  12.                 run();
  13.         }               
  14.        
  15.         public static void run() throws IOException {
  16.                 // 获取连接过来的客户端。
  17.                 ServerSocket serverSocket = new ServerSocket(10009);
  18.                 Socket socket = serverSocket.accept();
  19.                
  20.                 //获取ip
  21.                 String ip = socket.getInetAddress().getHostAddress();
  22.                 System.out.println(ip);

  23.                 // 获取客户端流对象。
  24.                 BufferedReader br = new BufferedReader(new InputStreamReader(
  25.                                 socket.getInputStream()));

  26.                 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
  27.                                 socket.getOutputStream()));
  28.                
  29.                 String str = null;
  30.                 while ((str = br.readLine()) != null) {
  31.                         bw.write(str.toUpperCase());
  32.                 }
  33.                 serverSocket.close();
  34.                 socket.close();

  35.         }


  36. }
复制代码

作者: 王晓楠    时间: 2013-1-31 01:57
本帖最后由 王晓楠 于 2013-1-31 01:59 编辑

哎,谁知毕老师接下来讲的就是这个问题!3个错误!
1.客户端write()方法后要进行刷新flush(),因为要写入的数据只是到了write()方法的缓冲区,没有写入预期目标。
2.因为客户端在34行没有读到结束标记“\r\n”(这点可以从毕老师讲的readLine()方法原理可以知道),刷新后,服务端就在33行读,它读到了数据,但就是等不到结束标记,因为她是readLine()方法,他就一直等。造成了阻塞。所以,客户端在write()要加“\r\n”,服务端也要在write()加“\r\n”(因为客户端读取用的也是readLine()方法).
3.客户端43、44行的输出输入流不应该关。要关也应该在while循环外关。客户端也应该在while循环外关!
作者: 胡发友    时间: 2013-1-31 10:08
一、客户端
       1、的输出流brso,应加newLine方法,因为flush和newLine方法一般都是一起使用;

作者: 胡发友    时间: 2013-1-31 10:09
  2、关流动作应在循环外


作者: 胡发友    时间: 2013-1-31 10:40
这样写:
     import java.io.*;
import java.net.*;

class Client
{
        public static void main(String [] args)throws IOException
        {
                Socket s = new Socket("192.168.2.109",10002);
               
                BufferedReader bufr =
                        new BufferedReader(new InputStreamReader(System.in));
               
                BufferedWriter bufOut =
                        new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
               
                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(str);
                }
                bufr.close();
                s.close();
        }
}
class Server
{
        public static void main(String [] args)throws IOException
        {
                ServerSocket ss = new ServerSocket(10002);
               
                Socket s = ss.accept();
               
                String ip = s.getInetAddress().getHostAddress();
               
                System.out.println(ip + "connected...");
               
                BufferedReader bufIn =
                        new BufferedReader(new InputStreamReader(s.getInputStream()));
               
                BufferedWriter bufOut =
                        new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
               
                String line = null;
                while((line = bufIn.readLine()) != null)
                {
                        bufOut.write(line.toUpperCase());
                        bufOut.newLine();
                        bufOut.flush();
                }
                ss.close();
        }
}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2