Http和UDP完成Socket通信基础



本章内容为:《Http和UDP完成Socket通信基础》
作者:nuoccc


首先我们来了解一下什么是http以及它的工作原理 以下是百度百科关于http的说法:

  • HTTP是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式。

  • HTTP是基于客户/服务器模式,且面向连接的。典型的HTTP事务处理有如下的过程:
    (1)客户与服务器建立连接;
    (2)客户向服务器提出请求;
    (3)服务器接受请求,并根据请求返回相应的文件作为应答;
    (4)客户与服务器关闭连接。
    大概的模型就像下图这样:


    Http和UDP完成Socket通信基础_第1张图片
    HttpAndUdp1.png

知道了工作原理,我们就通过工作原理来进行http的通讯编程。
首先我们先创立一个URL对象

URL url = new URL("http://localhsot:8080/test/dream.jpg");
//这里我用的是TOMCAT服务器,所以基础地址是localhost,端口号是8080,
后面是TOMCAT下的webapps下创建的test文件夹里面的dream图片

然后我们创建一个HttpURLconnection对象来获取url的连接

HttpURLConnection urlConn= (HttpURLConnection)url.openConnection();
//由于url.openConnection()返回的是一个URL对象所以我们必须要转化为子类HttpURLConnection才能接受。

然后进行一些相关属性的设置,熟练就行

urlConn.setConnectTimeout(5000);//设置连接的超时时间.
urlConn.setReadTimeout(5000);//设置读取数据的超时时间
urlConn.setDoInput(true);//设置允许进行读操作
urlConn.setDoOutput(true);//设置允许进行写操作
urlConn.setRequestMethod("GET");//设置请求方式,http协议中指定提交方法有两种请求方式,
一个是GET,一个是POST;这里我们用默认的GET,具体差距这里不讨论

设置完属性后就可以从服务器下载数据了,但是我们还是要确认一下服务器是否响应成功

//首先创立一个接受码来获取服务器响应的状态码
int responseCode = urlConn.getResponseCode();
//然后进行判断是否跟系统的正确状态码相同
if(responseCode==HttpURLConnection.HTTP_OK){
    //相同后我们就可以下载服务器数据了
    //创建一个输入流来获取服务器的输入流
    InputStream in = urlConn.getInputStream();
    BufferedInputStream bis = new BufferedInputStream(in);
    //然后在创建一个输出流来读输入流
    FileOutputStream fos = new FileOutputStream(new File(E:/test/test.png));
    BufferedOutputStream bos = new BufferedOutputStream(fos);
    byte[] buf = new byte[1024];
    int len = 0;
    while((len=bis.read(buf))!=-1){
        bos.write(buf,0,len);
    }
    //关闭流
    bos.close();
    bis.close();

}

然后我们在TOMCAT的根目录下的bin文件下运行startup.bat来启动服务器,位置如下:

Http和UDP完成Socket通信基础_第2张图片
HttpAndUdp2.png

然后启动我们的程序,来看看E:/test文件下是否创建了test.png

HttpAndUdp3.png

已经创建,我们最基础的基于http通信就这样完成了,然后我们来使用基于udp的通信。

首先我们来了解一下什么是UDP,以下是百度百科中关于UDP的说法:

  • UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768 [1] 是UDP的正式规范。UDP在IP报文的协议号是17。
  • UDP协议与TCP协议一样用于处理数据包,在OSI模型中,两者都位于传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。

然后因为Udp跟Tcp一样都位于传输层,所以我们跟Tcp一样模拟一个客户机一个服务器。
首先我们来实现Udp的客户机代码,先创立一个Udp的Socket对象

DatagramSocket socket = new DatagramSocket();
//本来有多种构造函数,但我们选择无参构造函数,因为发送端的socket的端口号是由系统分配的。

之后我们创建需要发送的内容,也就是数据报:

String msg = "hello,udp";
DataggramPacket packet = new DatagramPacket(msg.getBytes(),msg.length(),
                                    InetAddress.getByName("127.0.0.1"),8888);
//官方给出的构造函数,需要传的参数为数据报的内容,长度,以及目的地址,和端口号
//public DatagramPacket(byte buf[], int length,
//                       InetAddress address, int port) {
socket.send(packet);
//通过socket把数据报发送出去到服务器,然后客户端就完成了。

然后我们来创建服务器程序,首先还是一样创建一个Udp的Socket对象

DatagramSocket socket = new DatagramSocket(8888);
//这里我们要传一个端口号来保持跟客户机的一致

然后把接受到的数据报数据封装到我们服务器的数据报中

byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf,buf.length);

然后用我们当前的socket来接受我们的数据报

socket.receive(packet);

这样我们整个服务就完成了,当然也可以把数据报的内容打印出来

byte[] data = packet.getData();
String str = new String(data);//创建一个str来接受数据报里面的数据
InetAddress address=packet.getAddress();//创建一个address来接受客户机的地址
int port=packet.getPort();//创建一个port来获取客户机发送的端口
System.out.println(address+":"+port+"说"+str);//最后创立一个打印来看下结果

我们来看下控制台打印结果:


Http和UDP完成Socket通信基础_第3张图片
HttpAndUdp4.png

我们看见打印出了我们预期结果的数据,但是端口号并不是我们给的,这也应证了端口号是系统随机给的,每次都并不一定相同。
以上就是关于Http和Udp实现Socket编程的基础,Udp相当来说比Tcp代码少很多,因为是无连接少了三次握手,
但是Udp也有好处就是速度快,所以在具体应用中,Udp和Tcp没好坏之分,全看应用场景。
有兴趣可以看下接下来的《NIO基础》

你可能感兴趣的:(Http和UDP完成Socket通信基础)