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

© 环球信息中心 中级黑马   /  2014-4-21 20:20  /  1066 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

先启动服务器端程序,再启动客户端程序。先由客户端发送一行字符串过去,服务器收到后再返回一个字符串,现在一运行程序就卡死了,求解?
服务器端代码如下:
public class ServerTest
{
public static void main(String[] args) throws Exception
{
  ServerSocket ss = new ServerSocket(4000);
  Socket socket = ss.accept();
  InputStream is = socket.getInputStream();
  String str = "";
  byte[] buffer = new byte[1024];
  int len = 0;
  while ((len = is.read(buffer, 0, buffer.length)) != -1)
  {
   str += new String(buffer, 0, len);
  }
  System.out.println("客户端发送数据为:" + str);
  
  OutputStream os = socket.getOutputStream();
  os.write("hello".getBytes());
  
  socket.close();
}
}

客户端代码为:
public class ClientTest
{
public static void main(String[] args) throws Exception
{
  Socket socket = new Socket("127.0.0.1", 4000);
  
  OutputStream os = socket.getOutputStream();
  os.write("你好,服务器!".getBytes());
  os.flush();
  
  InputStream is = socket.getInputStream();
  int len = 0;
  byte[] buffer = new byte[1024];
  String str = "";
  while ((len = is.read(buffer, 0, buffer.length)) != -1)
  {
   str += new String(buffer, 0, len);
  }
  System.out.println("服务器发送数据为:" + str);
  
  socket.close();
}
}

3 个回复

倒序浏览
1 int len = 0;这里定义有点问题。
2 如果len初始化为0,下面的while loop的条件应该是while ((len = is.read(buffer, 0, buffer.length)) > 0).
3 如果len初始化为-1,下面的while loop的条件可以是while ((len = is.read(buffer, 0, buffer.length)) != -1)

可以看看文章http://daoyongyu.iteye.com/blog/265677,
回复 使用道具 举报
把os.flush();这句话改成以下就句就可以
socket.shutdownOutput();

给服务器一个结尾信号
回复 使用道具 举报
while ((len = is.read(buffer, 0, buffer.length)) != -1)
  {
   str += new String(buffer, 0, len);
  }启动服务器,执行到循环的时候,最程序就一直在等客户端发数据,客户端发送数据后,服务器就在while循环的判断语句中执行了一句,is.read(buffer,0,buffer.length),循环中 str += new String(buffer, 0, len);处理后,又在等客户端发送数据,但是!你while判断的是is.read()!=-1,而,客户端发送任何数据,都不能让is.read()==-1,所以循环始终不会结束,也就一直卡着了。
这时, 你把客户端关闭,服务器端肯定会输出数据。
因为客户端关闭,就相当于把流关闭,关闭流时,流会发送-1这个标记出去,服务器接收到,就循环结束,就打印数据了。
改成这样:
public class ServerTest
{
public static void main(String[] args) throws Exception
{

  ServerSocket ss = new ServerSocket(4000);

  Socket socket = ss.accept();
  BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  String str = "";
  byte[] buffer = new byte[1024];
  String  len = null;
  while ((len = is.readLine()) !=null)
  {
          if("over".equals(len)){
                  System.out.println("客户端发送数据为:" + str);
                  break;
          }
          str += len;
  }
  OutputStream os = socket.getOutputStream();
  os.write("hello".getBytes());
  
  socket.close();
}
}
--------客户端-----------
public class ClientTest
{
public static void main(String[] args) throws Exception
{
  Socket socket = new Socket("127.0.0.1", 4000);
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  BufferedWriter os = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
  String str =null;
  while(true){
          str = br.readLine();
          os.write(str);
          os.newLine();
          os.flush();

          if("over".equals(str))
                  break;
  }
  
  InputStream is = socket.getInputStream();
  int len = 0;
  byte[] buffer = new byte[1024];
  String strServ = "";
  while ((len = is.read(buffer, 0, buffer.length)) != -1)
  {
          if(new String(buffer, 0, len)=="over")
                  break;
   strServ += new String(buffer, 0, len);
   
  }
  System.out.println("服务器发送数据为:" + strServ);
  os.close();
  socket.close();
}
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马