看 Oracle 官方教程,同步式的 Socket 就是传统的一问一答方式,它就是你需要的。
客户端先 socketgetOutputStream()write(); 之后到 socketgetInputStream()read(byte[]) 在循环中读取直到 read 方法返回 -1 或你期望的字节数已经全部收到了就停下来,如果不尝试停下来,后面的 read 将会阻塞等待。
>
基于性能改进,一般我们需要使用 NIO 异步的 socket,只需要一个线程负责通信,每个线程都有自己的出站消息队列和入站消息队列,以线程为 key 区分开,通信线程只负责把各自的消息从出站队列中发送去并把收到的消息放入入站队列中,应用程序线程就去各自的消息队列中取消息就可以了。因为每个应用线程有各自的消息队列,我们把消息放入出站队列之后就到入站队列上用同步锁等待的方法阻塞到有消息回答时为止。
关于 NIO non-blocking 非阻塞式 socket,下面有一个 NBTimeServer 例子,它讲的是服务端。客户端与此类似,
>
NIO 通信线程样例。
public void run(){
int tip = 0;
try
{
selector = Selectoropen();
SelectionKey k = channelregister(selector, getInterestOptions());
kattach(thread); // 把当前线程绑定到附件中。
thisrunning = true;
statusChanged(StatusCONNECTED);
while (thisisRunning())
{
// select() is a blocking operation
int eventCount = selectorselect();
debug("[MCDebug] Polling TCP events " + eventCount);
if (eventCount > 0 && channelisOpen() && thisisRunning())
{
Set keys = selectorselectedKeys();
for (Iterator iter = keysiterator(); iterhasNext(); iterremove())
{
SelectionKey key = (SelectionKey) iternext();
Thread thread = (Thread) keyattachment();
if (!keyisValid())
{ // channel is closing
break;
}
process(key); // 处理读取消息并把消息放入 thread 对应的队列。//写出消息类似的,不过在 register 时需要注册写出允许的事件,
}
}
}
}
URL url = null;
>
常见的>
Accpet
告诉服务端,客户端接收什么类型的响应
Referer
表示这是请求是从哪个URL进来的,比如想在网上购物,但是不知道选择哪家电商平台,你就去问度娘,说哪家电商的东西便宜啊,然后一堆东西d出在你面前,第一给就是某宝,当你从这里进入某宝的时候,这个请求报文的Referer就是>
Cache-Control
对缓存进行控制,如一个请求希望响应的内容在客户端缓存一年,或不被缓可以通过这个报文头设置
Accept-Encoding
例如:Accept-Encoding:gzip, deflate(这两种都是压缩格式)
这个属性是用来告诉服务器能接受什么编码格式,包括字符编码,压缩形式(一般都是压缩形式)
Host
指定要请求的资源所在的主机和端口
User-Agent 作用:告诉服务器,客户端使用的 *** 作系统、浏览器版本和名称
以上就是关于Java Socket开发 关于报文传递和接收全部的内容,包括:Java Socket开发 关于报文传递和接收、怎么用java 发送http报文、javaweb里get请求头报文信息含义是什么啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)