服务端:
package socket;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;public class SocketServer {
ServerSocket serverSocket = null;
Socket socket = null;

public SocketServer() {
try {
init();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void init() throws Exception {
serverSocket = new ServerSocket(9990);
}

public void run() {
try {
while(true) {
socket = serverSocket.accept();
MyServer ms = new MyServer(socket);
Thread td = new Thread(ms);
td.run();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
SocketServer ss = new SocketServer();
ss.run();
}
}package socket;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;import file.HandleFile;public class MyServer implements Runnable {
Socket socket = null;
PrintWriter pw = null;

public MyServer(Socket socket) {
this.socket = socket;
}
public void run() {
// TODO Auto-generated method stub
try {
if(socket == null) {
throw new Exception();
}

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
StringBuffer sb = new StringBuffer();
String tmp = null;
while((tmp = br.readLine()) != null) {
sb.append(tmp);
}

System.out.println(sb.toString());

pw = new PrintWriter(socket.getOutputStream());
pw.println("袁泉");
pw.flush();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
pw.close();
}
}}客户端:
package socket;import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;import file.HandleFile;public class SocketClient {
Socket socket = null;
FileOutputStream fops = null;
OutputStream out = null;
InputStream input = null;
PrintWriter pw = null;

SocketClient() {
try {
init();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

private void init() throws Exception {
socket = new Socket("127.0.0.1", 9990);
}

public void run() {
try {
pw = new PrintWriter(socket.getOutputStream());
pw.println("夏雨");
pw.flush();

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
StringBuffer sb = new StringBuffer();
String temp = null;
while((temp = br.readLine()) != null) {
sb.append(temp);
}
System.out.println(sb.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
pw.close();

}
}

public static void main(String[] args) {
// TODO Auto-generated method stub
SocketClient sc = new SocketClient();
sc.run();
}}如果是单向的,客户端发送给服务端,正常
如果是需要服务端发回一个字符流,就阻塞了,我也不知道怎么回事,求教

解决方案 »

  1.   

    把MyServer类 中
    StringBuffer sb = new StringBuffer();
    String temp = null;
    while((temp = br.readLine()) != null) {
    sb.append(temp);
    }
    System.out.println(sb.toString()); 
    变为 
    System.out.println(br.readLine())
    就可以成功~
      

  2.   

    楼主的程序中的启动线程好像都是用run()方法启动的,这样run()只是作为一个方法运行是不会启动线程的,所以可能你服务器端的发送数据线程并没有启动,也就自然不能发送数据给客服端了。
    所以楼主可以先把用run()方法启动线程改为用start()启动试一下。
      

  3.   

    你不能假设一定要先读后写,也不能假设只有一行数据,你的在循环中 readLine 就表示你总是期望一直有数据读,注意,只有很少的情况下 readLine 没读取到数据就让你的循环退出,基本是连接断开了,否则就会一直阻塞等待客户端发送数据。socket 是全双工的,你应该开两个线程来分别处理读取和写出。读入端收到消息后放入“来信”队列再经主程序处理后回复消息到“发信”队列(当然你可以直接处理后放进发信队列)。发送端不停地从发信队列中查询是否有消息发出,有的话就向 socket output stream 中写数据。关键点是,收和发应该用两个线程独立处理,或者用 Java NIO 异常 Socket 以事件的方式处理。很多时候我们从网上抄一份例子来做的时候,人家写样例的人在假设这样一个场景:
    Client -> Server ,客户端向服务器发送一个消息,
    Server -> Client ,服务端收到消息后做最简单的处理然后回复给客户端,并终止会话。
    这里只是一个回合的往来。请注意,在这个场景中,实际上相当于半双工的效果,因为从程序的角度看,每个时刻要么是客户端有事情做,要么是服务端有事情做,不会双方同时都在工作。而这种演示的场景在现实的网络应用程序中几乎没有。
    因为处理消息是不是按顺序来都是由程序的应用导来做的而不是在通信这层,在通信这层都会是工作在全双工的状态中。