zoukankan      html  css  js  c++  java
  • java网络编程

    java最初是作为网络编程语言出现的,对网络编程提供了高度的支持。在网络编程中,使用最多的就是Socket。
     
    QQ,MSN都是使用了Socket相关的技术
     
    网络7层协议:物理层(网线,网卡,传输二进制数据),数据链路层(传输帧),网络层(路由器),传输层(TCP,UDP),会话层(无协议),表示层(无协议),应用层(HTTP协议,FTP文件传输协议,SMTP简单邮件传送协议,Telnet远程登录协议)
     
    TCP/IP五层模型:物理层,数据链路层,网络层,传输层(TCP/IP协议),应用层
     
    每台主机都有一个ip地址,每个应用都有一个端口号,主机之间的通信,必须要知道对方的ip地址和端口号,这就是套接字。
     
     
    针对网络通信的不同层次,java提供的网络功能有四大类:
    1.InetAddress类:用于标识网络上的硬件资源,标识互联网协议(IP)地址。
    InetAddress address=InetAddress.getLocalHost();得到address对象之后,即可调用相关方法获取主机的主机名和ip地址:
    address.getHostName();
    address.getHostAddress();
     
    java如何打印一个数组呢?
    String[] as={"asdjf","jsdkflj","123"};
    System.out.println(Arrays.toString(as));
     
     
    2.URL(统一资源定位符):标识Internet上某一资源的地址
    URL由两部分组成:协议名称+资源名称,中间用冒号隔开。
    在java.net包中,提供了URL类来标识URL。
    URL url=new URL("http://www.baidu.com");
     
    通过URL对象的openStream()方法可以得到指定资源的输入流。通过输入流可以读取,访问网络上的数据。
     
      //通过URL的openStream方法获取URL对象所表示的资源的字节输入流
    InputStream stream=url.openStream();
    //将字节输入流转换成字符输入流
    InputStreamReader isr=new InputStreamReader(stream);
    //为字符输入流添加缓冲,提供读取的效率
    BufferedReader br=new BufferedReader(isr);
    String data=br.readLine();//读取数据
    while(data!=null){//循环读取数据
    System.out.println(data);
    data=br.readLine();
    }
    br.close();
    isr.close();
    stream.close();
     
    为什么添加缓冲能够提高读写的效率?
    运用FileInputStream读一段数据是一个字节一个字节的读取,如果有10个字节大小的文件,就要调用10次系统调用,每次将读取的数据赋值给变量,然后程序使用变量。缓冲区可以看作是一个放在内存中的数组,但是从硬盘中读取数据仍然要使用系统调用,系统调用的读取仍然是每次一个,只是每调用一次之后,将所得到的数据放入缓冲区中的,然后程序一次性使用10个数据。
     
     
    TCP协议是面向连接,可靠地,有序的,以字节流的方式发送数据。在通信之前,需要建立连接,保证数据传输的可靠性。
    基于TCP协议实现网络通信的类:
    客户端的Socket类
    服务器端的ServerSocket类
     
    客户端与服务器端的通信就是两个socket对象之间的对话。
     
    //创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
    ServerSocket serverSocket=new ServerSocket(8888);
    //调用accept()方法开始监听,等待客户端的连接
    Socket socket=serverSocket.accept();
    //获取输入流,并读取客户端的信息
    InputStream is=socket.getInputStream();
    InputStreamReader isr=new InputStreamReader(is);
    BufferedReader br=new BufferedReader(isr);
    String info=null;
    while((info=br.readLine())!=null){
    System.out.println("我是服务器,客户端    说:"+info);
    }
    socket.shutdownInput();
    br.close();
    isr.close();
    is.close();
    socket.close();
    serverSocket.close();
    ----------------------------------------------------------------------------------------
     
    //创建客户端Socket,指定服务器地址和端口
    Socket socket=new Socket("localhost",8888);
    //获取输出流,用于向服务器端发送信息
    OutputStream os=socket.getOutputStream();//字节输出流
    PrintWriter pw=new PrintWriter(os);//将输出流包装成打印流
    pw.write("我是客户端,我这儿有很多数据,需要发送给你,也就是我要和你通讯");
    pw.flush();
    socket.shutdownOutput();
    pw.close();
    os.close();
    socket.close();
     
    -----------------------------------------------------------------------------------------
     
    TCP协议中的三次握手:建立TCP需要三次握手才能建立,而断开连接则需要四次挥手。
     
    ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1
    SYN(SYNchronization) : 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此,  SYN置1就表示这是一个连接请求或连接接受报文。
    推荐博文:http://blog.csdn.net/oney139/article/details/8103223
     
     
    -----------------------------------------------------------------------------------------
    UDP:无连接的,不可靠的协议
    DatagramSocket    数据报Socket,用于客户端和服务器端的socket通话
    DatagramPackage        数据包,里面封装了要传输的数据,ip地址,端口号
     
    byte[] data=new byte[];
  • 相关阅读:
    创建image对象出现内存不足
    错误15023:当前数据库中已存在用户或角色
    看20遍还觉得很搞笑之<麦兜故事>片段之"鱼丸粗面"
    .NET中获取CPU编号及MAC地址
    清空file控件的值
    iframe 父窗口和子窗口的调用方法
    调用javascript后gif动画停止播放
    IIS上无法播放FLV视屏的问题
    黑客和小白
    (转载)innerHTML,innerTEXT,outerHTML的区别
  • 原文地址:https://www.cnblogs.com/james111/p/6607383.html
Copyright © 2011-2022 走看看