黑马程序员-网络

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

网络编程:

UdpTcp特点:

      Udp:将数据集源和目的封装成数据包中,不需要建立连接

                 每个数据包的大小限制在64k内

                 因无连接,是不可靠协议

                不需要建立连接,速度快

     Tcp:建立连接,形成传输数据的通道

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

               通过三次握手完成连接,是可靠协议

               必须建立连接,效率会稍低

UDP传输实现:

   建立发送服务,将数据封装在包中,在包中指定目的地址ip和端口号,发送

建立接收服务(指定监听的端口),定义用于接收数据的包,receive数据。通过包中的定义的方法取数据。

定义UDP发送端:

   1.       建立UDPSocket服务(DatagramSocket),自动分配一个端口号

   2.       将数据变成byte数组,将数组封装的数据包(DatagramPacket)中

   3.       通过Socket服务发送数据包,指定服务器地址和接收的端口号

   4.       关闭资源

定义UDP接受端:

   1.       建立UDPSocket服务(DatagramSocket,(通常会监听一个端口,其实就是给这个网络应用程序定义数字标识,方便于明确那些数据过来应应用程序可以处理,此端口对应于服务发送端的端口)

   2.定义一个数据包,因为要存储接收到的字节数据,因为数据包对象中有更多功能可以提取字节数组中的不同数据信息。

   3.通过Socket服务的receive方法(阻塞式方法)将接收的到的数据存入已定义好的数据包中(DatagramPackett

   4.通过DatagramPacket中的定义的方法,将数据取出。

   5.关闭资源。

UDP键盘录入式数据:

   1BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

UDP聊天程序:

   有收数据和发数据的部分,这两个部分需要同时执行:

   1、分别将发送和接收封装到两个类中,

TCP传输实现:

   建立客户端Socket指定连接的主机和端口,形成连接通道,通过获取Socket中的读写流传输数据(服务器端首先要通过ServerSocket获得客户端Socket对象,进行读写操作)

定义TCP客服端:

   1、  创建Socket服务,并指定要连接的主机和端口。

   2、  获取socket流中的输入流和输出流进行数据的发送和接收。

定义TCP服务端:

   1、  创建ServerSocket服务,并监听端口

   2、  获取连接过来的socket客服端对象,通过ServerSocketaccept()方法,没有连接就会等,所以这个方法是阻塞式的

   3、  客服端如果发过来数据,那么服务端要使用对应的客服端对象,并获取该对象的读取流来读取发过来的数据,

   4、  关闭客户端,关闭服务器(可选)

 传输键盘录入:

   1BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

   2、写入读取的一行数据后,结束标识(换行符)并没有写入,读取没读到结束标识(换行符),所以等待

 TCP文件上传:

   注意:

   1、使用BufferedReader等流对象进行装饰后读取时,注意是否读到结束标识,(而写入时并没有把结束标识写进流中。)

   2、关闭此套接字也将会关闭该套接字的 InputStream OutputStream

 TCP图片上传:同文件上传

   当使用PrintWriter时,构造中加入boolean,自动刷新。否则要手动刷新。

   BufferedWriter没有自动刷新功能

 TCP并发上传图片:

   将上传的动作进行封装线程,

TCP并发登陆:

   自定义服务器:浏览器客户端(获取浏览器发的http头信息)

   自定义客户端:tomcat服务器端

java.netURL类。URLConnection连接对象通过指定的URL连接,封装了协议,可解析协议。如:封装http协议后可解析去掉响应消息头。

 TCP练习:

package org.cc.tcp;

import java.net.*;
import java.io.*;
//Tcp并发上传图片
class TCPPicBC {//客服端上传图片
 public static void main(String[] args) throws Exception {
  Socket s = new Socket("110.186.55.142", 10001);
  File f = new File("C:" + File.separator + "chen.jpg");
  FileInputStream fis = new FileInputStream(f);

  OutputStream os = s.getOutputStream();

  byte[] b = new byte[1024];
  int len = 0;
  while ((len = fis.read(b)) != -1) {
   os.write(b, 0, len);
  }
  s.shutdownOutput();
  BufferedReader br = new BufferedReader(new InputStreamReader(s//接收服务器端的消息
    .getInputStream()));
  String line = null;
  line = br.readLine();
  System.out.println(line);
  fis.close();
  s.close();
 }
}
//服务器端接收图片发送消息
class TCPThread implements Runnable {
 private Socket s;

 public TCPThread(Socket s) {
  this.s = s;
 }

 public void run() {
  try {
   InputStream is = this.s.getInputStream();
   File f = new File("D:" + File.separator + "chen.jpg");
   int count = 0;
   while (f.exists()) {
    f = new File("D:" + File.separator + "chen(" + (++count)
      + ").jpg");
   }
   FileOutputStream fos = new FileOutputStream(f);
   byte[] b = new byte[1024];
   int len = 0;
   while ((len = is.read(b)) != -1) {
    fos.write(b, 0, len);
   }
   PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
   pw.println("上传成功");
   pw.close();
   fos.close();
   this.s.close();
  } catch (Exception e) {
   throw new RuntimeException("上传失败");
  }
 }
}
//测试类
class TCPPicBS {
 public static void main(String[] args) throws Exception {
  ServerSocket ss = new ServerSocket(10001);
  while (true) {
   Socket s = ss.accept();
   new Thread(new TCPThread(s)).start();
  }
 }
}

UDP练习:

package org.cc.udp;

import java.net.DatagramSocket;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.io.InputStreamReader;
import java.io.BufferedReader;
/*
 * 聊天程序:即可接收数据又可以发送数据
 * 接收和发送同时执行
 */
class Send implements Runnable {//发送消息线程类
 private DatagramSocket ds;

 public Send(DatagramSocket ds) {
  this.ds = ds;
 }
 @Override
 public void run() {
  try {
   BufferedReader br = new BufferedReader(new InputStreamReader(
     System.in));
   String line = null;
   while ((line = br.readLine()) != null) {
    if ("886".equals(line))
     break;
    byte[] b = line.getBytes();
    DatagramPacket dp = new DatagramPacket(b, b.length, InetAddress
      .getByName("110.186.89.80"), 10002);
    ds.send(dp);
   }
  } catch (Exception e) {
   throw new RuntimeException("send failed");
  }
 }
}
class Reciev implements Runnable {//接收消息线程类
 private DatagramSocket ds;
 public Reciev(DatagramSocket ds) {
  this.ds = ds;
 }
 @Override
 public void run() {
  while (true) {
   try {
    byte[] b = new byte[1024];
    DatagramPacket dp = new DatagramPacket(b, b.length);
    ds.receive(dp);
    String ip = dp.getAddress().toString();
    String data = new String(dp.getData(), 0, dp.getLength());
    System.out.println(ip + ":::" + data);
   } catch (Exception e) {
    throw new RuntimeException("reciev failed");
   }
  }
 }
}
//测试类
public class UDPQQDemo {
 public static void main(String[] args) throws Exception {
  DatagramSocket ds = new DatagramSocket();
  DatagramSocket dr = new DatagramSocket(10002);
  new Thread(new Send(ds)).start();
  new Thread(new Reciev(dr)).start();

 }
}

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

详细请查看:http://edu.csdn.net/heima

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值