黑马程序员---java网络编程学习总结

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ---------------------- 
  java网络编程学习总结:
  1.在ISO网络参考模型中,我们java编程主要在传输层和应用层上操作;
  2.在传输层上我们要用到两个传输协议: TCP协议UDP协议
  3.TCP协议的特点:TCP协议是 面向连接的,可以 传输大数据量的, 可靠的传输,TCP保证可靠传输是通过 三次握手数据重发
  4.UDP协议的特点:UDP是 面向无连接的, 不可靠的数据传输协议,它采用数据报的形式发送数据,其发送数据前不必握手,其 传输效率高于TCP协议
  5.java中封装了网络操作相关的类库,这个类库是 java.net类库
  6.在java.net类库中我们常用的类有: InetAddressDatagramPacket, DatagramSocket, Socket, ServerSocket, URL, URLConnection.
  7.除了URL类和URLConnection类外,其它类都工作在 传输层,这两个类工作在应用层,它对底层的一些操作进行了封装,所以操作相比传输层上的那些类更简单些,
   URL类和URLConnection类使用TCP协议 ,因此他们是 可靠的传输
  8.在网络上进行通信的 计算机都有一个IP地址,IP地址标识了 计算机在网络上的位置,是计算机在 网络上的身份证,通过IP地址,世界上任意两台计算机就可以进行相互
    通信了,Java中 InetAddress类对IP地址相关的操作进行了封装,我们可以把InetAddress类的实例对象看作计算机在网络上地址。
 9.DatagramPacket类和DatagramSocket类共同完成了UDP通讯,DatagrammPacket类封装了两台计算机 通信的数据实体,即要通讯的内容,DatagramSocket类 通过InetAddress类
    的实例对象将要通讯的数据实体发送到目的地
10.Socket类可以进行TCP通讯,他是 基于流进行数据传输的,被传输的 数据大小没有限制,在传输前,会和要通讯的计算机 握手三次,以保证连接的正常建立,传输过程中 设定计时器
    当某个ip数据包到达计时器设定的阀值时仍 未收到远程计算机发来的响应即认为这个ip数据包丢失,然后 重新发送这个ip数据包,这样保证了数据在传输过程中 不会出现丢包现象。
 
以下是网络编程的简单示例:
 简单的UDP聊天程序,这个客户端只能发送不能接收:

/**
 * 本示例演示UDP通讯的基本步骤:首先建立服务端,并监听一个端口
 * 接着建立客户端,通过服务端监听的端口和服务端进行通讯。建立服务
 * 端和客户端都用到了DatagramSocket类,DatagramSocket类本身既可以
 * 当服务端又可以当客户端,当被当作客户端时,用到了他的send函数来
 * 发送消息,当被当作服务端时,用到了他的receive函数接受消息。无论是
 * 发送还是接受消息,消息体都用Datagrampacket进行了封装。
 * 
 */
class UDPClient implements Runnable {// 客户端程序

 public void run() {

  try {
   DatagramSocket ds = new DatagramSocket();
   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
   
   while (true) {
    System.out.println("客户端--请输入聊天内容:");
    
    byte[] sendbuff = br.readLine().getBytes();
    ds.send(new DatagramPacket(sendbuff, sendbuff.length,
      InetAddress.getLocalHost(), 4073));//发送消息给服务端
      
        if("end".equals(new String(sendbuff)){
        System.out.println("客户端即将退出。。。。")
        return;
        }

   }
  } catch (Exception e) {
    System.out.println("连接服务端失败,开启或重启服务端!");
   e.printStackTrace();
  }

 }

}


class UDPServer implements Runnable {// 服务端程序

 public void run() {
  try {
   DatagramSocket ss = new DatagramSocket(4073);

   while (true) {
    byte[] recbuff = new byte[1024];
    ss.receive(new DatagramPacket(recbuff, 1024));//从客户端接受消息
    
    if ("end".equals(new String(recbuff).trim())) {
     System.out.println("服务端即将关闭。。。。");
     ss.close();
     return;
    }

    System.out.println("服务器端--客户端输入的内容为:" + new String(recbuff));
   }

  } catch (Exception e) {
      System.out.println("服务端开启失败,请查看端口确保服务端端口未被占用");
      e.printStackTrace();
  }

 }
}


 简单的TCP聊天程序:

/**
 * 本例演示了TCP协议通讯的基本步骤:首先创建服务端,
 * 接着创建客户端,通过服务端绑定的端口和服务端进行通讯。
 * 创建服务端用到了ServerSocket,它监听构造它时给他的端口号
 * 当有客户端尝试连接这个端口时,ServerSocket的accpet函数就会
 * 返回客户端连接的套接字,通过客户端连接的套接字就可以和客户
 * 端进行通信,当没有客户端尝试连接时,accpet函数会一直阻塞,
 * 因此当有多个客户端尝试连接服务端时,不能在一个线程中进行
 * 与客户端的通讯,对每个客户端的通讯都要开启一个独立的线程
 * ,否则会因为accpet函数的阻塞导致与客户端通讯的阻塞。
 * 
 */
class TCPClient extends Thread {// TCP客户端程序

 private void TCPClientStart() throws Exception {
  Socket cs = new Socket(InetAddress.getLocalHost(), 3790);//建立客户端socket
  
  BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
    cs.getOutputStream()));//发送消息的通道
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//输入消息的通道
  String msg=null;
  while (true) {
   System.out.println("客户端---请输入消息内容:");
   msg=br.readLine();
   bw.write(msg + "\n");//将从键盘接收的消息通过发送通道发送给服务端
   bw.flush();
   
    if("end".equals(msg.trim())){
       return;//输入end时结束客户端
    }
  }

 }

 public void run() {
  try {
   TCPClientStart();
  } catch (Exception e) {
      System.out.println("连接服务器失败,请重试。。。。");
   e.printStackTrace();
  }
 }
}

class TCPServer extends Thread {// TCP服务端程序

 private void TCPServerStart() throws Exception {
  ServerSocket ss = new ServerSocket(3790);// 绑定3790端口
  Socket cs = ss.accept();//从被监听端口获取客户端连接套接字
  
  System.out.println("服务端已启动,正在等待客户端发送消息");
  BufferedReader br = new BufferedReader(new InputStreamReader(
    cs.getInputStream()));//从客户端接收消息的通道
  String msg=null;
    
  while (true) {
   msg=br.readLine();
   if("end".equals(msg.trim())){
       return;//接收到end时结束服务端
   }
   System.out.println("服务端---接收到消息:" + msg);
  }
 }

 public void run() {
  try {
   TCPServerStart();
  } catch (Exception e) {
      System.out.println("服务端开启失败,请重试")
   e.printStackTrace();
  }
 }

}

 

简单的TCP文件传输示例:

/**
 * 本例演示了文件上传,文件上传的原理和聊天程序是
 * 一样的,都是通过读取套接字流中的数据来实现的。
 */
class FileClient extends Thread {// 文件上传客户端

 private void fileUpload() throws Exception {
     
  Socket cs = new Socket(InetAddress.getLocalHost(), 3600);//创建客户端socket
  
  FileInputStream fis = new FileInputStream("C:\\test.jpg");
  BufferedOutputStream bos = new BufferedOutputStream(
    cs.getOutputStream());//打开文件上传通道
    
  byte[] sendbuff = new byte[1024];// 1K缓冲区
  int len=0;
  while ((len=fis.read(sendbuff))!= -1) {
   bos.write(sendbuff,0,len);//上传文件
  }
  fis.close();
  cs.close();
 }

 public void run() {
  try {
   fileUpload();
  } catch (Exception e) {
   System.out.println("开启客户端失败,请重试。。。。");
   e.printStackTrace();
  }
 }
}

class FileServer extends Thread {// 文件上传服务端

 private void fileServer() throws Exception {
  ServerSocket ss = new ServerSocket(3600);//服务端Socket
  Socket cs = ss.accept();
  BufferedInputStream bis = new BufferedInputStream(cs.getInputStream());//文件接收通道
  FileOutputStream fos = new FileOutputStream("E:\\test.jpg");
  
  byte[] recbuff = new byte[1024];// 1K缓冲区
  int len=0;
  while ((len=bis.read(recbuff)) != -1) {
   fos.write(recbuff,0,len);
  }
  fos.close();
  ss.close();
 }

 public void run() {
  try {
   fileServer();
  } catch (Exception e) {
  System.out.println("服务端开启失败,请重试。。。。");
   e.printStackTrace();
  }
 }
}


URL类和URLConnection类的应用示例

/**
 * URLConnection和URL类功能强大,其中封装了很多
 * 和网络操作相关的方法,包括浏览器协议相关的操作
 * ,很强大,本例只做演示,仅用到了基本的流操作,
 * 通过URL类的openConnection方法获取和远程资源的连接
 * 再通过URLConnection的openInputstream方法得到和读取
 * 远程资源的流,再从流中读取想要读取的数据。
 */
class URLConn extends Thread {
    
 public void run() {
  try {
   URLConnDemoStart();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 private void URLConnDemoStart() throws Exception {
     
  URL url = new URL("http://www.baidu.com");//用给定的网址创建URL
  BufferedReader bis = new BufferedReader(new InputStreamReader(
    url.openConnection().openInputStream());//通过URL打开读取流
    
 String context=null;
 while((context=bis.readLine)!=null)
  System.out.println(context);//打印从流中获取的内容
 }

}

 


---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------
详细请查看:www.itheima.com

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值