网络编程学习笔记

网络通信的三要素

1.IP地址:
计算机在网络上的唯一标识,IPv4的IP地址标识方法为点分十进制(例如:192.168.0.1),IPv6的IP地址标志方法为冒分十六进制X:X:X:X:X:X:X:X 。回环地址127.0.0.1
2.端口号:
应用程序在计算中的唯一标识, 值域 0 - 65535, 建议使用一万以上
0-1024 系统程序默认占用 或者保留端口号
3.协议
UDP协议
不需要建立连接
发送数据有限制,最大传输 64K
只管发送 不保证接收
速度快
发送数据报包 / 解析数据报包
TCP协议
需要建立连接
发送的数据没有大小限制
一定能够保证接收到
速度略慢
通过socket对象中InputStream和OutputStream写入和读取数据

UDP发送

1:创建发送端DatagramSocket()
2:数据打包DatagramPacket(byte[] bs,length,InetAddress,port)
3:调用socket的发送方法send()
4:释放资源

UDP接收

1:创建接收端DatagramSocket(端口号)
2:定义数据包DatagramPacket
3:调用receive()接收数据
4:解析数据
5:释放资源
示例:采用UDP协议实现两个双向通信。

//Server端
public class Server {
 public static void main(String[] args) throws Exception {
  DatagramSocket ds = new DatagramSocket(8888);
  DatagramPacket dp = new DatagramPacket(new byte[1024], 1024);
  new Thread(){
   @Override
   public void run() {
    DatagramSocket ds = null;
    Scanner sc = new Scanner(System.in);
    System.out.println("Server:");
    try {
     ds = new DatagramSocket();
     while(true){
      byte[] bt = sc.nextLine().getBytes();
      DatagramPacket dp = new DatagramPacket(bt, bt.length, InetAddress.getByName("127.0.0.1"), 8989);
      ds.send(dp);
      if(new String(bt).equals("88")){
       break;
      }
     }
    } catch (Exception e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    
    ds.close();
    sc.close();
   }
  }.start();
  while(true){
   ds.receive(dp);
   String str = new String(dp.getData(), 0, dp.getLength());
   System.out.println(str);
   if(str.equals("88")){
    break;
   }
  }
  ds.close();
 }
}
//Client端
public class Server {
 public static void main(String[] args) throws Exception {
  DatagramSocket ds = new DatagramSocket(8888);
  DatagramPacket dp = new DatagramPacket(new byte[1024], 1024);
  new Thread(){
   @Override
   public void run() {
    DatagramSocket ds = null;
    Scanner sc = new Scanner(System.in);
    System.out.println("Server:");
    try {
     ds = new DatagramSocket();
     while(true){
      byte[] bt = sc.nextLine().getBytes();
      DatagramPacket dp = new DatagramPacket(bt, bt.length, InetAddress.getByName("127.0.0.1"), 8989);
      ds.send(dp);
      if(new String(bt).equals("88")){
       break;
      }
     }
    } catch (Exception e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    
    ds.close();
    sc.close();
   }
  }.start();
  while(true){
   ds.receive(dp);
   String str = new String(dp.getData(), 0, dp.getLength());
   System.out.println(str);
   if(str.equals("88")){
    break;
   }
  }
  ds.close();
 }
}

TCP发送

1:创建发送端socket(Ip,端口号)
2:获取socket对象的输出流
3:写出数据
4:释放资源

TCP接收

1:创建接收端ServerSocket(port)
2:监听是否有socket对象建立连接 accept()
3:获取socket对象的输入流
4:读取数据
5:释放资源
示例:采用TCP协议实现两个双向通信。

//Server端
public class ServerDemo {
 public static void main(String[] args) throws Exception {
  ServerSocket ss = new ServerSocket(9999);
  Socket sk = ss.accept();
  BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream()));
 String str = null;
  new Thread(){
   @Override
   public void run() {
    try {
     Thread.currentThread().sleep(5000);
    } catch (InterruptedException e1) {
     // TODO Auto-generated catch block
     e1.printStackTrace();
    }
    Socket skClient = null;
    BufferedWriter bw = null;
    try {
     skClient = new Socket(InetAddress.getByName("127.0.0.1"), 8888);
     bw = new BufferedWriter(new OutputStreamWriter(skClient.getOutputStream()));
     BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
     while(true){
      String str1 = null;
      System.out.print("Server:");
      str1 = br1.readLine();
      bw.write(str1);
      bw.newLine();
      bw.flush();
      if(str1.equals("88")){
       break;
      }
     }
    } catch (UnknownHostException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    
   }
  }.start();
  
  while((str = br.readLine()) != null){
   System.out.println(str);
   if(str.equals("88")){
    break;
   }
  }
 }
}

你可能感兴趣的:(网络编程学习笔记)