今天写了一个程序,本想没什么问题,可是运行起来以后却发现是死锁。死锁发生的地方我已经用注释标明,希望各位大侠发表看法。Server端代码:import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;public class TcpServer {
public static void main(String[] args) {
ServerSocket server = null;
Socket socket = null;
BufferedReader reader = null;
PrintWriter writer = null; try {
// bind port 2222 and read message from client
server = new ServerSocket(2222);
socket = server.accept();
reader = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
String str = null;
while ((str = reader.readLine()) != null) { // 好像在这里readLine()没有读到值就会一直阻塞,导致客户端无法继续运行
str = reader.readLine();
System.out.println(str);
} // send message to client
writer = new PrintWriter(new OutputStreamWriter(
socket.getOutputStream()), true);
writer.println("Thanks");
writer.flush();
writer.println("bye");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null) {
writer.close();
writer = null;
}
if (reader != null) {
reader.close();
reader = null;
}
if (socket != null) {
socket.close();
socket = null;
}
if (server != null) {
server.close();
server = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Client端代码:import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;public class TcpClient {
public static void main(String[] args) {
Socket socket = null;
PrintWriter writer = null;
BufferedReader reader = null;

try {
// connect server and send message
socket = new Socket("127.0.0.1", 2222);
writer = new PrintWriter(new OutputStreamWriter(
socket.getOutputStream()), true);
writer.println("Hello");
writer.flush();
writer.println("world" + File.separatorChar);
writer.flush();

// receive message from server
String str = null;
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while((str = reader.readLine()) != null){
str = reader.readLine();
System.out.println(str);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(reader != null){
reader.close();
reader = null;
}
if (writer != null) {
writer.close();
writer = null;
}
if (socket != null) {
socket.close();
socket = null;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

解决方案 »

  1.   


    package test.io;import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;public class TcpServer {
        public static void main(String[] args) {
            ServerSocket server = null;
            Socket socket = null;
            BufferedReader reader = null;
            PrintWriter writer = null;        try {
                // bind port 2222 and read message from client
                server = new ServerSocket(2222);
                socket = server.accept();
                reader = new BufferedReader(new InputStreamReader(
                        socket.getInputStream()));
                String str = null;
                while ((str = reader.readLine()) != null) { // 好像在这里readLine()没有读到值就会一直阻塞,导致客户端无法继续运行
                    System.out.println(str);
                }            // send message to client
                writer = new PrintWriter(new OutputStreamWriter(
                        socket.getOutputStream()), true);
                writer.println("Thanks");
                writer.flush();
                writer.println("bye");
                socket.shutdownOutput();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (writer != null) {
                        writer.close();
                        writer = null;
                    }
                    if (reader != null) {
                        reader.close();
                        reader = null;
                    }
                    if (socket != null) {
                        socket.close();
                        socket = null;
                    }
                    if (server != null) {
                        server.close();
                        server = null;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    package test.io;import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.net.UnknownHostException;public class TcpClient {
        public static void main(String[] args) {
            Socket socket = null;
            PrintWriter writer = null;
            BufferedReader reader = null;
            
            try {
                // connect server and send message
                socket = new Socket("127.0.0.1", 2222);
                writer = new PrintWriter(new OutputStreamWriter(
                        socket.getOutputStream()), true);
                writer.println("Hello");
                writer.flush();
                writer.println("world");
                writer.flush();
                socket.shutdownOutput();
                
                // receive message from server
                String str = null;
                reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                while((str = reader.readLine()) != null){
                    System.out.println(str);
                }
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if(reader != null){
                        reader.close();
                        reader = null;
                    }
                    if (writer != null) {
                        writer.close();
                        writer = null;
                    }
                    if (socket != null) {
                        socket.close();
                        socket = null;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
      

  2.   


                while((str = reader.readLine()) != null){
                    //str = reader.readLine();
                    System.out.println(str);
                }