黑马程序员----网络编程一

来源:互联网 发布:java怎么做界面设计 编辑:程序博客网 时间:2024/05/21 12:44

<a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流!

一、网络间通信的前提:
    1、找到对方的IP地址,IP地址是网络中计算机的标示,一个Ip地址对应着网络中唯一一台计算机
 2、网络中两台电脑的通信,就是两台计算机中对应的应用程序间通信。为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识,为了方便称呼这个数字,我们叫做端口(逻辑端口),计算中会用0-65535(其中0-1024端口已被系统保留,www的端口80,mysql的端口3306等)来表示端口,计算机上的一个端口,唯一标识一个网络应用程序
 3、定义通信规则:指通信协议,如TCP/IP协议,传输协议一般分为TCP和UDP协议
二、网络模型(OSI参考模型与TCP/IP参考模型)
     1、OSI参考模型 根据ISO的设计将网络分为七层:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层,这七层之间的互相通信的实现,上层为下层提供数据,下层封装数据,并加入其本身的特有的信息从而形成传输时的数据报,接受方则是不断的拆包,并传递给它的上一层,最终根据端口,送到特定的应用程序
  2、TCP/IP协议将OSI模型简化为四层,通信规则差不多
三、java如何操作网络通信的要素
    1、IP的处理:使用java.net包InetAddress类来处理,在InetAddress类中提供给我们一些关于IP与域名的解析方法,我们通过IP地址可以的主机的名字,可以通过网址(www.baidu.com)获得它的主机信息,Ip地址等等
     InetAddress ips = InetAddress.getLocalHost();//获得自己主机的InetAddress对象,然后可以知道自己的IP地址和主机名利用ips.getHostAddress()和ips.getHostName()
  还可以获得网络中任意一台计算机的IP地址和主机名,对于网络上不只有一台主机的IP可以获得它的所有信息通过以下方式:获得主机名为www.baidu.com的主机IP和主机名
  String name = "www.baidu.com";
  InetAddress[] ips = new IpTest1().getInetAddress(name);//这里使用了InetAddress类的静态方法InetAddress.getAllByName(name);
  for(InetAddress i : ips)
  {
   System.out.println("主机地址:"+i.getHostAddress());
   System.out.println("主机名:"+i.getHostName());
  }
 2、端口:就是一个数字标识,该数字标识为0-65535之间,其中0-1024被系统保留,java没有为之封装对象
 3、传输协议,常见的TCP和UDP协议
     UDP协议的特点:将数据及源和目的封装成数据包,不需要建立连接;每个数据报的大小限制在64k;不可靠,因为面向无连接;不需要建立连接,传输速度快。主要用途:聊天,视频会议
  TCP协议的特点:面向连接,是可靠传输协议(TCP建立连接通过三次握手实现),形成传输数据通路;在连接中进行大数据量的传输;因为建立连接,数据传输效率低。下载走的TCP协议
 4、Socket (确定两台计算机之间如何通信的应用程序)
    Socket为网络程序通信提供服务的一种机制;通信双方都应该有Socket,网络之间的通信就是两个Socket之间的通信;数据在两个Socket之间通过IO流的方式进行传输
    4.1UDP协议传输的操作:发送端
      java中提供了DatagramSocket与DatagramPacket两个类用来建立UDP的socket
   其中DatagramSocket既可以发送也有接受动作,其提供了receive和send两个类,发送时用到了DatagramPacket数据报包,实现无连接的传递服务(数据包的构造,发送端都有一个接收端的地址)。使用UDP发送数据包的步骤:需求,通过UDP传输方式,将每一段报文发送
   1》、建立UDPSocket服务DatagramSocket ds = new DatagramSocket();这里要处理异常
   2》、提供数据,并将数据封装到数据包中(DatagramPacket(byte[] buf,int length,InetAddress address,int port))
   3》、通过socket服务的发送功能将数据报发送出去 ds.send(dp);
   4》、关闭资源 ds.close();
  
   4.2UDP的接收端程序:使用DatagramSocket的receive();用于接收UDP协议传输的数据并处理该数据;定义接收端时,通常会监听一个端口,其实就是给这个接收网络应用     程序定义数字标识,为了便于明确那写数据过来,该应用程序可以处理
  思路:1、定义udpsocket服务
  2、定义一个数据包,以为要存储udp接收到的字节数据,因为数据包对象中有跟更多功能用于提取字节数据中的不同数据信息,包含发送端IP,数据内容等等
  3、通过socket服务的receive方法将收到的数据存入已经定义好的数据包中
  4、通过数据包对象的特有功能。将这下不同的数据取出,并展示给用户dp.getLength();获得数据报内容的实际长度
  5、关闭资源
  程序实例
   DatagramPacket dp = null;
        DatagramSocket ds = null;
        byte[] buf = new byte[1024];
        try {
   ds = new DatagramSocket(44012);//1、定义udpsocket服务,并监听44012端口
   dp = new DatagramPacket(buf, buf.length); //定义数据包,用于存储接收到的udp数据,
   ds.receive(dp);//3、接收udp发送过来的数据
  } catch (SocketException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
        //4、获得udp接收到的数据信息
        String ip = dp.getAddress().getHostAddress();
    
  String data = new String(dp.getData(),0,dp.getLength());
        int port = dp.getPort();
        System.out.println(ip+"::"+port+"::"+data);
        //5、关闭资源
        ds.close();
      4.3、利用多线程实现(udp)聊天程序
      4.4、TCP传输:我们使用Socket(客户端)和ServerSocket(服务端)两个类来处理TCP通信
         Socket其特点:1、tcp分为客户端和服务端;2客户端对应的对象是Socket对象,服务端对应的对象是ServerSocket对象
         客户端 :因为Tcp是面向连接的,所以在创建Socket对象时就要有服务端,并连接成功,形成通路后,在该通路上进行数据的传输
         TCP通信的一般步骤
          1、建立Socket服务,并指定要连接的主机和端口Socket socket = new Socket("192.168.1.254",10003);
          2、向服务器发送数据时通过socket的getOutputStream的到输出流,向服务器输出信息
     s = new Socket(InetAddress.getLocalHost(), 10004);
   OutputStream out = s.getOutputStream();
   out.write("hello ge men".getBytes());
   s.close();
         服务端的一般步骤:
          1、建立服务端的Socket服务,此时使用的是ServerSocket对象,并监听一个端口
          2、获得链接过来的客户端对象,通过ServerSocket的accept方法,在没有连接时,该对象会一直监听该端口,所以这个方法是阻塞式的
          3、客户端如果发过数据来,那么服务端要使用相对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据,并做相应的操作
          4、关闭服务端   
     ss = new ServerSocket(10004);
     Socket s = ss.accept();
   
   InputStream in = s.getInputStream();//通过客户端对象的输入流读取客户端的发送的信息
   byte[] buf = new byte[1024];
   int i = 0;
   if((i = in.read(buf))>0)
   {
    System.out.println(new String(buf));
   }
   s.close();//关闭客户端的Socket链接,这样就达到断开链接的目的
      (服务器给客户端回信息时是通过客户端对象的OutputStream回复的)out.write("哥们接收到了".getBytes());
   实例一、小写转化为大写服务器分析分析:
   客户端:既然是操作设备上的数据,那么就可以使用io技术,并按照io的操作规律来思考。
   源:键盘输入小写字母(字符串)
   目的:网络设备,网络输出流,主意是对字符流还是字节流的操作。
   主要部分代码
    s = new Socket(InetAddress.getLocalHost(),10005);
   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
   
   BufferedWriter bwout = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
   BufferedReader brin = new BufferedReader(new InputStreamReader(s.getInputStream()));
   
   String str = null;
   while((str = br.readLine())!= null)//readLine等待回车换行标记
   {
    if("over".equals(str))
     break;
    bwout.write(str);
    bwout.newLine();
    bwout.flush();
    String line = brin.readLine();
    System.out.println(line);
   }服务器端代码
   ss = new ServerSocket(10005);
   Socket s = ss.accept();
   String ip = s.getInetAddress().getHostAddress();
   System.out.println(ip+"\tconnected");
   BufferedReader brin = new BufferedReader(new InputStreamReader(s.getInputStream()));
   BufferedWriter bwout = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
   
   String line = null;
   while((line = brin.readLine())!= null)
   {
    bwout.write(line.toUpperCase());
    bwout.newLine();
    bwout.flush();

可以用PrintWriter来带替
   }
     实例二,通过Socket与io流的操作实现文件的上传
  客户端主要部分
  BufferedReader br = new BufferedReader(new FileReader("TCPCline.java"));
  PrintWriter out = new PrintWriter(s.getOutputStream(),true);
  String line = null;
  while((line=br.readLine())!=null)
  {
   out.println(line);
  }
  s.shutdownOutput();//关闭客户端的输出流。相当于给流中加入一个结束标记-1.
  BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
  String str = bufIn.readLine();
  System.out.println(str);

ASP.Net+Android+IOS开发、.Net培训、期待与您交流!

原创粉丝点击