java 网络编程 黑马程序员学习笔记(3)

时间:2023-02-21 16:12:15

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

 

网络的基本概念:

ip地址、主机名、端口号、服务类型(ftp/http/telnet/smtp)

传输协议:

tcp: 是(transfer Control Protocol) 简称,是一种面向连接的,保证可靠传输的协议。通过tcp协议传输得到的是一个顺序的,无差错的数据流,发送方和接受方成对的socket之间必须建立连接,以便在tcp协议的基础上进行通信。

udp:是(user Dategram Protocol)的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址和目的地址,他在网络上以任何可能的路径传往目的地,内否传到目的地及正确性都不能得到保证。

网络上两个程序通过一个双向的通信连接实现数据的交换,一端是socket(由ip地址和端口号来确定)

 

 对于一个功能齐全的socket,要包含以下几个步奏

   1.创建socket。

  2.打开连接到socket的输入/输出流

  3.按照一定的协议对,Socket进行读写操作。

  4.关闭socket减少系统资源占用

 

以下是我自己遵照着视频实现的功能使用udp协议

 

java 网络编程 黑马程序员学习笔记(3)

中使用的技术点

DatagramSocket

DatagramPocket

Thread

InputStream

BufferedReader

InputStreamReader

package udpsend;

Send()//阻塞式方法

///////////////////////////////////////////////////////////代码如下//////////////////////////////////////////////
import java.net.*;
import java.io.*;
import java.util.Date;
import java.text.SimpleDateFormat;

class send implements Runnable
{
          private DatagramSocket ds;
          public send(DatagramSocket ds)
      {
       this.ds=ds;
      }
          public void run(){
 
            try{

         // 创建udp服务,通过DatagramSocket对象
         //DatagramSocket ds=new DatagramSocket();
         //确定数据,并封装成数据包,DatagramPacket(byte[ ] byte,int length
         //innetAddress int port
         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.255"),5000);
         //通过socket服务,将已有的数据包发送出去,通过send方法
         ds.send(dp);
         
         }
        
       
         //关闭资源
         //ds.close();   
          }
       catch(Exception e)
        {
         throw new RuntimeException("发送端失败");
        }}
         
         
 
}
class rece implements Runnable
{
  private DatagramSocket ds;
  public rece(DatagramSocket ds)
  {
   this.ds=ds;
  }
  public void run()
  {
   try{
   
  
    // 定义数据包,用于存储数据
    while(true)
    {
    byte[] buf = new byte[1024];
    DatagramPacket dp = new DatagramPacket(buf, buf.length);
    // 3.通过服务的receive方法将收到的数据存入数据包中。
    ds.receive(dp);
    // 通过数据包的方法获取其中的数据。
    String ip = dp.getAddress().getHostAddress();
    String data = new String(dp.getData(), 0, dp.getLength());
    int port = dp.getPort();
    SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
    System.out.print("来自ip地址为:"+ip+":"+port+"的朋友");
    System.out.println("");
    System.out.println("在"+df.format(new Date())+ "说:" + data );
   
   
    }
     
          }
  catch(Exception e)
   {
    throw new RuntimeException("接受端失败");
   }
  
}
 
 
}
class chartdemo
{
  public static void main(String[] args) throws Exception
  {
  DatagramSocket sendSocket=new DatagramSocket(10086);
  DatagramSocket receSocket=new  DatagramSocket(5000);
  new Thread(new send(sendSocket)).start();
  new Thread(new rece(receSocket)).start();
  }
}

 

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