package cn.sxt.Server; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; import cn.sxt.client.CloseUtil; /** * 手写服务器服务器 * @author Administrator * */ public class TextServer3 { public static void main(String[] args) { System.out.println("——————————————————————————服务器已经开启————————————————————————"); String CRLF = "\r\n";//换行 String BLANK = " ";//空格 // 1\创建ServerSocket ServerSocket socket = null; // 2、监听客户端 Socket client = null; // 3、数据输入流 InputStream is = null; // 4、数据输出流 BufferedWriter bw = null; try { socket = new ServerSocket(9999); client = socket.accept(); is = client.getInputStream(); String str = null; byte[] buf = new byte[10240]; int len = is.read(buf); System.out.println(new String(buf, 0, len)); /**对Web浏览器的请求作出相应 */ /** * http相应格式 * 1、http协议版本、状态代码、描述 * 2、响应头(Response Head) * 3、响应正文(Response Content) */ StringBuilder sb = new StringBuilder(); StringBuilder sbContent = new StringBuilder(); sbContent.append("<http><head><title>响应结果</title></head>"); sbContent.append("<body><t1>登录成功</t1></body></html>"); //(1)拼接 协议版本 状态代码Status Code 描述 sb.append("HTTP/1.1").append(BLANK).append(200).append(BLANK).append("OK"); //(2)响应头 sb.append(CRLF);//换行 sb.append("Content-Type: text/html;charset=utf-8"); sb.append(CRLF);//换行 sb.append("content-length:").append(sbContent.toString().getBytes().length).append(CRLF); sb.append(CRLF);//换行,代表响应头与正文部分之间的换行 sb.append(sbContent); // 通过流输出 bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream(),"UTF-8")); bw.write(sb.toString()); bw.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ // 5、关闭 CloseUtil.closeAll(is, bw, client, socket); } } }
按照课程里面的代码敲,显示结果是没有问题的。但是我修改了里面的一部分代码(如下所示):然后出现了问题。
服务器没有将全部代码返回:这是为什么?
老师,像这种情况在自定义比较长度的规则后为什么打印没有把world打印出来呢?而且这种情况会导致连key和value都不对应了
Comparator compareLen = new CompareLength(); TreeMap<String, Integer> treeMap = new TreeMap<String, Integer>(compareLen); treeMap.put("hello", 123); treeMap.put("world", 456); treeMap.put("java", 789); treeMap.put("world", 2345); System.out.println(treeMap);
这个视频编写的响应头中的内容没有出现在运行结果中,那写了有什么用。而且老师在上一节视频12分40秒中也说了不建议使用字节输入,那还有什么方法用代码编写HTTP协议
老师我这哪里转错了
这是什么情况
老师,我这里有个小问题,不是说声明整型变量的时候需要初始化吗,在内部类Itr中cursor变量并没有初始化然后就直接赋给了i,为什么这样是允许的?
老师好,跟前面这位同学的问题差不多,代码基本和老师的一致:
唯一的区别就是把MyChannel 中的方法没有传参,直接在send()方法内部调用receive()方法
Channel类代码如下:
package com.sxt.chat; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.util.List; public class MyChannel implements Runnable{ private DataInputStream dis; private DataOutputStream dos; private boolean flag; public MyChannel() { this.flag = true; } public MyChannel(Socket socket) { this(); try { dis = new DataInputStream(socket.getInputStream()); dos = new DataOutputStream(socket.getOutputStream()); } catch (IOException e) { this.flag = false; e.printStackTrace(); CloseUtil.closeAll(dos,dis); } } public String receive() { String str = null; try { str = dis.readUTF(); } catch (IOException e) { this.flag = false; e.printStackTrace(); CloseUtil.closeAll(dis,dos); Server.list.remove(this); } return str; } public void send() { String str = receive(); try { if(str != null && str.length() != 0) { dos.writeUTF(str); } } catch (IOException e) { this.flag = false; e.printStackTrace(); CloseUtil.closeAll(dos,dis); Server.list.remove(this); } } public void sendOthers() { // String str = this.receive(); List<MyChannel> others = Server.list; for (MyChannel myChannel : others) { if (myChannel != this) { myChannel.send(); } } } @Override public void run() { while(flag) { sendOthers(); } } }
运行时报错:
如果把send改成传参 不在send内部调用receive方法,就能正常运行,
老师能帮看看是什么原因吗? 这个问题困扰我几天了
源码:
错误版:
ChatProject2_errro.zip
正常版:
ChatProject2.zip
两个版本就只有Channel类几行代码不同
老师,在实操作业当中eclipse如何为java项目生成API文档、javaDoc那个链接中,我按照教程步骤,最后还是出现了以下错误,这是请问这是什么情况啊?
以下便是我的步骤:
我的JDK版本是1.8的
如果中转站读取的 > bufferInputStream的8192。效率还是会比fileInputStream高吗
老师,我不明白为什么类名后面要加<E>,什么意思?
问个问题
用一种解析法就能解析XML文档,为什么会学四种,难道说工作中有不同的情况需要用到不同的解析法?还是说这四种解析法可以互补其他解析器中的缺点?
老师,为什么单线程启动服务器创建Servlet对象的时候不会报空指针异常而加了多线程之后才有/favicon.con的url出现呢
老师,从实现方式上看doGet和doPost方法好像没有区别,登录的验证方法分别写在这两个里面有什么不一样吗,如果一样,那为什么要声明两个抽象方法不直接声明一个就好了呢
用Schema验证之后,为什么XML文档还有这个警告的叹号!
还是说只要DTD验证才能会没有这个叹号~
老师,这里我没有加上utf-8字符编码反而能成功输出,加了反而乱码是什么情况呢
// 通过流输出到客户端 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); bw.write(sb.toString()); bw.flush(); bw.close();
// 通过流输出到客户端 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream(),"utf-8")); bw.write(sb.toString()); bw.flush(); bw.close();
非常抱歉给您带来不好的体验!为了更深入的了解您的学习情况以及遇到的问题,您可以直接拨打投诉热线:
我们将在第一时间处理好您的问题!
关于
课程分类
百战程序员微信公众号
百战程序员微信小程序
©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园网站维护:百战汇智(北京)科技有限公司 京公网安备 11011402011233号 京ICP备18060230号-3 营业执照 经营许可证:京B2-20212637