通信协议

 通信要素:

   网络通信协议:实现通信有些约定:对速率传输代码,代码结构,传输控制步骤,出错控制等指定标准

                             通信协议分层的思想:层次方式:同层可以通信,上一层可以调用下一层,而与在下一层不发生关系,

                                                                                各层互不影响,利于系统的开发和扩展。

    传输层协议中有两个重要的协议:1. 传输控制协议: TCP

                                                          2. 用户数据报协议:UDP

  • TCP协议:1. 使用TCP协议前,须先建立TCP连接,形成传输数据通道

                            2. 传输前,采用三次握手方式,点对点通信,是可靠的

                            3. TCP协议进行通信的两个应用进程:客户端,服务器

                            4. 在连接中可进行大数据量的传输

                            5. 传输完毕,释放已建立的链接(四次挥手),效率低

  • UDP协议:1. 将数据,源,目的封装成数据包,不需要建立链接

                             2. 每个数据报的大小限制在64k内

                             3. 发送不管对方是否准备好,接收方收到也不确认,故是不可靠的

                             4. 可以广播发送

                             5. 发送数据结束时不需释放资源,开销小,速度快

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class TCPTest1
{
/*
 实现TCP的网络编程
 客户端发送信息给服务端端,服务端将数据显示在控制台上
*/
 public void client()//客户端
{
   Socket socket= null;//快捷键ctrl+p 很多带参数的构造器
   OutputStream outputStream = null;//调用io流传输据
   try {//快捷键ctrl+alt+t
     //创建socket对象,指明服务器端的ip和端口号
     InetAddress inetAddress=InetAddress.getByName("127.0.0.1");//指明对方的ip
     socket = new Socket(inetAddress,8899);
     //获取一个输入流,用于输入数据
     outputStream = socket.getOutputStream();

     outputStream.write("你好".getBytes());//写出数据,已发出去
  } catch (IOException e)
  {
     throw new RuntimeException(e);
  }finally {
     //资源关闭
     if (outputStream!=null)
    {
       try {
         outputStream.close();
      } catch (IOException e) {
         throw new RuntimeException(e);
      }
    }
     if (outputStream!=null)
    {
       try {
         socket.close();
      } catch (IOException e) {
         throw new RuntimeException(e);
      }
    }

  }
public static void main(String[] args)
  {
          TCPTest1 tcptest1=new TCPTest1();
           tcptest1.client();
  }
}
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server1
{
   public void server() //服务端
{
   ServerSocket serverSocket= null;//对于服务器来说,指明自己的端口就行
   Socket accepts = null;//接收客户端的socket
   InputStream inputStream = null;//获取流,读入
   ByteArrayOutputStream baos= null;
   try {
     //创建服务器端的ServerSocket,指明自己的端口号
     serverSocket = new ServerSocket(8899);
     //调用accept()表示接收客户端的socket
     accepts = serverSocket.accept();
     //获取输入流
     inputStream = accepts.getInputStream();
     //汉字可能会出现乱码,不建议   util-8占3个字节 一个一个转换字符,可能会出现乱码
//   byte [] buffer=new byte[1024];
//   int len;
//   while ((len=inputStream.read(buffer))!=-1)
//   {
//     //发过来的是文本,用String
//     String string=new String(buffer,0,len);
//     System.out.print(string);
//
//   }
     //读取输入流中的数据
     baos = new ByteArrayOutputStream();
     byte [] buffer=new byte[5];//这样写多短都可以
     int len;
     while ((len=inputStream.read(buffer))!=-1)
    {
       baos.write(buffer,0,len);
    }
     System.out.println(baos.toString());//所有的字节都转换成字符串0
     System.out.println("收到了来自于"+serverSocket.getInetAddress().getHostAddress()+"数据");
  } catch (IOException e) {
     throw new RuntimeException(e);
  }finally {
     //关闭资源
     if (baos!=null)
    {
       try {
         baos.close();
      } catch (IOException e) {
         throw new RuntimeException(e);
      }
    }
     if (inputStream!=null)
    {
       try {
         inputStream.close();
      } catch (IOException e) {
         throw new RuntimeException(e);
      }
    }
     if (accepts!=null)
    {
       try {
         accepts.close();
      } catch (IOException e) {
         throw new RuntimeException(e);
      }
    }
     if (serverSocket!=null)
    {
       try {
         serverSocket.close();
      } catch (IOException e) {
         throw new RuntimeException(e);
      }
    }
  }
}
public static void main(String[] args)
  {
          Server1 server1=new Server1();
           server1.sever();
  }
}

}
-------------------------------------
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
/*
客户端发送文件给服务端,服务端将文件保存在本地
*/
public class TCPTest2
{
  public void clienta() throws Exception {
      Socket socket=new Socket(InetAddress.getByName("127.0.0.1"),9090);
      OutputStream outputStream= socket.getOutputStream();
      FileInputStream file=new FileInputStream(new File("../URL://AJMO7199.JPG"));
      byte[] buffer=new byte[1024];
      int len;
      while ((len=file.read(buffer))!=-1)
      {
          outputStream.write(buffer,0,len);
      }
      file.close();
      outputStream.close();
      socket.close();
  }
   public static void main(String[] args)
  {
         TCPTest2 tCPTest2=new TCPTest2();
           tCPTest2.clienta();
  }
}
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server2
{
   public void server() throws IOException {
      ServerSocket serverSocket = new ServerSocket(9090);//不用指明自己ip,因为在自己电脑运行,运行起来自己识别了
      Socket accept = serverSocket.accept();

      InputStream inputStream = accept.getInputStream();
      FileOutputStream fos=new FileOutputStream(new File("d.JPG"));
      byte[] buffer=new byte[1203];
      int len;
      while ((len=inputStream.read(buffer))!=-1)
      {
          fos.write(buffer,0,len);
      }
      fos.close();
      inputStream.close();
      serverSocket.close();
      accept.close();
  }
 public static void main(String[] args)
  {
          Server2 server2=new Server2();
           server2.sever();
  }
}
}
​---------------------------------------
package inetAddressTest1;

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/*
从客户端发送文件给服务端,服务端保存到本地,并返回“发送成功”给客户端。并关闭相应连接
*/
public class TCPTest3
{
   public void clienta() throws Exception {
       //1
       Socket socket=new Socket(InetAddress.getByName("127.0.0.1"),9090);
       OutputStream outputStream= socket.getOutputStream();
       FileInputStream file=new FileInputStream(new File("../URL://AJMO7199.JPG"));
       byte[] buffer=new byte[1024];
       int len;
       while ((len=file.read(buffer))!=-1)
      {
           outputStream.write(buffer,0,len);
      }
       /////////////////////
       //2
       socket.shutdownOutput();//关闭数据输出
       //接收来自于服务器端的数据,并显示到控制台上
       InputStream inputStream1 = socket.getInputStream();
       ByteArrayOutputStream bass1=new ByteArrayOutputStream();
       byte [] bufferr=new byte[20];
       int len1;
       while ((len1=inputStream1.read(buffer))!=-1)
      {
          bass1.write(buffer,0,len1);
           System.out.println(bass1.toString());
      }
       
       file.close();
       outputStream.close();
       socket.close();
  }
   
   
   public void server() throws IOException {
       //1
       ServerSocket serverSocket = new ServerSocket(9090);//不用指明自己ip,因为在自己电脑运行,运行起来自己识别了
       Socket accept = serverSocket.accept();

       InputStream inputStream = accept.getInputStream();
       FileOutputStream fos=new FileOutputStream(new File("d1.JPG"));
       byte[] buffer=new byte[1203];
       int len;
       while ((len=inputStream.read(buffer))!=-1)
      {
           fos.write(buffer,0,len);
      }
       //////////////////////////////
       
       //2 服务器端给予客户端反馈
       OutputStream outputStream = accept.getOutputStream();
         outputStream.write("你好,照片已收到!".getBytes());
       fos.close();
       inputStream.close();
       serverSocket.close();
       accept.close();
       outputStream.close();


  }
}

 

UDP :

package inetAddressTest1;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

/*
UDP 协议的网络编程
*/
public class UDPTest
{
   //发送端
   public void sender() throws Exception {
      DatagramSocket datagramSocket= new DatagramSocket();
      String str="我是UDP方式发送";
       byte[] bytes = str.getBytes();
       InetAddress inetAddress=InetAddress.getLocalHost();//给自己发
       DatagramPacket datagramPacket= new DatagramPacket(bytes,0,bytes.length,inetAddress,9090);//把数据封装到这里面(数据报)
        datagramSocket.send(datagramPacket);//发出去
       datagramSocket.close();
       
  }
   //接收端
   public void receiver() throws Exception
  {
       DatagramSocket socket=new DatagramSocket(9090);
       byte[] buffer=new byte[100];
       DatagramPacket datagramPacket=new DatagramPacket(buffer,0,buffer.length);
       socket.receive(datagramPacket);
       System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength())+"");//也可以buffer
       
       
       
  }
}
 
posted @ 2022-08-02 16:48  zjw_rp  阅读(20)  评论(0)    收藏  举报