用Socket写的Http服务器只能从客户端读取一次数据

gu_yy 2019-05-11 03:38:11
用socket写的http服务器只能从客户端读取一次数据,后面就不能读取了,但是服务器和客户端之间还是有tcp连接,并且可以向客户端返回数据
服务器端的代码:
public class Server {
private static final Integer port=7777;
public static void main(String[] args) {
ServerSocket Serversocket;
try {
System.out.println("Server start...");
Serversocket=new ServerSocket(port);//创建Socket,监听客户端请求
//服务器一直处于监听状态
while (true){
Socket socket=Serversocket.accept();//服务器一直处于监听状态,并且在此处等待,当有客户端的消息到达时,才继续向下执行
System.out.println("build a new tcp link with the client,the addressis: "+socket.getInetAddress()+":"+socket.getPort());
//并发处理客户端HTTP请求
service(socket);
}
} catch (IOException e) {
e.printStackTrace();
}
}

public static void service(Socket socket){
new Thread(new Runnable() {
@Override
public void run() {
InputStream inSocket;
try {
inSocket=socket.getInputStream();//获取HTTP请求头
int size=inSocket.available();
byte[] buffer=new byte[size];
inSocket.read(buffer);
String request=new String(buffer);
//System.out.println("----------------------------------------------------------\nClientBrowser:\n"+request+"\n----------------------------------------------------------------");

String contentType="application/json";
if(request.length()>0){
System.out.println(request);
}

//将响应发送给客户端
//System.out.println(flag);
String responseFirstLine="HTTP/1.1 200 OK\r\n";
String responseHead="Content-Type:"+contentType+"\r\n";
OutputStream outSocket=socket.getOutputStream();
//System.out.println("----------------------------------------------------------\nServerResponse:\n"+request+"\n----------------------------------------------------------------");
outSocket.write(responseFirstLine.getBytes());
outSocket.write(responseHead.getBytes());
outSocket.write("\r\n".getBytes());
//响应报文头部结束,接下来写入内容

outSocket.write("{\"name\":\"gyy\",".getBytes());
outSocket.write("\"words:\":\"i love you\"}".getBytes());
outSocket.flush();
//inSocket.close();
outSocket.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
...全文
101 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
begar 2019-09-16
  • 打赏
  • 举报
回复
read判断一下返回值把
gu_yy 2019-05-11
  • 打赏
  • 举报
回复
我单步进去看的时候,又能够读取到消息,但是直接运行就不可以,大佬们,我该怎么做啊
1、本课程是一个干货课程,主要讲解如何封装服务器底层,使用Tcp/ip长连接,IDE使用vs2019 c++开发以及使用c++11的一些标准,跨平台windows和linux,服务器性能高效,单服务器压力测试上万无压力,服务器框架是经历过上线产品的验证,框架简单明了,不熟悉底层封装的人,半个小时就能完全掌握服务器框架上手业务逻辑。2、本课程是一个底层服务器框架教程,主要是教会学员在windows或linux下如何封装一个高效的,避免踩坑的商业级框架,服务器底层使用初始化即开辟内存的技术,使用内存池,服务器运行期间内存不会溢出,非常稳定,同时服务器使用自定义哈希hashContainer,在处理新的连接,新的数据,新的封包,以及解包,发包,粘包的过程,哈希容器性能非常高效,增、删、查、改永远不会随着连接人数的上升而降低性能,增、删、查、改的复杂度永远都是恒定的O(1)。3、服务器底层封装没有使用任何第三方网络库以及任何第三方插件,自由度非常的高,出了任何BUG,你都有办法去修改,查找问题也非常方便,在windows下使用iocp,linux下使用epoll.4、讲解c++纯客户端,主要用于服务器之间通信,也就是说你想搭建多层结构的服务器服务器服务器之间使用socket通信。还可以使用c++客户端做压力测试,开辟多线程连接服务器,教程提供了压力测试,学员可以自己做压力测试服务器性能。5、赠送ue4和unity3d通信底层框架以及多人交互demo,登录,注册,玩家离开,同步主要是教会学员服务器客户端如何交互。6、赠送c++连接mysql数据库框架demo,登录,注册,玩家离开数据持久化.7、服务器教程使用自定义通信协议,同时也支持protobuf,选择权在开发者自己手里,想用什么协议都可以,自由度高。8、服务器教程使用手动敲代码逐句讲解的方式开展教学课程。非喜勿喷,谢谢大家。9、服务器教程提供源码,大家可以在平台提供的地址下载或者联系我,服务器使用c++11部分标准,std::thread,条件变量,线程锁,智能指针等,需要学员具备一定c++知识,购买前请慎重考虑。

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧