黑马程序员_Java基础--网络编程

 

知识点总结

A、 网路模型TCP/IP

B、 通讯三要素:Ip地址;端口号(0—65535);传输协议

IP地址:InetAddress 注意;此类无构造方法,那么必然会有获得该类对象的方法。

public Enumeration<InetAddress> getInetAddresses()一个便捷方法,返回一个具有绑定到此网络接口全部或部分 InetAddress 的 Enumeration。

通过Socket和DatagramPacket类的getAddress()方法也可以得到

public InetAddress getAddress()

例子:要获得一个Socket接口的中的Ip地址

ServerSocket ss=new Serversocket(10001);

Socket s=ss.accept();

String ip=s.getInetAddress().getHostAddress();

端口:数据额要发送到对方指定应用程序上,为了标识这些应用程序,所以给这些网络程序都用数字标识,这些数字叫做端口,逻辑端口。

通讯规则:协议

1、  私有IP地址上网原理

 

 

私有IP

Internet

网关

 

网关功能:a、转发私有IP地址与Internet的数据信息

b、维护一张地址映射表

c、会替换数据包上的IP地址

2、  Tcp的Server和client的交互过程

A、 Server创建一个ServerSocket然后调用accept()连接

B、 客户端创建一个Socket并请求与服务端建立连接

C、 服务端接收客户端的请求,建立专线连接

D、建立两个Socket在一个单独的线程上对话

E、 服务器在等待新的请求

例子:建立连接的Socket都会监听相同的端口,这是因为TCP是面向连接的协议

class TcpClient{

       public static void main(String []args)throws Exception{

              Socket sk=new Socket("",10002);

              OutputStream out =s.getOutputStream();

              out.write("tcp lai l".getBytes())\

              InputStream in =s.getInputStream();

              byte[] buf=new byte[1024];

              int len =in.read(buf);

             

              System.out.println(new String(buf,0,len));

              s.close();

              }

      

       }

//服务端,定义端点接受的数据,打印在控制台上

       //建立服务端的socket服务,绑定端口,有指定,或者提供的方法进行绑定,获取链接过来的客户端

       //通过ServerSocket accept方法,没有就会等待,是阻塞方法       

class TcpServer{

       public static void main(String []args){

              ServerSocket ss=new ServerSocket(10002);

              Socket s=ss.accept();

             

             

              String ip=s.getAddress().getHostAddresss();

              System.out.println(ip+"::");

             

             

              InputStream in=s.getInputStream();

              byte[] buf=new byte[1024];

              int len=in.read(buf);

             

              System.out.println(new String(buf,o,buf.len));

 

              OutputStream out=s.getOutputStream();

              out.write("wofanhuixinxi".getBytes());

                            s.close();

                            ss.close();

              }

      

       }

3、  Udp是面向无连接

DatagramSocket此类表示用来发送和接收数据报包的套接字

   数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。

  DatagramPacket此类表示数据报包。

  数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。

使用udp对话过程中必须使用到以上两个类,例子:一个聊天程序

class Send implements Runnable{

       private DatagramSocket ds;//定义一个数据报包的套接字

       public  Send(DatagramSocket ds){

              this.ds=ds;

              }

              public void run(){

                     try {

                            //键盘录入

                            BufferedReader bufr=

                             new BufferedReader(new InputStreamReader(System.in));

                            String line=null;

                                   while(true){

                                   if("886".equals(line))

                                   break;

                                   byte[] buf=new byte[1024];

                                   //在发送端定义数据包无连接投递得到的数据,发送到10001端口

                                   DatagramPacket dp=

                                   new DatagramPacket(buf,buf.length,InetAddress.getByNanme(""),10001);

                                    ds.send(dp);//把数据包中的数据发送出去

                                   }

                            }catch(Exception e){

                                   rhrow new RuntimeException("budingyong");

                                   }

                    

                     }

             

class Recive implements Runnable{

       private DatagramSocket ds;

       public  Recive(DatagramSocket ds){

              this.ds=ds;

              }

             

              public void run(){

                     try{

                           

                            while(true){

                                   byte[] buf=new byte[1024];

                                   //在接收端定义一个数据报包,并且监听10001端口

                                   DatagramPacket dp=new DatagramPacket(10001);

                                   ds.recive(dp);//接受数据

                                   //通过DatagramSocket的方法获得发送方的IP地址

                                   String ip=dp.getAddress().getHostAddress();

                                   //获得数

                                   String data=new String(dp.getData(),0,dp.getLength());

                                   System.out.println(ip+"::"+data);

                                   }

                            }cacth(Exception e){

                                  

                                   throw new RuntimeException("budingyong");

                                   }

                    

                     }

       }

      

4、  访问Internet

java.net包中有URL,URLDecoder,URLEncoder,URLConnection,HttpURLConnection

 主要内容:

A、 URL:统一资源定位符,(uniform resource Locator)

组成:协议      主机名          端口号(网路服务监听)       资源名

     http ://    www.xxxx.com : 8080        /   index.html

 相对URL 例如: “/a.html”就是当前网络所以使用的网路路径

                   “、、/、、/a.html”父目录的父目录

     “a.html”是指当前目录的文件

B、 URL编码

对于浏览器能对网络直接传送的字符进行Url编码,将空格换成(+)加号,或者换成十六进制编码%20;对于其他的字符“+”à%2B,“=”à%3D;URLDecoder和URLEncoder实现URL的解码和编码

package day23;
/*
 * 编写聊天程序
 * 有收数据的部分,和发数据部分
 * 这两个同时执行,
 * 那就需要采用到多线程技术
 * 一个线程负责收,一个线程控制发
 *
 * 因为收发动作不一致,所以要定义两个run方法
 * 而且这两个方法被封装到不同类中
 */
import java.io.*;
import java.net.*;
public class chatDemo {

 /**
  * @param args
  * @throws SocketException
  */
 public static void main(String[] args) throws SocketException {
  // TODO Auto-generated method stub
  DatagramSocket sendSocket = new DatagramSocket();
  DatagramSocket receSocket = new DatagramSocket(10002);
  
  new Thread(new Send(sendSocket)).start();
  new Thread(new Rece(receSocket)).start();
 }

}
class Send implements Runnable{
 private DatagramSocket ds;
 public  Send(DatagramSocket ds)
 {
  this.ds = ds;
 }
 
 @Override
 public void run() {
  // TODO Auto-generated method stub
  try{
   BufferedReader bufr =
     new BufferedReader(new InputStreamReader(System.in));
   String line = null;
   while((line=bufr.readLine())!=null){
    if("886".equals(line))
     break;
    byte[] buf = line.getBytes();
    DatagramPacket dp =
      new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.82"),10002);
    ds.send(dp);
   }
  }
  catch(Exception e){
   throw new RuntimeException("发送端失败");
  }
 }
 
}

class Rece implements Runnable{
 private DatagramSocket ds;
 public Rece(DatagramSocket ds)
 {
  this.ds = ds;
 }
 @Override
 public void run() {
  // TODO Auto-generated method stub
  try{
   while(true){
    byte[]buf = new byte[1024];//初始化一个字节数组
    DatagramPacket dp = new DatagramPacket(buf,buf.length);
    
    ds.receive(dp);
    String ip = dp.getAddress().getHostAddress();
    String data = new String(dp.getData(),0,dp.getLength());
    System.out.println(ip+"::"+data);
   }
  }
  catch(Exception e){
   throw new RuntimeException("接收端失败");
  }
 }
 
}


*---------------------------------------------

package day23;
/*
 * 客户端
 * 该对象一建立就可以连总结指定主机
 * 因为tcp是面向连接的,所以在建立socket服务时,
 * 就是要有服务端存在,并连接成功,形成同路后,再改通道进行数据的传输
 *
 * 步骤
 * 1 建立Socket服务,并指定
 *
 */
import java.io.*;
import java.net.*;
public class ClientSocket{

 /**
  * @param args
  * @throws IOException
  * @throws UnknownHostException
  */
 public static void main(String[] args) throws UnknownHostException, IOException {
  // TODO Auto-generated method stub
  Socket s = new Socket("192.168.0.82",10003);
  
 }

}


----------------------------------------------

package day23;
/*
 * udp 面向无连接
 * 将数据源和目的封装成数据包中,不需要建立连接
 * 每个数据包的大小限制在64k内
 * 无连接,不可靠
 * 不需要建立连接,速度快
 */
import java.net.InetAddress;
import java.net.UnknownHostException;

public class IPDemo {

 /**
  * @param args
  * @throws UnknownHostException
  */
 public static void main(String[] args) throws UnknownHostException {
  // TODO Auto-generated method stub
  //InetAddress i = InetAddress.getLocalHost();
  //System.out.println(ia.toString());
  InetAddress ia = InetAddress.getByName("www.baidu.com");
  System.out.println("address"+ia.getHostName());
  System.out.println("name"+ia.getHostAddress());
  
  
 }

}


-------------------------------------------

package day23;
/*
 * 客户端
 * 该对象一建立就可以连总结指定主机
 * 因为tcp是面向连接的,所以在建立socket服务时,
 * 就是要有服务端存在,并连接成功,形成同路后,再改通道进行数据的传输
 *
 * 需求给服务端发送一个文本数据
 * 步骤
 * 1 建立Socket服务,并指定
 *
 */
import java.io.*;
import java.net.*;
public class TcpClient{

 /**
  * @param args
  * @throws IOException
  * @throws UnknownHostException
  */
 public static void main(String[] args) throws UnknownHostException, IOException {
  // TODO Auto-generated method stub
  Socket s = new Socket("192.168.0.82",10010);
  
  //为了发送数据,应该获取socket六种的输出流
  OutputStream out = s.getOutputStream();
  
  out.write("tcp ge men lai le ".getBytes());
  
  
  
  
  
 }

}


--------------------------------------------

 

package day23;

 

/*
 * 需求,定义端点接收数据并打印在控制台上
 *
 * 1 建立服务端的socket服务,,ServerSocket(
 *   并监听一个端口
 * 2 获取连接过来的客户 通过ServerSocket的accept方法,没有连接就会等,所以这个方法阻塞式的
 * 3 客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的流读取发过来的数据
 * 4 关闭服务端(可选)
 */
import java.io.*;
import java.net.*;
class TcpServer{
 public static void main(String[] args) throws Exception{
  ServerSocket ss = new ServerSocket();
  
  
  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();
  ss.close();
 }
}
----------------------------------------------


package day23;

import java.net.*;
import java.io.*;
public class Udprece2 {

 /**
  * @param args
  * @throws IOException
  */
 public static void main(String[] args) throws IOException {
  // TODO Auto-generated method stub
  DatagramSocket ds = new DatagramSocket(10001);
  
  while(true){
   byte[] buf = new byte[1024];
   DatagramPacket dp = new DatagramPacket(buf,buf.length);
   
   ds.receive(dp);
   String ip = dp.getAddress().getHostAddress();
   String data = new String(dp.getData(),0,dp.getLength());
   System.out.println(ip+"::"+data);
  }
 }

}


-----------------------------------------------------

package day23;

/*
 * 通过udp传输方式,将一段文字数据发送出去
 *
 * 思路:
 * 1 建立udpsocket服务
 * 2 提供数据,并将数据封装到数据包中
 * 3 通过socket服务的发送功能,数据包发出去
 * 4 关闭资源
 */
import java.io.IOException;
import java.net.*;
public class UdpSend {

 /**
  * @param args
  * @throws IOException
  */
 public static void main(String[] args) throws IOException {
  // TODO Auto-generated method stub
  DatagramSocket ds = new DatagramSocket(8888);
  
  byte[] buf = "udp ge men lai le ".getBytes();
  DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.82"),10000);
  ds.send(dp);
  ds.close();
 }

}

 


------------------------------------------------------
package day23;

import java.net.*;
import java.io.*;
public class Udpsend2 {

 /**
  * @param args
  * @throws IOException
  */
 public static void main(String[] args) throws IOException {
  // TODO Auto-generated method stub
  DatagramSocket ds = new DatagramSocket();
  BufferedReader bufr =
    new BufferedReader(new InputStreamReader(System.in));
  String line = null;
  while((line=bufr.readLine())!=null){
   if("886".equals(line))
    break;
   byte[] buf = line.getBytes();
   DatagramPacket dp =
     new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.82"),10001);
   
   ds.send(dp);
  }
  ds.close();
 }

}


-----------------------------------------------------

package day23;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

/*
 * 定义一个程序,接收upd协议传输的数据并处理。
 * 思路
 * 1 定义udpsocket服务
 * 2 定义一个数据包,
 * 因为要存储接收到的字节数据,因为数据包对象中有更多功能可以提取字节数据中不同数据信息
 * 3 通过socket服务的receive方法将接收到的数据存入已定义好的数据包中
 * 4 通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上。
 * 5 关闭资源
 */
class UpRece{
 public static void main(String[] args) throws Exception{
  DatagramSocket ds = new DatagramSocket(10000);
  while(true){
  byte[] buf = new byte[1024];
  DatagramPacket dp = new DatagramPacket(buf,buf.length);
  
  ds.receive(dp);
  String ip = dp.getAddress().getHostAddress();
  
   String data = new String(dp.getData(),0,dp.getLength());
  
   int port = dp.getPort();
  
   System.out.println(ip+"::"+data+"::"+port);
   }
  
  // ds.close();
 }
}

posted on 2013-05-15 16:35  小川!  阅读(165)  评论(0编辑  收藏  举报