socket如何通过代理服务器通讯,在线等

socket如何通过代理服务器通讯,在线等,第1张

1客户端连接到代理服务器开放的端口;
2客户端向代理服务器发送验证申请;
3代理服务器向客户端发送一个数据包,从而客户端得知自己的通信申请是否被批准;
4客户端向代理服务器发送一个数据包,告知代理服务器自己要连接的目的主机的地址和端口;
5代理服务器开始进行到目的主机的真正连接;
6代理服务器为客户端开放一个新的端口并向客户端发送一个数据包告知客户端这个新的端口;
7客户端创建一个新的套接字并连接到代理服务器的新的端口;
8然后,代理服务器把由新端口接收到的数据都转发给目的主机,把从目的主机发过来的数据都由新端口转发给客户端。

什么是socket?
你经常听到人们谈论着“socket”,或许你还不知道它的确切含义。现在让我告诉你:它是使用标准Unix文件描述符(filedescriptor)和其它程序通讯的方式。什么?你也许听到一些Unix高手(hacker)这样说过:“呀,Unix中的一切就是文件!”那个家伙也许正在说到一个事实:Unix程序在执行任何形式的I/O的时候,程序是在读或者写一个文件描述符。一个文件描述符只是一个和打开的文件相关联的整数。但是(注意后面的话),这个文件可能是一个网络连接,FIFO,管道,终端,磁盘上的文件或者什么其它的东西。Unix中所有的东西就是文件!所以,你想和Internet上别的程序通讯的时候,你将要使用到文件描述符。你必须理解刚才的话。现在你脑海中或许冒出这样的念头:“那么我从哪里得到网络通讯的文件描述符呢?”,这个问题无论如何我都要回答:你利用系统调用socket(),它返回套接字描述符(socketdescriptor),然后你再通过它来进行send()和recv()调用。“但是”,你可能有很大的疑惑,“如果它是个文件描述符,那么为什么不用一般调用read()和write()来进行套接字通讯?”简单的答案是:“你可以使用!”。详细的答案是:“你可以,但是使用send()和recv()让你更好的控制数据传输。”存在这样一个情况:在我们的世界上,有很多种套接字。有DARPAInternet地址(Internet套接字),本地节点的路径名(Unix套接字),CCITTX25地址(你可以将X25套接字完全忽略)。

所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。\x0d\以J2SDK-13为例,Socket和ServerSocket类库位于javanet包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例, *** 作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。\x0d\重要的Socket API:\x0d\javanetSocket继承于javalangObject,有八个构造器,其方法并不多,下面介绍使用最频繁的三个方法,其它方法大家可以见JDK-13文档。\x0d\ Accept方法用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。\x0d\ getInputStream方法获得网络连接输入,同时返回一个InputStream对象实例。\x0d\ getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。\x0d\注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。\x0d\2ServerSocket类例子编辑\x0d\\x0d\package comlanbersocket;\x0d\import javaioDataInputStream;\x0d\import javaioDataOutputStream;\x0d\import javaioIOException;\x0d\import javanetServerSocket;\x0d\import javanetSocket;\x0d\public class ServerDemo {\x0d\/\x0d\ 注意:Socket的发送与接收是需要同步进行的,即客户端发送一条信息,服务器必需先接收这条信息,\x0d\ 而后才可以向客户端发送信息,否则将会有运行时出错。\x0d\ @param args\x0d\/\x0d\public static void main(String[] args) {\x0d\ServerSocket ss = null;\x0d\try {\x0d\ss = new ServerSocket(8888);\x0d\//服务器接收到客户端的数据后,创建与此客户端对话的Socket\x0d\Socket socket = ssaccept();\x0d\//用于向客户端发送数据的输出流\x0d\DataOutputStream dos = new DataOutputStream(socketgetOutputStream());\x0d\//用于接收客户端发来的数据的输入流\x0d\DataInputStream dis = new DataInputStream(socketgetInputStream());\x0d\Systemoutprintln("服务器接收到客户端的连接请求:" + disreadUTF());\x0d\//服务器向客户端发送连接成功确认信息\x0d\doswriteUTF("接受连接请求,连接成功!");\x0d\//不需要继续使用此连接时,关闭连接\x0d\socketclose();\x0d\ssclose();\x0d\} catch (IOException e) {\x0d\eprintStackTrace();\x0d\}\x0d\}\x0d\}\x0d\\x0d\3客户端的例子编辑\x0d\package comlanbersocket;\x0d\importjavaioDataInputStream;\x0d\import javaioDataOutputStream;\x0d\importjavaioIOException;\x0d\import javaioOutputStream;\x0d\import javanetSocket;\x0d\import javanetUnknownHostException;\x0d\public class ClientDemo {\x0d\/\x0d\ @param args\x0d\/\x0d\public static void main(String[] args) {\x0d\Socket socket = null;\x0d\try {\x0d\socket = new Socket("localhost",8888);\x0d\//获取输出流,用于客户端向服务器端发送数据\x0d\DataOutputStream dos = new DataOutputStream(socketgetOutputStream());\x0d\//获取输入流,用于接收服务器端发送来的数据\x0d\DataInputStream dis = new DataInputStream(socketgetInputStream());\x0d\//客户端向服务器端发送数据\x0d\doswriteUTF("我是客户端,请求连接!");\x0d\//打印出从服务器端接收到的数据\x0d\Systemoutprintln(disreadUTF());\x0d\//不需要继续使用此连接时,记得关闭哦\x0d\socketclose();\x0d\} catch (UnknownHostException e) {\x0d\eprintStackTrace();\x0d\} catch (IOException e) {\x0d\eprintStackTrace();\x0d\}\x0d\}\x0d\}

题主是否想询问“socket中服务器不进行tcp应答是什么原因”?tcp消息与socket连接断开。根据查询相关公开信息显示,服务器请求客户端确认的时候,客户端返回的是Rst,而不是tcp。传输控制协议(TCP,TransmissionControlProtocol)是一种面向连接的,可靠的,基于字节流的传输层通信协议,由IETF的RFC793定义。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/13430262.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-04
下一篇 2023-08-04

发表评论

登录后才能评论

评论列表(0条)

保存