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

来源:互联网 发布:js函数返回值return 编辑:程序博客网 时间:2024/05/21 10:13

黑马程序员——Java基础—–网络编程

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

1、IP地址

在互联网上每一台计算机都有唯一的表示自己的标记,这个标记就是IP地址,IP地址是使用32位长度的二进制数据表示如:192.168.1.103。

2.TCP协议和UDP协议的区别

TCP协议面向连接的,而UDP协议时面向非连接的。TCP协议时可靠的传输协议,在传输数据时不会丢失数据。而UDP协议时不可靠的传输协议,在传输数据的过程中容易丢失数据。所以TCP协议传输数据的速度没有UDP协议的速度快

3、InetAddress类

intentAddress类主要是表示Ip地址的中有以下的常用方法:

getByName():通过主机名得到InetAddress对象

getLocalHost():通过本机得到InetAddress对象

getHostName():得到IP地址

isReachable():判断地址是否可以到达,同时指定超时时间

4、TCP程序设计

在java中使用Socket来完成TCP程序开发,使用此类可以方便地建立可靠的,双向的、持续的、点对点的通信连接。

在服务器端用到是ServerSocket类,用于接受客户端地请求。在服务器端每次运行时都要使用accept()方法等待客户端的连接,此方法执行之后服务器端将进入阻塞状态,直到客户端连接之后程序才能继续向下执行。

在客户端,程序可以通过Socket类地getInputStream()方法取得服务器的输出信息,在服务器端可以通过getOutputStream()方法取得客户端地输出信息。
示例:

/* 需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息。 */  //客户端  import java.net.*;  import java.io.*;  class  TcpClient  {      public static void main(String[] args) throws Exception      {          //1、创建客户端的Socket服务。指定目的主机和端口          Socket s=new Socket("127.0.0.1",10000);          //2、获取Socket流中输出流,发送数据          OutputStream out=s.getOutputStream();          out.write("你好!".getBytes());          //3、获取Socket流中的输入流,用来接收服务端的反馈信息并打印          InputStream in=s.getInputStream();          byte[] buf=new byte[1024];          int len=in.read(buf);//读取反馈的数据          //输出接收的数据          System.out.println(new String(buf,0,len));          s.close();//关闭资源      }  }  //服务端  class TcpServer  {      public static void main(String[] args)throws Exception      {          //1、创建服务端的Socket服务,并监听一个端口          ServerSocket ss=new ServerSocket(10000);          //2、通过accept方法获取连接过来的客户端对象。          Socket s=ss.accept();          //获取客户端ip          String ip=s.getInetAddress().getHostName();          System.out.println(ip+"connected....");          //3、获取对应客户端对象的读取流读取发过来的数据,并打印          InputStream in=s.getInputStream();          byte[] buf=new byte[1024];          int len=in.read(buf);          System.out.println(new String(buf,0,len));          //4、调用对应的客户端的输出流写入返回数据          OutputStream out=s.getOutputStream();          out.write("哥们,收到!".getBytes());          //关闭资源          s.close();          ss.close();//可选操作      }  }    

5、UDP程序设计

使用UDP发送数据的数据,对方不一定能接收到。所有的信息使用数据报的形式发送出去,所以这就要求客服端要始终保持着等待接受服务器端发过来的数据,在Java中使用DatagramSocket类和DatargramPacket类来完成程序的开发。

DatagramSocket类来完数据发生的操作,DatagramPacket类来完成数据的包装。

/* udp发送端: 需求:通过udp传输方式,将一段文字数据发送出去。 */  import java.net.*;  class UdpSend   {      public static void main(String[] args)throws Exception       {          //1、创建udp服务。通过DatagramSocket对象          DatagramSocket ds=new DatagramSocket();          //2、确定数据,并封装成数据包。DatagramPacket(byte[] buf, int length, InetAddress address, int port)           byte[] buf="udp shi shen ma".getBytes();          DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.175"),10000);          //3、通过Socket服务,将已有的数据包发送出去。通过send方法。          ds.send(dp);          //4、关闭资源          ds.close();      }  }  /* udp接收端 需求:定义一个应用程序,用于接收udp协议传输的数据并处理。 */  class UdpReceive  {      public static void main(String[] args)throws Exception      {          //1、创建udp Socket服务,建立端点          //DatagramSocket ds=new DatagramSocket(10000);          //一直处于接收状态          while(true)          {              //1、创建udp Socket服务,建立端点              DatagramSocket ds=new DatagramSocket(10000);              //2、定义数据包。用于存储数据              byte[] buf=new byte[1024];              DatagramPacket dp=new DatagramPacket(buf,buf.length);              //3、通过Socket服务的receive方法将接收到的数据存入数据包中              ds.receive(dp);//阻塞式方法              //4、通过数据包的方法获取其中的数据              String ip=dp.getAddress().getHostName();              String data=new String(dp.getData(),0,dp.getLength());              int port=dp.getPort();              System.out.println(ip+"::"+data+"::"+port);              //5、关闭资源              ds.close();          }          //5、关闭资源          //ds.close();      }  }  

下面是学习过程中,做过的几个小练习:
练习一:

/* 需求:并发上传图片 */  import java.io.*;  import java.net.*;  //客户端  class  PicClient  {      public static void main(String[] args) throws Exception      {          //对传入的值进行判断          if (args.length!=1)          {              System.out.println("请指定一个图片文件!");              return;          }          File file=new File(args[0]);          //对文件路径进行判断          if (!(file.exists()&&file.isFile()))          {              System.out.println("你上传的文件有问题,非文件或者不存在!");              return;          }          //判断是否是图片文件          if (!file.getName().endsWith(".jpg"))          {              System.out.println("图片格式错误,请重新选择!");              return;          }          //对文件大小进行判断          if (file.length()>1024*1024*5)          {              System.out.println("你上传的文件过大,居心叵测!");              return;          }          //创建服务          Socket s=new Socket("localhost",10000);          //读取图片数据          FileInputStream fis=new FileInputStream(file);          //用Socket服务输出流写入数据          OutputStream out =s.getOutputStream();          BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));          byte[] buf=new byte[1024];          int len=0;          while ((len=fis.read(buf))!=-1)          {              out.write(buf,0,len);          }          //结束标记,表示文件数据已经上传完了          s.shutdownOutput();          String info=in.readLine();//读取返回信息          System.out.println(info);          fis.close();//关流          s.close();      }  }  //服务端  class PicServer  {      public static void main(String[] args)throws Exception      {          //创建服务,监听端口          ServerSocket ss=new ServerSocket(10000);          while (true)          {              //获取客户端对象              Socket s=ss.accept();              //客户端执行线程              new Thread(new PicThread(s)).start();          }          //ss.close();      }  }  //利用多线程实现并发上传  class PicThread implements Runnable  {      private Socket s;      PicThread(Socket s)      {          this.s=s;      }      public void run()      {          int count=1;          //获取客户端ip          String ip=s.getInetAddress().getHostAddress();          try          {                     System.out.println(ip+"  connected.....");              //通过客户端的读取流读取数据              InputStream in=s.getInputStream();              //文件保存路径              File dir =new File("C:\\Users\\asus\\Desktop");              //文件名              File file=new File(dir,ip+".jpg");              //判断文件是否存在              while(file.exists())              {                  file=new File(dir,ip+"("+(count++)+").jpg");              }              //将数据写入到指定文件中              FileOutputStream fos=new FileOutputStream(file);              byte[] buf=new byte[1024];              int len=0;              while ((len=in.read(buf))!=-1)              {                  fos.write(buf,0,len);              }              //将收到图片数据的信息返回给客户端              OutputStream out=s.getOutputStream();              out.write("上传成功!".getBytes());              fos.close();//关流              s.close();          }          catch (Exception e)          {              throw new RuntimeException(ip+"图片上传失败");          }      }  }  

练习二:

import java.io.*;  import java.net.*;  //客户端  class  LoginClient  {      public static void main(String[] args) throws Exception      {          //创建服务          Socket s=new Socket("localhost",10000);          //键盘录入          BufferedReader br=new BufferedReader(new InputStreamReader(System.in));                      //用Socket服务输出流写入数据          PrintWriter out =new PrintWriter(s.getOutputStream(),true );            //接收服务器返回的信息          BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));            String line=null;            for(int x=0;x<3;x++)          {              line=br.readLine();//读取键盘录入              if (line==null)              {                  break;//如果键盘没有输入,则直接结束              }                out.println(line);//将数据写入流中                String info=in.readLine();//读取返回信息                System.out.println(info);                if (info.contains("欢迎"))//---------------              {                  break;//如果登录成功,就跳出循环              }          }            br.close();//关流          s.close();      }  }    //服务端  class LoginServer  {      public static void main(String [] args)throws Exception      {          //创建服务,监听端口          ServerSocket ss=new ServerSocket(10000);                    while (true)          {              //获取客户端对象              Socket s=ss.accept();                        //客户端执行线程              new Thread(new LoginThread(s)).start();          }                    //ss.close();      }  }    //利用多线程实现并发登录  class LoginThread implements Runnable  {      private Socket s;      LoginThread(Socket s)      {          this.s=s;      }      public void run()      {          //获取客户端ip          String ip=s.getInetAddress().getHostAddress();          System.out.println(ip+"  connected.....");          try          {                     for (int x=0;x<3 ;x++ )              {                     //通过客户端的读取流读取数据                  BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));                                    //读取数据库中的数据,这里用文件来表示数据库                  BufferedReader br=new BufferedReader(new FileReader("users.txt"));                    String line=in.readLine();//读取客户端数据                  if (line==null)//--------------                  {                      break;//如果客户端没有发送数据,则跳出循环                  }                  String data=null;                  boolean flag=false;//设置标记                  //读取数据库中的用户数据                  while ((data=br.readLine())!=null)                  {                      if (line.equals(data))                      {                          flag=true;//如果用户存在,则将标记设为true                          break;                      }                  }                    //将数据写入到指定文件中                  PrintWriter out=new PrintWriter(s.getOutputStream(),true);                    if (flag)                  {                      System.out.println(line+",已登陆!");                                            out.println(line+",欢迎光临!");                        break;//-----------                  }                  else                  {                      System.out.println(line+",尝试登陆!");                      out.println(line+",用户名不存在!");                  }                 }              s.close();//关流          }          catch (Exception e)          {              throw new RuntimeException("用户登陆失败");          }         }  }  
0 0
原创粉丝点击