黑马程序员技术交流社区
标题:
亲们,解释啊
[打印本页]
作者:
环球信息中心
时间:
2014-4-21 20:20
标题:
亲们,解释啊
先启动服务器端程序,再启动客户端程序。先由客户端发送一行字符串过去,服务器收到后再返回一个字符串,现在一运行程序就卡死了,求解?
服务器端代码如下:
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();
}
}
作者:
sheng6699
时间:
2014-4-21 20:28
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,
作者:
osully
时间:
2014-4-21 20:49
把os.flush();这句话改成以下就句就可以
socket.shutdownOutput();
给服务器一个结尾信号
作者:
坏米饭
时间:
2014-4-21 21:31
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();
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2