黑马程序员_网络编程知识总结

来源:互联网 发布:python实现支付宝 编辑:程序博客网 时间:2024/05/29 20:04


------------------------------------------------android培训java培训期待与您交流!-----------------------------------------------

网络通讯要素
IP 地址
端口号
传输协议

数据的发送过程

①发送方
对数据进行封装(比方说应用层,网络层不同的层打上不同的标记等等),
等数据封装好之后就在物理层进行发送
②接收方
对接受到的数据进行解包,读出其中的信息

UDP连接方式

①特点
将数据及源和目的封装成数据包中,不需要建立连接
每个数据报的大小在限制在64k内
因无连接,是不可靠协议
不需要建立连接,速度快

②使用的场合
视频会议,聊天软件

③UDP传送编程实例

发送端也可以有端口
发送端要指定接收端的IP地址和端口号

class  UdpSend{public static void main(String[] args) throws Exception{//1,创建udp服务。通过DatagramSocket对象。DatagramSocket ds = new DatagramSocket(8888);//2,确定数据,并封装成数据包。DatagramPacket(byte[] buf, int length, InetAddress address, int port) byte[] buf = "UDP数据发送来了 ".getBytes();DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.254"),10000);//3,通过socket服务,将已有的数据包发送出去。通过send方法。ds.send(dp);//4,关闭资源。ds.close();}}

接收端必须指定自己的端口号,以供发送端寻找到

class  UdpRece{public static void main(String[] args) throws Exception{//1,创建udp socket,建立端点。DatagramSocket ds = new DatagramSocket(10000);while(true){   //2,定义数据包。用于存储数据。   byte[] buf = new byte[1024];   DatagramPacket dp = new DatagramPacket(buf,buf.length);   //3,通过服务的receive方法将收到数据存入数据包中。   ds.receive(dp);//阻塞式方法。   //4,通过数据包的方法获取其中的数据。   String ip = dp.getAddress().getHostAddress();                String data = new String(dp.getData(),0,dp.getLength());                   int port = dp.getPort();   System.out.println(ip+"::"+data+"::"+port);}//5,关闭资源//ds.close();}}


TCP连接方式

①特点

建立连接,形成传输数据的通道。
在连接中进行大数据量传输
通过三次握手完成连接,是可靠协议
必须建立连接,效率会稍低

②使用场合

下载,图片上传

③TCP传送编程实例

客户端

class  TcpClient{public static void main(String[] args) throws Exception {//创建客户端的socket服务。指定目的主机和端口Socket s = new Socket("192.168.1.254",10003);//为了发送数据,应该获取socket流中的输出流。OutputStream out = s.getOutputStream();out.write("tcp ge men lai le ".getBytes());s.close();}}

服务端

class  TcpServer{public static void main(String[] args) throws Exception{//建立服务端socket服务,并监听一个端口。ServerSocket ss = new ServerSocket(10003);//通过accept方法获取连客户端传递过来的Socket对象。while(true){    Socket s = ss.accept();    String ip = s.getInetAddress().getHostAddress();    System.out.println(ip+".....connected");    //获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据。    InputStream in = s.getInputStream();    byte[] buf = new byte[1024];    int len = in.read(buf);    System.out.println(new String(buf,0,len));    s.close();//关闭客户端.}}}

④为什么TCP端不会搞混淆是哪一个Soket客户端

因为每个客户端与服务端连接的时候,服务端都是获取到一个与该客户端对应的新Socket对象

⑤如何告诉服务端客户端已经写完数据了

标记:可以用时间戳的方式
Socket给我们提供了一个简便的方式
s.shutdownOutput();//关闭客户端的输出流。相当于给流中加入一个结束标记-1.

HTTP协议

①协议内容解释

告诉服务器请求的方式和资源名称
GET /myweb/demo.html HTTP/1.1
告诉服务器该客户端支持资源的类型
Accept: application/x-shockwave-flash, image/gif, image/x-xbitmap, image/jpeg, i
mage/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application
/msword, application/QVOD, application/QVOD,
支持的语言类型
Accept-Language: zh-cn
支持的编码
Accept-Encoding: gzip, deflate
告诉服务器写数据的时候写往哪个客户端和端口号
Host: 192.168.1.254:11000
获取到服务器端的信息之后连接是否保持
Connection: Keep-Alive

②HTTP协议运用:自定义浏览器

public static void main(String[] args)throws Exception {//建立Socket对象Socket s = new Socket("192.168.1.254",8080);PrintWriter out = new PrintWriter(s.getOutputStream(),true);out.println("GET /myweb/demo.html HTTP/1.1");out.println("Accept: */*");out.println("Accept-Language: zh-cn");out.println("Host: 192.168.1.254:11000");out.println("Connection: closed");out.println();out.println();BufferedReader bufr = new BufferedReader(new InputStreamReader(s.getInputStream()));String line = null;while((line=bufr.readLine())!=null){System.out.println(line);}s.close();}


URL对象帮我们封装了一些操作使得我们更方便的获取一些相关信息

String getFile()
获取此 URL 的文件名,含有参数
String getHost()
获取此 URL 的主机名(如果适用)。
String getPath()
获取此 URL 的路径部分。
int getPort()
获取此 URL 的端口号。
String getProtocol()
获取此 URL 的协议名称。
String getQuery()
获取此 URL 的查询部 ,获取参数进行发送的信息

URLConnection类

①特点及好处

返回一个远程的连接对象,它帮我们封装了Socket对象,我们直接就从服务端拿数据
它在传输层的时候把数据解包,把响应头的信息给去掉了

②编程实例

URL url = new URL("http://192.168.1.254:8080/myweb/demo.html");
URLConnection conn = url.openConnection();
System.out.println(conn);  
InputStream in = conn.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println(new String(buf,0,len));

当然URLConnection里面可以获取到相应的信息

客户端向服务器请求的步骤
客户端先请求找本地C:\Windows\System32\drivers\etc\hosts文件中是否有该映射地址,
没有那么就向外请求,向外请求的时候如果输入的是类似于
www.baidu.com这样的网址那么
先找DNS服务器获得该网站IP,得到该网址IP之后再向该IP进行请求


-----------------------------------------android培训java培训、java学习型技术博客、期待与您交流! --------------------------


详情请查看:http://edu.csdn.net/heima







0 0