问题描述:发生互相等待。烦请大虾们指教,感激不尽!服务器端程序如下:
package net;import java.net.*;
import java.io.*;public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket ss=new ServerSocket(8899);
while(true) {
Socket s=ss.accept();
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String clientStr="hello sir!";
while(clientStr!=null) {
dos.writeUTF(new BufferedReader(new InputStreamReader(System.in)).readLine());
dos.flush();
clientStr=br.readLine();
System.out.println("client: "+clientStr);
if("bye".equals(clientStr)) {
break;
}
}
br.close();
dos.close();
s.close();
}
}
}客户端程序如下:
package net;import java.net.*;
import java.io.*;public class TCPClient {
public static void main(String[] args) throws IOException{
Socket s=new Socket("localhost",8899);
DataOutputStream dos=new DataOutputStream(s.getOutputStream());
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
String serverStr=null;
while((serverStr=br.readLine())!=null) {
System.out.println("server: "+serverStr);
dos.writeUTF(new BufferedReader(new InputStreamReader(System.in)).readLine());
dos.flush();
if("bye".equals(serverStr)) {
break;
}
}
dos.close();
br.close();
}
}
编译通过运行 >java net.TCPServer
运行 >java net.TCPClient
在服务器端输入:hello
结果客户端和服务器端互相等待。仔细检查了两个程序,小弟眼拙,没有发现出现死锁的地方,请哪位帮忙看一下,谢谢了
package net;import java.net.*;
import java.io.*;public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket ss=new ServerSocket(8899);
while(true) {
Socket s=ss.accept();
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String clientStr="hello sir!";
while(clientStr!=null) {
dos.writeUTF(new BufferedReader(new InputStreamReader(System.in)).readLine());
dos.flush();
clientStr=br.readLine();
System.out.println("client: "+clientStr);
if("bye".equals(clientStr)) {
break;
}
}
br.close();
dos.close();
s.close();
}
}
}客户端程序如下:
package net;import java.net.*;
import java.io.*;public class TCPClient {
public static void main(String[] args) throws IOException{
Socket s=new Socket("localhost",8899);
DataOutputStream dos=new DataOutputStream(s.getOutputStream());
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
String serverStr=null;
while((serverStr=br.readLine())!=null) {
System.out.println("server: "+serverStr);
dos.writeUTF(new BufferedReader(new InputStreamReader(System.in)).readLine());
dos.flush();
if("bye".equals(serverStr)) {
break;
}
}
dos.close();
br.close();
}
}
编译通过运行 >java net.TCPServer
运行 >java net.TCPClient
在服务器端输入:hello
结果客户端和服务器端互相等待。仔细检查了两个程序,小弟眼拙,没有发现出现死锁的地方,请哪位帮忙看一下,谢谢了
楼主【apple_pie】截止到2008-07-07 22:29:32的历史汇总数据(不包括此帖):
发帖的总数量:1 发帖的总分数:20
结贴的总数量:1 结贴的总分数:20
无满意结贴数:0 无满意结贴分:0
未结的帖子数:0 未结的总分数:0
结贴的百分比:100.00% 结分的百分比:100.00%
无满意结贴率:0.00 % 无满意结分率:0.00 %
敬礼!
服务器端程序:
import java.io.*; public class TCPServer {
public static void main(String[] args) throws IOException {
//将套接字的创建等工作放在循环的外面。
ServerSocket ss=new ServerSocket(8899);
Socket s=ss.accept();
//这个流改成PrintWriter
PrintWriter dos = new PrintWriter(s.getOutputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String clientStr="hello sir!";
while(true) {
dos.println(new BufferedReader(new InputStreamReader(System.in)).readLine());
dos.flush();
clientStr=br.readLine();
System.out.println("client: "+clientStr);
if("bye".equals(clientStr)) {
break;
}
}
//流的关闭也放在循环的外面。
br.close();
dos.close();
s.close();
}
}
客户端程序:
package net; import java.net.*;
import java.io.*; public class TCPClient {
public static void main(String[] args) throws IOException{
Socket s=new Socket(InetAddress.getLocalHost(),8899);
//这个流改成PrintWriter
PrintWriter dos=new PrintWriter(s.getOutputStream());
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
String serverStr="Start";
//while((serverStr=br.readLine())!=null) {
while(true){
serverStr=br.readLine();
System.out.println("server: "+serverStr);
dos.println(new BufferedReader(new InputStreamReader(System.in)).readLine());
dos.flush();
if("bye".equals(serverStr)) {
break;
}
}
dos.close();
br.close();
}
}
把DataOutputStream 该成PrintWriter 就可以了。
我想问题可能出在输入和输出流一个是基于字符另一个是基于字节,不匹配的原因吧。
有没有高手能解释一下?
server使用dos.writeUTF(new BufferedReader(new InputStreamReader(System.in)).readLine())写出的流中不包含行结束符号'\r',所以client使用serverStr=br.readLine()从输入流中读时会一致等待;同样client发送消息时也是这个原因导致server在等待。
可以使用dos.writeUTF(new BufferedReader(new InputStreamReader(System.in)).readLine()+ "\r")在写出去的流中添加一个换行符,client和server就可以工作了,不过我测试了编码有点乱,输入bye并不结束。
不是没有flush的原因.缓冲区已经被刷新了.也就是说,数据已经发送给对方的.
但是,接收方,调用的readLine方法.该方法是阻塞读的.如果没有读到换行符,那就一直阻塞.
出现相互等待的状况.
楼主有兴趣,可以试着,在dos.flush();方法前边,加一个dos.write("\n");应该可以解决该问题.注意,你的那个readLine方法.读入的数据,其实是没有换行符的.呵呵.
import java.io.*;
import java.net.*;
public class Client{
public static void main(String args[]){
Client c1=new Client();
try{
c1.client();
}catch(Exception e){
System.out.println("异常");
}
}
public void client() {
Socket s=null;
DataInputStream is=null;
DataOutputStream os=null;
try{
s=new Socket("10.5.7.82",2008);
is=new DataInputStream(s.getInputStream());
os=new DataOutputStream(s.getOutputStream());
//Client c=new Client();
os.writeUTF("this is client");
//System.out.println(a);
String a=is.readUTF();
System.out.println(a);
}catch(IOException e){
System.out.println("有异常");
}finally{
try{
s.close();
is.close();
os.close();
}catch(IOException e){
System.out.println("流没有关闭");
}
}
}
}
import java.net.*;
import java.io.*;
public class Server{
public static void main(String args[]){
Sever s1=new Sever();
try{
s1.sever();
}catch(Exception e){
System.out.println("服务器异常");
}
}
public void sever() {
ServerSocket ss=null;
Socket ss1=null;
DataInputStream is=null;
DataOutputStream os=null;
try{
ss=new ServerSocket(2008);
ss1=(ss.accept());
is=new DataInputStream(ss1.getInputStream());
os=new DataOutputStream(ss1.getOutputStream());
// Sever se=new Sever();
String a=is.readUTF();
System.out.println(a);
os.writeUTF("this server ok");
// System.out.println(b);
}catch(IOException e){
System.out.println("异常");
}finally{
try{
ss.close();
ss1.close();
is.close();
os.close();
}catch(IOException e){
System.out.println("关闭异常");
}
}
}
}