你好,非常感谢您能阅读本贴。程序目的:首先服务端向客户端发送一句话,客户端接收。然后客户端发送一句话,服务端接收。下面附上代码:
package com.baidu.Excerise;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;public class TestServer { /**
 * @ SocketServer的编写【服务端的编写】
 */
public static void main(String[] args) { TestServer ts = new TestServer(); ts.server(); } public void server() { try { ServerSocket serverSocket = new ServerSocket(88); while (true) { Socket s = serverSocket.accept(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s
.getOutputStream())); bw.write("欢迎光临!!!");

BufferedReader br = new BufferedReader(new InputStreamReader(s
.getInputStream()));

System.out.println(br.readLine());

bw.flush();

bw.close();

br.close();

s.close();
} } catch (IOException e) { e.printStackTrace();
} }}
==================================================================================
package com.baidu.Excerise;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;public class TestClient { /**
 * Socket的编写【客户端】
 */
public static void main(String[] args) { TestClient tc = new TestClient(); tc.client();
} public void client() { try { Socket s = new Socket("localhost", 88);

BufferedReader br = new BufferedReader(new InputStreamReader(s
.getInputStream()));

System.out.println(br.readLine());

BufferedWriter bufferedWriter =new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

bufferedWriter.write("我是李明。");

bufferedWriter.flush();

bufferedWriter.close(); br.close();

s.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace();
} }}
==========================================================================================服务端一运行就处于等待状态,客户端一运行同样,两者都处于死等状态。我以前也练习过这种例子,知识用的包装类是DataOutputStream和DataInputStream,代码类似可以实现相互通信。并且针对这个问题我也借助过搜索引擎查找我。找到的大多是比这个问题更复杂。我的理解是:服务端和客户端都运行到了接收对方信息的语句,所以死住了。曾试过用用Thread.sleep(1000)解决,但是没有效果,希望你能帮助我解决这个困扰我的问题。非常感谢。

解决方案 »

  1.   

    异步套接字        java搜一下 nio吧
      

  2.   

    服务端 把这段代码放在while循环外试试
    Socket s = serverSocket.accept(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s 
    .getOutputStream())); bw.write("欢迎光临!!!"); BufferedReader br = new BufferedReader(new InputStreamReader(s 
    .getInputStream())); 你是想做成多线程么?
      

  3.   

    代码如下:不知道是不是你要的效果服务端:package com.baidu.Excerise;import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.io.Writer;
    import java.net.ServerSocket;
    import java.net.Socket;public class TestServer { /**
     * @ SocketServer的编写【服务端的编写】
     */
    public static void main(String[] args) { TestServer ts = new TestServer(); ts.server(); } public void server() { try { ServerSocket serverSocket = new ServerSocket(4000);
    Socket s = serverSocket.accept(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

    PrintWriter pw = new PrintWriter(bw,true);


    pw.println("欢迎光临!!!"); BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
    System.out.println(br.readLine()); bw.flush(); bw.close(); br.close();
    }
    catch (IOException e) { e.printStackTrace();
    } }}
    客户端:
    package com.baidu.Excerise;import java.io.BufferedReader;
    import java.io.BufferedWriter;
    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 TestClient { /**
     * Socket的编写【客户端】
     */
    public static void main(String[] args) { TestClient tc = new TestClient(); tc.client();
    } public void client() { try { Socket s = new Socket("localhost", 4000);
    System.out.println("clientsocket = " + s);
    BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); System.out.println(br.readLine()); BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

    PrintWriter pw = new PrintWriter(bufferedWriter,true); pw.println("我是李明。"); bufferedWriter.flush(); bufferedWriter.close(); br.close(); s.close(); }
    catch (UnknownHostException e) { e.printStackTrace(); }
    catch (IOException e) { e.printStackTrace();
    } }}
      

  4.   


    非常感谢您的帮助--11楼,效果我看你的代码我知道,我曾经也写过这种测试,换个包装流PrintWriter和PrintReader这样是可以实现的,另外包装流换成DataInputStream和DataOutputStream也是可以的。那么问题就在于BufferedReader和BufferedWriter与其他流在这上面有什么关系,为什么不能处理呢?
      

  5.   

    看看这个 http://www.coderanch.com/t/276763/Streams/java/BufferedWriter-PrintWriter
      

  6.   

    初学者在Socket编程中,经常会范两个错误。一个是在使用BufferedReader的readLine方法时。发送方总是不发送回车换行符。
    导致接收方,总是读不了一行(没有末尾标识符)而陷入等待。另一个是在使用BufferedWriter的write方法后,不调用flush方法。
    造成数据一直堆积在发送方的缓冲区中,迟迟没有推给接收方,接收方陷入等待。楼主的代码没有格式,我没有看。但是,我说的两个注意事项,楼主参考一下。
    或许有帮助。
      

  7.   


    非常感谢您的帮助,代码是我从Eclipse直接拷贝的所以没有再排版,对于浏览者包括您造成的阅读不便我深感抱歉,我保证我下次提问帖代码一定注意格式。说问题吧,16楼所说的这两种可能性我再次手动尝试修改了代码,可是还没解决,希望您能帮我看看。我真的好像知道问题出在哪里?另外代码直接拷在Eclipse中用源代码菜单下的格式可以调整好格式的。希望能得到帮助。我的qq:373136249 这个帖子我会留意的。
      

  8.   

    呵呵 !感谢各楼朋友的帮助,问题我已经解决。下面分享一下:a、16楼所说的两个很重要的知识点。b、客户端和服务端要双通信:必须在代码的最前面都使用BufferedWriter,即服务端发送信息给客户端  的同时客户端也发送信息给服务端。然后两者的输入端接收信息并打印。客户端到此结束运行,服务端在while循环下继续等待另一个客户端连接。最后,还是谢谢各位朋友的热心帮助。没有你们的帮助,我是解决不了这个问题的。帖子是我早上发的,我关注了一天了,起初很是郁闷,现在问题解决,真HAAPY!还有,如果包装流使用非BufferedReader和BufferedWriter的话b里面所说的顺序就无所谓,这这缓冲流为什么非得这样并且有换行标志呢,我还不是很清楚。谢谢各位的帮忙。