2017.11.28日
服务端:
Socket socket = serverSocket.accept();
新建立的socket的端口是不会变的。
客户端:
Socket socket = new Socket("hostname",port);
会为socket随机分配一个端口。
socket连接会随着socket这个变量的回收而断开。
如果断开的时候有函数被阻塞,这个函数会报connection reset错误,如socket.getInputStream().read()函数。
如果没有函数被阻塞,那么连接断开的时候不会报错。
强制关闭程序也是一样,会导致同样的错误。
ServerSocket serverSocket = new ServerSocket(12345);
这句话执行完的时候,tcp监听就已经开始了,客户端此时就可以与之建立连接。并且可以向server发送消息,接收消息。
serverSocket.accept();是对socket连接进行处理的。
验证方法是在上面两个函数之间sleep20秒来验证的。
目前的理解是socket内部,或者操作系统底层对此有处理。日后再进行深入学习与理解。
------2018.1.2补充
后面深入学习了tcpip后,一看当初的问题,发现真的是很简单明白,以后要继续好好学习呀,不错的是当初的猜测还是挺正确的。
解释:
操作系统的tcp实现会自动完成TCP三次握手,也就是说操作系统确实会帮应用程序完成tcp连接的建立,连接建立完成之后等待应该程序用.accept方法获取连接,操作系统能够自动建立连接的个数由backlog这个变量指定。
java serverSocket随机选择端口
serverSocket.bind(null);
http是建立在tcp之上的协议,如果我们在程序中接收了一个http请求,但是由于各种错误而未主动关闭此http连接(无论是否有返回信息),都将导致http请求的客户端(浏览器或者程序)被长时间阻塞(具体多久不定,最少是分钟级,测试了一下,10分钟左右之后浏览器还在继续等待)。无论是关闭输出流还是调用socket.close,都可以关闭连接。
http:
以行为单位进行区分:
第一行为资源信息:包括http方法,路径和query,http版本信息
后面每一行表示一个头部信息。
空行表示头部信息的结束
接下来用一行信息表示body(是否只能有一行还需要再确认)
http如果发的一方以行的方式,而接收一方又以普通字节流的方式接收的话会导致接收到很多换行符。
发送方发送一行内容,接收方调用read()函数会读取三次,内容+"\r"+"\n"