A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© steven152 中级黑马   /  2014-8-23 05:30  /  2005 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

以下是跟毕老师敲的,但是还是报异常等待,看了半天不知道哪里出错了,请大神忙找一找!谢谢!
import java.io.*;
import java.net.*;
class TransClient {
         public static void main(String [] args) throws Exception
            {
                  Socket s =new Socket("192.168.1.137",10005);
                  //定义读取键盘数据的流对象。
                  BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
                  //定义目的,将数据写入到socket输入流,发给服务端。
                 // 用下面简化方法BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
                 PrintWriter out = new PrintWriter(s.getOutputStream(),true);
                  //定义一个socket读取流,读取服务端返回的大写信息。
                  BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
                  String line = null;
                  while((line = bufr.readLine())!= null)
                  {
                          if("over".equals(line))
                                  break;
                          out.print(line);
                         // bufOut.write(line);
                          //bufOut.newLine();//结束标记!**
                          //bufOut.flush();
                          String str = bufIn.readLine();
                          System.out.print("server:"+str);
                  }
                  bufr.close();
                  s.close();
            }
         
}
/*
服务端:
源:socket读取流。
目的:socket输出流,
都是文本,装饰。
*/
class TransServer
{
        public static void main(String [] args) throws Exception
    {
                ServerSocket ss = new ServerSocket(10005);
                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()));
                PrintWriter out = new PrintWriter(s.getOutputStream(),true);
                String line = null;
                while ((line=bufIn.readLine())!=null)
                {
                        System.out.println(line);
                        out.println(line.toUpperCase());
                        //用上面简化方法bufOut.write(line.toUpperCase());
                        //bufOut.newLine();//结束标记!**
                        //bufOut.flush();
                }
                s.close();
                ss.close();
    }
}

4 个回复

倒序浏览
  1. out.print(line);
复制代码

你的客户端,没有给出换行标记,服务端一直等待换行,而客户端发送一次后一直等待服务器反馈信息,所以造成双等待了。只要你改为
  1. out.println(line);
复制代码
回复 使用道具 举报
readLine()是一行一行的读取,因此如果你在输入的时候没有一个换行结束符号的话,就会认为你这一行还没有输入完成,就会等带着你的换行结束符,才会往下继续执行
回复 使用道具 举报
hejinzhong 发表于 2014-8-23 07:40
你的客户端,没有给出换行标记,服务端一直等待换行,而客户端发送一次后一直等待服务器反馈信息,所以造 ...

刚试了下没用,还是等待中。在哪个位置加上这行代码?
回复 使用道具 举报
steven152 发表于 2014-8-24 11:12
刚试了下没用,还是等待中。在哪个位置加上这行代码?

if("over".equals(line))
  break;
out.print(line);//把这个换成println,上面不是把这两句对比都给你打出来了吗
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马