网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
TCP/IPUDP是什么?
TCP/IP(TransmissionControlProtocol/InternetProtocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。UDP(UserDataProtocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。
下面是他们三者的关系:
可以看出TCP/IP协议族包括运输层、网络层、链路层。socket是一个接口,在用户进程与TCP/IP协议之间充当中间人,完成TCP/IP协议的书写,用户只需理解接口即可。
所以socket到底是什么?
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
要通过互联网进行通信,至少需要一对套接字,一个运行于客户机端,称之为ClientSocket,另一个运行于服务器端,称之为serverSocket
socket工作原理
服务器代码:
;
;
;
;
;
;
publicclassServer{
publicstaticvoidmain(String[]args)throwsIOException{
ServerSocketserverSocket=newServerSocket(2000);
("服务器准备就绪");
//("client:"+()+"p:"+());
("服务器信息:"+()+"p:"+());
//等待客户端连接
while(true){
Socketclient=();
ClientHandlerclientHandler=newClientHandler(client);
();
}
}
privatestaticclassClientHandlerextsThread{
privateSocketsocket;
ClientHandler(Socketsocket){
=socket;
}
privatebooleanflag=true;
@Override
publicvoidrun(){
//();
("新客户端连接:"+()+"p:"+());
try{
//得到打印流,用于数据输出;服务器回送数据使用
PrintStreamsoketOutput=newPrintStream(());
//得到输入流,用于接收数据
BufferedReadersocketInput=newBufferedReader(
newInputStreamReader(()));
do{
//客户端拿到一条数据
Stringstr=();
//Stringecho=();
if("bye".equalsIgnoreCase(str)){
flag=false;
("bye");
}else{
//打印到屏幕,并回送数据长度
(str);
("回送:"+());
}
}while(flag);
();
();
}catch(IOExceptione){
("连接异常断开");
}finally{
//连接关闭
try{
();
}catch(IOExceptione){
();
}
}
("客户端已退出:"+()+"p:"+());
}
}
}
客户端代码:
*;
;
;
;
publicclassClient{
publicstaticvoidmain(String[]args)throwsIOException{
Socketsocket=newSocket();
(3000);
//连接本地,端口2000;超时时间为3000ms
(newInetSocketAddress((),2000),3000);
("服务器已连接");
("client:"+()+"p:"+());
("服务器信息:"+()+"p:"+());
try{
todo(socket);
}catch(Exceptione){
("关闭异常");
}
();
("客户端已退出");
}
privatestaticvoidtodo(Socketclient)throwsIOException{
InputStreamin=;
BufferedReaderinput=newBufferedReader(newInputStreamReader(in));
//得到soket输出流,并转换为打印流
OutputStreamoutputStream=();
PrintStreamsockePrintStream=newPrintStream(outputStream);
//得到sokcet输入流,并转换为socketBufferReader
InputStreaminputStream=();
BufferedReadersokcetBufferedReader=newBufferedReader(newInputStreamReader(inputStream));
booleanflag=true;
do{
//键盘读取一行
Stringstr=();
//发送到服务器
(str);
//从服务器读取一行
Stringecho=();
if("bye".equalsIgnoreCase(echo)){
flag=false;
}else{
(echo);
}
}while(flag);
//关闭socket流
();
();
}
}
执行效果:
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。
而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。