求助 关于 Socket 的一点小问题
写了个简单的 客户端发送信息到服务端, 服务端收到后回一信息到客户端 , 可是运行后怎么就卡着不动了?? 求指点这是服务端的代码
程序代码:
import java.io.*;
import java.net.*;
public class TServerSocket{
public static void main(String args[]) throws Exception{
BufferedReader br = null; //建立输入管道
OutputStreamWriter osw = null; // 建立输出管道
ServerSocket ss = new ServerSocket(6678);
String s1 = null;
while (true){
Socket s = ss.accept();
System.out.println("is connect");
br = new BufferedReader(new InputStreamReader(s.getInputStream() ) );
osw = new OutputStreamWriter(s.getOutputStream() );
System.out.println(br.readLine() ); // 读取客户端的信息
try {
osw.write("hihi"); // 写信息到客户端
osw.flush();
osw.close();
} catch (IOException ie){
ie.printStackTrace();
}
br.close();
s.close();
}
}
}
import java.net.*;
public class TServerSocket{
public static void main(String args[]) throws Exception{
BufferedReader br = null; //建立输入管道
OutputStreamWriter osw = null; // 建立输出管道
ServerSocket ss = new ServerSocket(6678);
String s1 = null;
while (true){
Socket s = ss.accept();
System.out.println("is connect");
br = new BufferedReader(new InputStreamReader(s.getInputStream() ) );
osw = new OutputStreamWriter(s.getOutputStream() );
System.out.println(br.readLine() ); // 读取客户端的信息
try {
osw.write("hihi"); // 写信息到客户端
osw.flush();
osw.close();
} catch (IOException ie){
ie.printStackTrace();
}
br.close();
s.close();
}
}
}
这是 客户端的代码
程序代码:
import java.io.*;
import java.net.*;
public class TSocket{
public static void main(String args[]) throws Exception{
OutputStreamWriter osw = null;
BufferedReader br = null;
Socket s = new Socket("127.0.0.1",6678);
osw = new OutputStreamWriter(s.getOutputStream() ); // 建立输出管道
br = new BufferedReader(new InputStreamReader(s.getInputStream() ) ); //建立输入管道
osw.write("hello");
osw.flush();
// 我把osw.close(); 放这 服务端可以打印出hello , 但此时 客户端就出现java.net.SocketException: socket closed 这样的异常 什么意思?
try {
System.out.println(br.readLine() );
System.out.println("测试是否接收到服务端信息" );
} catch (IOException ie){
ie.printStackTrace();
}
osw.close();
br.close();
s.close();
}
}
import java.net.*;
public class TSocket{
public static void main(String args[]) throws Exception{
OutputStreamWriter osw = null;
BufferedReader br = null;
Socket s = new Socket("127.0.0.1",6678);
osw = new OutputStreamWriter(s.getOutputStream() ); // 建立输出管道
br = new BufferedReader(new InputStreamReader(s.getInputStream() ) ); //建立输入管道
osw.write("hello");
osw.flush();
// 我把osw.close(); 放这 服务端可以打印出hello , 但此时 客户端就出现java.net.SocketException: socket closed 这样的异常 什么意思?
try {
System.out.println(br.readLine() );
System.out.println("测试是否接收到服务端信息" );
} catch (IOException ie){
ie.printStackTrace();
}
osw.close();
br.close();
s.close();
}
}
[ 本帖最后由 灵想 于 2013-9-18 10:32 编辑 ]
----------------解决方案--------------------------------------------------------
没人么
----------------解决方案--------------------------------------------------------
话说我也运行了你的代码,一时还真没看出来,就不想懂脑子了,哈哈哈
----------------解决方案--------------------------------------------------------
以下是引用java小蚂蚁在2013-9-18 22:38:31的发言:
话说我也运行了你的代码,一时还真没看出来,就不想懂脑子了,哈哈哈
话说我也运行了你的代码,一时还真没看出来,就不想懂脑子了,哈哈哈
版版 求指导 自学的苦B青年困扰好几天了
----------------解决方案--------------------------------------------------------
教你一种调试的方法,
1 在服务器端的这一句System.out.println(br.readLine());
前面加一句System.out.println("1");
2 然后在这一句osw.write("hihi");
前面加一句System.out.println("2");
同样,在客户端那里
1 在这一句osw.write("world");
前面加一句System.out.println("1");
2 在这一句osw.flush();
后面加一句System.out.println("2");
3 在这一句System.out.println(br.readLine());
前面加一句System.out.println("3")
加这些的句子的作用时,帮助你监控程序输出到哪一步了。
文章太长,下一层继续。。。
----------------解决方案--------------------------------------------------------
打了监控句子之后,我发现你客户端的 "world" 成功发送出去了,而服务器端却没有接受到,于是
程序就在服务器端的这一句 System.out.println(br.readLine()); 这里停住了,不再往下执行。
原因解释:你客户端输出的是"world" 虽然你flush了一下buffer,字符串成功发送出去了,
但是你注意,你服务器端接收的句子是这个System.out.println(br.readLine());
这个方法是从输入流中读取一行字符串,以换行符为结束标志。重点是,你发送的是"world",换行符缺失了,
于是服务器端的realLine()方法就一直在等待你的换行符。
解决方法:非常简单,在客户端的输出中那个"world" 改成 "world\n"
另外,至于你说在客户端flush()后关闭输出流能解决输出问题
原因:你关闭了输出流,那么buffer里的就是一行字符串了,"world" 就变成了"world\n",它自动帮你加上换行符了。
至于报错原因,假如你在flush()后面直接来一句close(),建议你在写close()方法前面和后面添加这个两句
System.out.println(s.isConnected());
System.out.println(s.isClosed());
相信你看到打印的结果就明白了。
[ 本帖最后由 scampRa 于 2013-9-19 23:49 编辑 ]
----------------解决方案--------------------------------------------------------
回复 6楼 scampRa
一段时间没来 看到你回复问题解决了 感谢了 ----------------解决方案--------------------------------------------------------