imprt java.net.*;
import java.io.*;
public class ServerSocket {
       public static void main(String [] args) throws exception{
             ServerSocket ss = new SeverSocket(8888);
             Socket s = ss.accept();
             BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
             String str = br.readLine();
             if(str != null) {
             System.out.println(str);
        }           BufferedWriter bw = new BuffreedWriter(new OutputStreamWriter(s.getOutputSdtream()));
           bw.write("hello clinet!!!");
           bw.flush();
                     br.close();
          bw.close();
          s.colse();
             
    }
}imprt java.net.*;
import java.io.*;
public class ClientSocket {
     public static void main(String [] args) throws exception {
         Socket s = new Socket("127.0.0.1", 8888);
         BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutStream()));
         bw.write(String.valueOf(Math.random()));
         bw.flush();        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String str = br.readLine();
        if(str != null) {
          System.out.println(str);
        }      bw.close();
      br.close();
      c.close();
  }
}我一运行程序客户端和服务器端都阻塞在那里,我关闭一端会出现Connetction reset异常,我把两端的写入流也就是write()之后在后面接着就写bw.flush();bw.close()那么我就能得到先写入一端的数据,但是接着就提是socket closed异常并提示错误行号在br.readLine()这里,我始终没弄清楚这是怎么回事,忘各位高手能帮忙处理小弟这低级的问题!!!

解决方案 »

  1.   

    修改一下客户端的代码:
    bw.write(String.valueOf(Math.random()));
    bw.newLine();//添加这一行,写入一个换行符
    bw.flush();
      

  2.   

    对楼主的程序修改了一下//TestClientSocket.javaimport java.net.*;
    import java.io.*;
    public class TestClientSocket {
        public static void main(String[] args) throws Exception {
    Socket socket = null;
    try {
        socket = new Socket("127.0.0.1 ", 8888);
        DataInputStream dis = new DataInputStream(socket.getInputStream());
        DataOutputStream dos = new DataOutputStream(socket
        .getOutputStream());
        new Thread(new ReceiveRunnable(dis)).start();
        new Thread(new SendRunnable(dos)).start();
    } catch (Exception e) {
        if (socket != null)
    socket.close();
    }
        }
    }class SendRunnable implements Runnable {
        DataOutputStream dos = null;    public SendRunnable(DataOutputStream dos) {
    super();
    this.dos = dos;
        }    public void run() {
    StringBuffer string = new StringBuffer();
    ;
    try {
        while (true) {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String line = "";
    while (!(line=br.readLine()).equals("#")) {// 简单的从控制台上获取结果  // "#"意味着输入结束,开始向对方发送数据
        string.append(line);
        string.append("\n");
    }
    dos.writeUTF(string.toString());// 写出dos流
    string.delete(0, string.length());
        }
    } catch (IOException e) {
    } finally {
        try {
    if (dos != null)
        dos.close();
        } catch (IOException e) {
        }
    }
        }
    }class ReceiveRunnable implements Runnable {
        DataInputStream dis = null;    public ReceiveRunnable(DataInputStream dis) {
    super();
    this.dis = dis;
        }    public void run() {
    String string = null;
    try {
        while (true) {
    string = dis.readUTF();// 读取dis流
    System.out.println(string);// 简单的把结果显示在控制台上
        }
    } catch (IOException e) {
    } finally {
        try {
    if (dis != null)
        dis.close();
        } catch (IOException e) {
        }
    }
        }
    }//测试结果
    /*我是 客户端
    发信息 给服务器
    #
    我是 服务器 
    发信息 给客户端*/
    //TestServerSocket.java
    import java.net.*;
    import java.io.*;public class TestServerSocket {
        public static void main(String[] args) throws Exception {
    Socket socket = null;
    try {
        ServerSocket ss = new ServerSocket(8888);
        socket = ss.accept();
        DataInputStream dis = new DataInputStream(socket.getInputStream());
        DataOutputStream dos = new DataOutputStream(socket
        .getOutputStream());
        new Thread(new ReceiveRunnable(dis)).start();
        new Thread(new SendRunnable(dos)).start();
    } catch (Exception e) {
        if(socket != null)socket.close();
    }
        }
    }//测试结果
    /*我是 客户端
    发信息 给服务器我是 服务器 
    发信息 给客户端
    #
    */
      

  3.   

    LZ用readLine方法,那么如果发送数据没有换行符号,读取端就会一直堵塞。
    所以在发送数据的时候,要记得也发送换行符号。
    如果在同样的操作系统中,一般问题不大,要是在不同的操作系统,就要注意换行符的协调,比如window和linux的换行符就不一样,这时linux发送的数据,可能window读取是会一直堵塞,所以要注意。
      

  4.   

    首先LZ代码很多错误。
    我一运行程序客户端和服务器端都阻塞在那里,我关闭一端会出现Connetction   reset异常,我把两端的写入流也就是write()之后在后面接着就写bw.flush();bw.close()那么我就能得到先写入一端的数据,但是接着就提是socket   closed异常并提示错误行号在br.readLine()这里,我始终没弄清楚这是怎么回事,忘各位高手能帮忙处理小弟这低级的问题!!!readLine()方法是阻塞式的方法,通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。 但是你只是bw.write(String.valueOf(Math.random())); 没有写换回或回车。这个时候服务器短实际上是接受到客户端了,也就是服务器端运行到这里了String   str   =   br.readLine(); 但是客户端这个时候已经运行完毕,并且关闭了连接。所以就会出现Connetction   reset的异常。你bw.write(String.valueOf(Math.random())+"\n")这样写就没有错。
    这个时候你会问服务器短也是bw.write(String.valueOf(Math.random()))没有写换行和回车之类的,但是客户端为什么没错误呢。隐身服务器短write完,flush()后面有close了。所以客户端也是可以接受到服务器端传过来的信息。如果你把close注释掉,再执行肯定也会错误的。