httpclient模拟浏览器调用serversocket的代码:
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("http://127.0.0.1:9999");

httpGet.addHeader("Accept","text/html, application/xhtml+xml, */*");
httpGet.addHeader("Accept-Language","zh-CN,en-US;q=0.5");
httpGet.addHeader("User-Agent","Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)");
httpGet.addHeader("Accept-Encoding","gzip, deflate");
httpGet.addHeader("Host","localhost:9999");
httpGet.addHeader("Connection","Keep-Alive");

HttpResponse httpResponse = httpClient.execute(httpGet);
InputStream inputStream = httpResponse.getEntity().getContent();
System.err.println("从服务器端获取的内容为:" + EntityUtils.toString(httpResponse.getEntity()));serverSocket模拟服务器端: public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(9999);
System.err.println("服务器已启动...............");
while (true) {
Socket socket = serverSocket.accept();
if (socket != null) {
System.err.println("客户端已连接IP地址为:" + socket.getInetAddress());
//封装输出流
OutputStream outputStream = socket.getOutputStream();

BufferedWriter  bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));

//封装输入流
BufferedReader fBufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File("d:\\a.txt"))));
String fileContent = fBufferedReader.readLine();

bufferedWriter.write(fileContent);
bufferedWriter.flush();
}
socket.close();

}
}
server端将读取d:\a.txt文件的内容写到返回留中现在的问题是:server端启动后,执行客户端调用代码,serverSocket.accept()方法成立,得到socket.但是将读取的文件内容写到socket的输出流后,client端没有任何反应,一直是在等待。socket端又再次的进行下一个socket连接进来的等待。关于文件的读取通过debug发现是没有任何问题的,也可以正常的写入到输出流。 有用过的哥们 麻烦帮解决一下

解决方案 »

  1.   

    socket 这边,先把HttpClient所发送过来的数据读完,再开始对bufferedWriter输出。
      

  2.   

    我为了简单的测试,a.txt文档中就一行字母,readline方法应该是可以一次性读完的,并不是用的字节
    还是不好使呀
      

  3.   


    读取client端穿过来的数据是拿到inputstream, 跟Outputsteam没有关系吧。 能把相关代码大体写一下吗?
      

  4.   

    其实是考虑下HttpClient这边,它需要先把请求信息完整发给SocketServer,然后才开始读取服务端返回;这个时候如果服务端一直没读取任何信息导致写缓冲区满了的话,写也会被阻塞的。
    正常流程也确实应该是这样,服务器都没看清楚浏览器请求的是啥,怎么开始处理。所以建议你尝试先把SocketServer这边的input流内容读取完毕,然后再开始输出。
      

  5.   


    在ServerSocket端加入以下代码:
    InputStream inputStream = socket.getInputStream();

    int tempdate;
    while((tempdate = inputStream.read())!= -1) {
    System.err.println(tempdate);
    }你是说这个意思吗?
      

  6.   


    读数据应该是从Socket的输入流中读吧,而写是将要返回客户端的数据写到输出流,所以应该不存在堵塞的问题吧? 不知道我理解的对不对!
      

  7.   


    是这个意思,但一次读取一个字符效率低了点
    阻塞指的是线程被阻塞。客户端的线程,先往管子里面灌水(Write to Stream),灌满了就只能wait这个管子的水被服务端取走一部分,才能接着灌。灌完了水,下一步才是开始从另一根管子里read。虽然是两根管子,但执行的线程只有一条线程啊。当然,如果管子很大(缓冲区很大),客户端把所有数据灌入管子也没满,那么就不需要wait服务端取走了。
      

  8.   


    最终的读取修改为:
    InputStream inputStream = socket.getInputStream();
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
    String readContent;
    while((readContent = bufferedReader.readLine()) != null) {
    System.err.println(readContent);
    }
    但是通过实验发现依然没有反应,所以我怀疑直接往输出流中写行不行。
      

  9.   

    while((readContent = bufferedReader.readLine()) != null) 这里有个问题,HttpClient不会关闭它的OutputStream,所以这里永远不会读到结束,而是会被阻塞。判断内容结束的标志是,读取到空行。if (readContent.length() == 0) break;
      

  10.   

    我测试过,没啥问题:
    public class SelfServer {    /**
         * @param args
         */
        public static void main(String[] args) throws Exception {
            Thread server = new Thread(new ServerSide());
            server.start();        HttpClient httpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet("http://127.0.0.1:9999");        httpGet.addHeader("Accept", "text/html, application/xhtml+xml, */*");
            httpGet.addHeader("Accept-Language", "zh-CN,en-US;q=0.5");
            httpGet.addHeader("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)");
            httpGet.addHeader("Accept-Encoding", "gzip, deflate");
            httpGet.addHeader("Host", "localhost:9999");
            httpGet.addHeader("Connection", "Keep-Alive");        HttpResponse httpResponse = httpClient.execute(httpGet);
            System.out.println("从服务器端获取的内容为:" + EntityUtils.toString(httpResponse.getEntity()));
        }    private static class ServerSide implements Runnable {
            public void run() {
                try {
                    ServerSocket serverSocket = new ServerSocket(9999);
                    System.out.println("服务器已启动...............");
                    while (true) {
                        Socket socket = serverSocket.accept();
                        System.out.println("客户端已连接IP地址为:" + socket.getInetAddress());                    InputStream inputStream = socket.getInputStream();
                        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                        String readContent;
                        while ((readContent = bufferedReader.readLine()) != null) {
                            System.out.println("ReadFromClient: " + readContent);
                            if (readContent.length() == 0)
                                break;
                        }                    //封装输出流
                        OutputStream outputStream = socket.getOutputStream();                    BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));                    //封装输入流
                        System.out.println("读取完毕,准备输出返回信息.");
                        bufferedWriter.write("HTTP/1.1 200 OK\n");
                        bufferedWriter.write("Content-Length: 10\n");
                        bufferedWriter.write("Content-Type: text/html;charset=utf8\n");
                        bufferedWriter.write("\n"); // 区分HEAD区和正文区
                        bufferedWriter.write("1234567890");
                        System.out.println("返回信息输出完毕.");
                        bufferedWriter.flush();
                        socket.close();
                        System.out.println("客户端连接已释放.");
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                }        }
        }
    }
      

  11.   

    确实好用了
    我没有把数据返回的时候协议头的那些拼接给返回回去,只是写到输出流了,应该是这个原因谢谢哥们,40分全部给你 呵呵
    还有个问题要请教:
    我现在是拿Serversokcet来模仿的服务器端,比如我写个servlet的话,也是可以调用的到。但是通过httpClient的官方文档发现有很多的设置参数的方法,而这些参数我在ServerSocket或者servlet中应该怎么接收与返回,有没有相关的资料,你在学习的时候是怎么学的,给我个链接就行。
    不可能每次返回数据都要拼那个http协议头之类的吧。谢谢
      

  12.   

    呃还真没有啥资料。基本上基于自己对HTTP协议的理解,然后再判断这个能力是否应该有,接着Google看有无样例。如果最后找不到,就自己写个包装类来实现。
      

  13.   

    呵呵 如果是这样 那真的是太遗憾了。需要对HTTP协议多谢了解 呵呵 。谢谢你哥们 给分 呵呵
      

  14.   

    楼主:我是初学者,应届生。对于httpGet.addHeader("Accept","text/html, application/xhtml+xml, */*");
    httpGet.addHeader("Accept-Language","zh-CN,en-US;q=0.5");
    httpGet.addHeader("User-Agent","Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)");
    httpGet.addHeader("Accept-Encoding","gzip, deflate");
    httpGet.addHeader("Host","localhost:9999");
    httpGet.addHeader("Connection","Keep-Alive");这些括号中的参数我不懂,求指导。还有我写的例子参照你的这个写,为什么错误日志上报这些A fatal error has been detected by the Java Runtime Environment:
    #
    #  Internal Error (classFileParser.cpp:3161), pid=5284, tid=5996
    #  Error: ShouldNotReachHere()
    #
    # JRE version: 6.0_22-b04
    # Java VM: Java HotSpot(TM) Client VM (17.1-b03 mixed mode windows-x86 )
    # If you would like to submit a bug report, please visit:
    #   http://java.sun.com/webapps/bugreport/crash.jsp
      

  15.   

    http://longdechuanren.iteye.com/admin/blogs/1471998