解决方案 »

  1.   

    客户端读的时候需要等待一段时间才会有值的,public class Server {
    ServerSocket server = null;
    Socket client = null; public static void main(String[] args) {
    new Server().sendAndRecv();
    } public void sendAndRecv() {
    try {
    server = new ServerSocket(8003);
    while (true) {
    client = server.accept();
    System.out.println(client.getInetAddress() + "已连接......");
    OutputStream os = client.getOutputStream();
    InputStream is = client.getInputStream();
    int i = -1;
    byte[] buf = new byte[1024];
    i = is.read(buf);
    System.out.println(new String(buf, 0, i));
    System.out.println("信息已经读取完成.");
    os.write("hello world!".getBytes());
    os.flush();
    os.close();
    }
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    public class Client {
    Socket client = null; public static void main(String[] args) {
    new Client().sendAndRecv();
    } public void sendAndRecv() {
    try {
    client = new Socket("127.0.0.1", 8003);
    OutputStream os = client.getOutputStream();
    os.write("zhangsan he li si is firend".getBytes());
    os.flush();
    int i = -1;
    try {
    Thread.sleep(5000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    InputStream is = client.getInputStream();
    byte[] buf = new byte[is.available()];
    i = is.read(buf);
    System.out.println(new String(buf, 0, i));
    } catch (UnknownHostException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
      

  2.   

    看来你对Socket的通信原理还不够了解。
    先说说你这个例子,其实你这个例子单回合是没有问题的,也就是Client第一次给Server发信息,Server是可以收到的,但是第二次它就收不到了,因为阻塞了。要解决这个问题,就是要收、发分离,不管是服务端还是客户端,都有两个线程(一个负责收的Socket,一个负责发的Socket),而不是像你现在这样在一个线程里用同一个Socket来处理收发(read是会阻塞的,说白了阻塞后,程序就停在那了,不会往下执行)。
      

  3.   

    你server端的流顺序写反了。你server端和client都是先开输出流,两个人都抢着要先说话,怎么能接收呢。
    你要让client端先说话,server端先接收。那么就要在server端先开输入流,让其处于阻塞状态,先去接收client端的信息。
    InputStream is = client.getInputStream();
    OutputStream os = client.getOutputStream();
    就是把server端开流的这个顺序改成这样
      

  4.   

    楼上讲的好! 
    单纯楼主的代码,size读到的是 0。可以让等待,直到不为零。
    服务器端和客户端,在size=is.available()后,加上:
    while(size==0)
    {
    size=is.available();
    }
    一直等到有数据。