socket编程初窥

占位,今天写完。

来了。


1.什么是socket?

Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口。(如果要对比的话,可以拿urlconnection来对比,urlconnection是对Http协议的封装,本身并不是协议,而是一个调用接口)。举个例子,实际上在实现Http协议时,内部就是使用了socket编程。Http协议是应用层协议,基于传输层Tcp协议之上,是无状态协议,不需要你往考虑线程、同步、状态治理等,内部是通过socket进行连接和收发数据的,不过一般在数据传输完成之后需要封闭socket连接。直接使用Socket进行网络通讯得考虑线程治理、客户状态监控等,但是不用发送头信息等,更省流量。另,HTTP是基于TCP的。不过,目前,有人正在研究基于TCP+UDP混合的HTTP协议。

或许,看一下这段代码,会更容易理解:

         private SSLSocket sslSocket;
      
         private InputStream inputStream;
          private OutputStream outputStream;
         private InputStream sslInputStream;
         private OutputStream sslOutputStream;
      
         private HttpConfiguration config;
      
          public HttpConnection(HttpConfiguration config, int connectTimeout) throws IOException {
              this.config = config;
             String hostName = config.getHostName();
             int hostPort = config.getHostPort();
              Proxy proxy = config.getProxy();
              if(proxy == null || proxy.type() == Proxy.Type.HTTP) {
                 socket = new Socket();
              } else {
                  socket = new Socket(proxy);
              }
              socket.connect(new InetSocketAddress(hostName, hostPort), connectTimeout);
          }


现在UrlConnection连接和Socket连接的区别应该十分清楚了吧。
使用UrlConnection比直接使用Socket要简单的多,不用关心状态和线程治理。
UrlConnection基于Http协议,只是进行了封装,添加了一些额外规则(如头信息),本质上也是建立TCP连接,利用Socket实现连接和传输数据的,不过我们一般每次请求完数据后都会实现finally方法,在该方法里封闭连接。

这部分内容摘自csdn博文“UrlConnection连接和Socket连接的区别”。因为发链接要审核,就不在此贴了,搜索该博文即可。


2.socket如何建立连接?

建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

1。服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

2。客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

3。连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。


3.socket编程。

已经晚上12:28分了,具体的编程实现以后有时间再补充了。

接着写。

以Android为例,首先在ui线程中启动一个线程,来向服务器发送客户端请求。

new socket(),socket.connect().通过该socket获取输入输出流,向服务器收发消息。关闭各种流,捕捉异常进行处理。

其次,在服务端应用中的main()方法中监听客户端的socket连接请求。

new ServerScoket(),server socket.accept()这是一个阻塞方法.监听到socket对象后,开启一个线程,在线程中利用该socket获取输入输出流,向客户端收发消息。关闭各种流,捕捉异常进行处理。

由于,同一个socket支持同时读和写,也就是说,比如客户端,可以开启两个线程,一个用来写,一个用来读。当然也可以只用一个线程,比如服务端,边读边写,把读到的内容同时写到其socketlist的众多socket中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值