服务器主程序
package com.cfpl.q;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;public class ServerMain {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(5000);
while (true) {
Socket socket = serverSocket.accept();
ServerReadThread sr = new ServerReadThread(socket);
ServerWriterThread sw = new ServerWriterThread(socket);
sr.start();
sw.start();
}
}
}服务器输入的线程
package com.cfpl.q;import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;public class ServerReadThread extends Thread {
private Socket socket; public ServerReadThread(Socket socket) {
this.socket = socket;
} @Override
public void run() {
try {
InputStream is = socket.getInputStream();

while (true) {
byte[] bt = new byte[1024];
 int length = is.read(bt);
System.out.println(new String(bt,0,length));

// BufferedReader br = new BufferedReader(new InputStreamReader(is));
// String s = br.readLine();
// System.out.println(s);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}服务器输出的线程
package com.cfpl.q;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;public class ServerWriterThread extends Thread {
private Socket socket; public ServerWriterThread(Socket socket) {
this.socket = socket;
} @Override
public void run() {
try {
OutputStream os = socket.getOutputStream();
while (true) {
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
String s = br.readLine();
os.write(s.getBytes());
} } catch (IOException e) {
e.printStackTrace();
}
}
}
客户端主程序
package com.cfpl.q;import java.net.Socket;public class ClientMain {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("127.0.0.1",5000);
ClientReadThread cr = new ClientReadThread(socket);
ClientWriterThread cw = new ClientWriterThread(socket);
cr.start();
cw.start();
}
}客户端输入线程
package com.cfpl.q;import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;public class ClientReadThread extends Thread {
private Socket socket; public ClientReadThread(Socket socket) {
this.socket = socket;
} @Override
public void run() {
try {
InputStream is = socket.getInputStream(); while (true) {
 byte[] bt = new byte[1024];
 int length = is.read(bt);
 System.out.println(new String(bt,0,length));// BufferedReader br = new BufferedReader(
// new InputStreamReader(is));
// String s = br.readLine();
// System.out.println(s);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}客户端输出
package com.cfpl.q;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;public class ClientWriterThread extends Thread{
private Socket socket; public ClientWriterThread(Socket socket) {
this.socket = socket;
} @Override
public void run() {
try {
OutputStream os = socket.getOutputStream();
while (true) {
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
String s = br.readLine();
os.write(s.getBytes());
} } catch (IOException e) {
e.printStackTrace();
}
}
}
如上所示,问题出在输入线程里面,我如果用
                                 byte[] bt = new byte[1024];
                                 int length = is.read(bt);
 System.out.println(new String(bt,0,length));
就没问题,但是如果改成
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String s = br.readLine();
System.out.println(s);
就没法实现功能,请问这是为什么呢?

解决方案 »

  1.   

    不应该是因为这个,仔细想了一下,应该是BufferedReader的readLine方法会去检查换行符,而楼主的客户端发送消息的时候并没有发送换行符: @Override
        public void run() {
            try {
                OutputStream os = socket.getOutputStream();
                while (true) {
                    BufferedReader br = new BufferedReader(new InputStreamReader(
                            System.in));
                    String s = br.readLine();
                    //在这里加上换行符应该就可以了
                    s += "\r\n";
                    os.write(s.getBytes());
                }        } catch (IOException e) {
                e.printStackTrace();
            }
        }
      

  2.   

    BufferedReader的readLine()方法是阻塞的,lz你这个应该是哪个视频上的列子吧 你肯定没好好听里面有提到 过的
      

  3.   

    readLine会找换行符的,如果没有的话会阻塞!
      

  4.   

    我建议楼主:
    既然是字符的传输,那么输出时改用与BufferedReader相对应的BufferedWriter就可以了。代码供参考:import java.io.BufferedReader;
    import java.io.BufferedWriter; //引入相应的包。
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter; //引入相应的包。
    import java.io.OutputStream;
    import java.net.Socket;public class ServerWriterThread extends Thread {
        private Socket socket;    public ServerWriterThread(Socket socket) {
            this.socket = socket;
        }    @Override
        public void run() {
            try {
    BufferedWriter bw=new BufferedWriter(new OutputStreamWriter( //输入流包装成字符缓冲流.
    socket.getOutputStream()));
                //OutputStream os = socket.getOutputStream();
                while (true) {
                    BufferedReader br = new BufferedReader(new InputStreamReader(
                            System.in));
                    String s = br.readLine();
                    //os.write(s.getBytes());
    bw.write(s+"\r\n"); //写出一行.
    bw.flush();
                }        } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
      

  5.   

    谢谢,根据这样改之后确实不出错了,但是如果是换行符的问题的话,那为什么下面这个可以输出呢,这个好像也没有换行符吧
    public static void main(String[] args) throws Exception {
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    os.write("Hello".getBytes()); byte[] bt = os.toByteArray();
    InputStream is = new ByteArrayInputStream(bt);
    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    System.out.println(br.readLine());
    }
      

  6.   


    readLine当然还会判断是否到流结束符了。