为黑马奋斗的日子--网络编程

 


---------------------- android培训java培训、期待与您交流! -------------------

UDP协议与TCP协议
     UDP协议:分为发送端和接收端
              特点:全名是用户数据报协议 比如(QQ,聊天工具,发送短信)
                    是非面向连接 就是在发送前不用和对方建立连接,这也导致发送的数据可能会丢失
                    它不为IP提供可靠性,而且它的传输数据一次不能超过64k,但是它的传输速度非常快
              接收端只能接收不能给发送端反馈信息
              发送端: 要定义DatagramSocket对象,拿到要传输数据后,将它打成byte类型数组
              在定义DatagramPacket对象,在对象中写入数据,数据长度,要传输的对象Ip,Ip的端口号
              最后用DatagramSocket对象中的send方法发送出去
              接收端:也要先定义DatagramSocket对象,要在对象中写入端口号要和发送端写入的一致
              定义byte数组(缓存) 在定义DatagramPacket对象 在对象中写入数组和数组长度
              在用DatagramSocket对象中receire方法接收发送端发送的数据 并将它和ip输出
     TCP协议:分为客户端和服务端
              特点:  全名是传输控制协议 比如(打电话)
                     是面向连接的 就是说要和谁发送数据就要先和对方建立连接,一般会分为3个步骤
                     1.客户端会向服务端发送请求:你在吗?2.服务端如果在会向客户端返回信息 我在
                     3.客户端接到服务端的信息就会在此发送请求:那我发送数据啦 这样连接就建立好了
                     TCP协议因为这样的特点数据的安全性很高,它会给IP提供可靠性也可以传送很大的数据
                     但它的速度较慢
              服务端:除了接受客户端的数据也可以给客户端反馈数据
              在客户端中要先定义Socket对象把你要传输的ip和端口写入其中,在定义io输入流来读取要传输
              的数据和定义io输出流来发送数据,其中Reader是读取数据而Writer是发送数据 最后可以再定义
              一个输入流来读取用户端反馈的信息
              服务端:定义ServerSocket对象写入端口号,在用ServerSocket对象中accept方法获取Socket对象
                      然后就是定义io流了 先定义输入流来读取客户端发送的数据 在这里如果是字节流那么就
                      要先定义byte数组,和一个int变量来拿到数组的长度 如果是字符流就定义String来接收
                      如果要输出就再把它放入到一个byte数组中
      一般的情况下会把UDP中发送端和接收端通过实现Runnable来创建线程可以多次传输,在TCP中也可以把服务端
      建立线程 可以实现一个服务端对应多个客户端的请求,这也是现在网站浏览的框架        
   补充:telnet--windows上用于连接远程服务端命令        
  代码:
       功能:用UDP协议来实现多次传输
     -----------------------------华丽丽的分割线------------------------
    /**
 * 功能:用UDP协议来进行多次传输
 */
package com.text8;
import java.net.*;
import java.io.*;
public class Text4 {
   
  public static void main(String args[])throws Exception{
   //在主体函数中启动线程
   new Thread(new Fasong(new DatagramSocket())).start();
   new Thread(new Jieshuo1(new DatagramSocket(54545))) .start();
  }
 }

class Fasong implements Runnable{
  private DatagramSocket ds;
  public Fasong(DatagramSocket ds){
   this.ds=ds;
  }
  public void run(){
   //定义输入流来读取输入到键盘上的值
   BufferedReader buf=
    new BufferedReader(new InputStreamReader(System.in));
   while(true){
   try {
      byte[] as=(buf.readLine()).getBytes();
      //定义DatagramPacket对象给192.168.0.12传输数据
   DatagramPacket dp=
    new DatagramPacket(as,as.length,InetAddress.getByName("192.168.0.12"),54545);
   if("886".equals(as)){
    break;
   }   
   //使用send方法进行传输
   ds.send(dp);
   } catch (Exception e) {
   e.printStackTrace();
  }
   }
   //关闭DatagramSocket对象
   ds.close();
  
  }
}
//接收端
class Jieshuo1 implements Runnable{
 private  DatagramSocket ds;
 public Jieshuo1(DatagramSocket ds){
   this.ds=ds;
 }
 public void run(){
  //用byte数组来接收发送端发送的数据 (不能大于64k)
  byte[] arr=new byte[1024];
  DatagramPacket dp=new DatagramPacket(arr,arr.length);
  try {
   while(true){
   //用receiveff接收
   ds.receive(dp);
   String ip=dp.getAddress().getHostAddress();
   String data=new String(dp.getData(),0,dp.getLength());
   int prot=dp.getPort();
   //从dp中拿到数据并输出在控制台上
   System.out.println("IP为"+ip+"数据为"+data+"端口号为"+prot);
   }
   } catch (IOException e) {
  
   e.printStackTrace();
  }
     ds.close();
 }
}          
--------------------------------华丽丽的分割线--------------------------------
  TCP协议:
   /**
 * 功能:使用TCP实现用户名登陆
 *       1.客户端通过键盘输入用户名 服务端对这个用户名进行验证
 *       2.如果登陆存在 则在 服务器上显示*** 已登录 在客户端显示*** 欢迎你
 *       3.如果该用户不存在存在, 在服务端显示**** 正在尝试登陆
 *         在客户端上显示*** 该用户不存在
 *       4.最多只能登陆3次       
 *    
 */
package com.text7;
import java.io.*;
import java.net.*;
public class Text9 {
    
 public static void main(String args[]) throws Exception{
  Socket s=new Socket("192.168.0.12",9852);
  //定义输入流来拿到键盘上的值
  BufferedReader buf=
   new BufferedReader(new InputStreamReader(System.in));
  //定义输出流来给服务端发送数据 --用户名
  PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
  //定义输入流来获取服务端发送的数据
  BufferedReader buff=
   new BufferedReader(new InputStreamReader(s.getInputStream()));
     //用循环来控制发送次数
  for(int i=0;i<3;i++){
      String as="";
      if(as==null){
       break;
      }
      pw.println(as);
      String as1=buff.readLine();
      System.out.println(as1);
      //如果服务端发来有“欢迎”字眼说明登陆成功
      if(as1.contains("欢迎")){
          break;
       }
     
     }
  //关闭键盘输入流
     buf.close();
     //关闭socket对象
     s.close();
 }
}
//声明线程用来可以接受多个客户端的数据
  class Duodian implements Runnable{
   private Socket s;
   public Duodian(Socket s){
    this.s=s;
   }
   public void run(){
        for(int i=0;i<3;i++){
         try {
          //定义输入流来拿到客户端的数据
    BufferedReader buf=
     new BufferedReader(new InputStreamReader(s.getInputStream()));
      // 定义输入流来拿到本机上的数 好和客户端的数据进行比较
    BufferedReader buff=
        new BufferedReader(new FileReader("d:\\synchronized.txt"));
       //定义输出流来给客户端反馈数据
    PrintWriter out=new PrintWriter(s.getOutputStream(),true);
       //拿到并输出连接的客户端IP
    String ip=s.getInetAddress().getHostAddress();
       System.out.println(ip="......connected");
       String as="";
       String name=buf.readLine();
       //定义一个标记用来判断
       boolean flot=false;
       while((as=buf.readLine())!=null){
          if(name.equals(as)){
           flot=true;
           break;
          }
       }
       if(flot){
        System.out.println(name+"已登录");
        out.println("欢迎光临"+name);
        break;
       }else {
        System.out.println(name+"正在尝试登陆");
        out.println(name+"不存在");
        break;
       }
         } catch (Exception e) {
    e.printStackTrace();
    System.out.println("判断失败!");
   }
        }
   }
  }

class ServerText9{
 
  public static void main(String args[]) throws Exception{
   ServerSocket ss=new ServerSocket(9852);
   while(true){
   Socket s=ss.accept();
   //启动服务端线程
   new Thread(new Duodian(s)).start();
   }
   }
}      
希望看的各路好友多提宝贵意见!让我可以查漏补缺~~

 

 

 

------------------------- android培训java培训、期待与您交流! ----------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值