java Socket能写浏览器吗,我想用Socket写一个浏览器
一:假如100个线程发送100个socket请求,同样socketServer也是来一个请求就开启一个线程,然后根据发送的数据包解析出这次请求是需要哪个资源,然后把这个资源同样以socketClient的方式发送给原socket,可是问题来了,就是原先100个线程请求的资源,它们怎么知道哪个请求对应哪个返回的资源,这一点我很纠结,老想不明白
二:就是并发http请求,并且每次请求的资源不一致,浏览器又是怎么区分每次的http请求对应哪次的返回资源呢?这个我也很没明白,还是一次http请求和返回是一一对应的,是一个完整的过程,如果是这样,又怎么解释java的socket呢,大家都知道socket是负责不断的发送,但不负责这次发送的请求返回是什么,很纠结啊,大家帮帮我吧 展开
第一个问题:
当serversocket.accept()成功返回时(设为sSocket),就已经和客户端发起该连接请求的
socket线程之间建立起了tcp实体连接,这个链接当中包涵了该请求线程使用的端口号和ip地址,当sSocket通过输出流回送数据时,数据包里包涵了接收端的ip地址和客户端线程对应的端口号,当在该端口号上监听的socket监听到数据后,对数据进行加工处理(如浏览器显示)。
第二个问题:
单个浏览器窗口或者选项卡对应一个进程,每个进程发起tcp或者http请求时,将绑定到一个指定端口(如12340,23450等等),并在自己绑定的
端口上设置监听,当数据到来时是路由器将数据发送到指定内网ip地址,到达客户机之后根据数据包的端口信息,将数据发送到对应的端口,此时哪个进程的监听
端口听到了数据,就是哪个浏览器窗口或者选项卡显示。其他的窗口不监听该端口的,没有任何动作。
浏览器不管每次返回的资源是哪次的请求,发起请求的浏览器进程自动监听建立tcp连接时使用端口号,回送的数据包里包涵了端口号,所以操作系统知道该将数据发送到哪个端口。
就是说端口号是和内存中的应用程序绑定的。
这么说吧,所有的TCP/http请求都是在客户机绑定到某个端口后建立起来的,也就是说客户端的程序(如浏览器或者一般的java程序)在向服务器发送请求成功后就在客户机的那个端口设立了监听,比如浏览器发送请求时使用3333号端口,那么浏览器就在3333号端口等待数据的返回,接受完数据后,就绘制出来给用户使用。又比如一般java程序发送的socket请求使用了4444号端口,那么客户端socket就在4444号端口等数据,数据到来并接收完后就进行数据处理,如xml可以用在监听到数据流后构建一颗xml,dom树然后进行解析或者存入文件。
假如100线程都在同一个进程内,那么每个线程和server建立socket连接时都会使用一个自己独占的端口号,然后就等待数据返回到自己绑定的端口,100线程就会有100个端口号,操作系统接收到网络数据后将数据解包,找出是发向哪个端口的数据,然后转发过去,这时候肯定有个线程收到了数据,收到后想干嘛就是这个线程自己的事,跟其他线程无关啊
问题1:单独的线程,io流对象不也是分开的吗? 那就说明是100个不同的流,如果按你这么设计的话
问题2:按照我们现在的服务器端来说,没个客户端在请求服务器的时候 都会产生一个唯一的sessionId,以区别不同的客户端。
另外:用java来开发不现实。效率就不说,同时也不能在每台机子都装jre吧?