黑马程序员__网络编程

来源:互联网 发布:fc2最新视频域名 编辑:程序博客网 时间:2024/05/27 00:46

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

 

 

 

 

UDP
 将数据及源和目的封装成数据好中,不需要建立连接
 每个数据报的大小在限制在64k内
 因无连接,是不可靠协议
 不需要建立连接,速度快
TCP
 建立连接,形成传输数据的通道
 在连接中进行大数据量传输
 通过三次握手完成连接,是可靠协议
 必须建立连接,效率会稍低

 

            UDP案例


需求:通过udp传输方式,将一段文字数据发送出去。。

 定义一个应用程序,用于接收UDP协议传输数据并处理
 
 
 定义udp接收端
  思路:
 1.定义udpsocket服务,通常都监听一个端口,其实就是给这个接收网络应用程序定义一个数字标识。
 方便与明确哪些数据过来应该用程序可以处理
   2.定义一个数据包,因为要存储接收到的字节数据,因为数据包对象中有更多功能提取字节数据中的不同数

据信息。
 3.通过socket服务的receive()方法将受到的数据存入定义好的数据包中。
 4.通过数据包对象的特有功能,将这些不同的数据提取出,打印在控制台上。
  5.关闭资源。

import java.net.DatagramPacket;
import java.net.DatagramSocket;

class UdpReceive {
 
 public static void main(String[] args) throws Exception{
 
  //1.创建UDP的socket服务。 建立端点
  DatagramSocket ds = new DatagramSocket(10001);
  
  //2定义一个数据包,用于存储数据。
  byte[] buf = new byte[1024];
  DatagramPacket dp = new DatagramPacket(buf,buf.length);
  
  //3通过服务的receive方法将收到的数据存入数据包中。
  ds.receive(dp);//阻塞式方法。
  //4.通过数据包的方法获取其中的数据。
  String ip = dp.getAddress().getHostAddress();
  String data = new String(dp.getData(),0,dp.getLength());
  int port = dp.getPort();
  
  System.out.println(ip +"...."+data+ "...."+port);
  ds.close();
  
  
 }
 
}

 

 

 定义了发送端。
  思路:
 1.建立updsocket服务。
  2.提供数据,并将数据封装到数据包中。
 3.通过socket服务的发送功能,将数据包发出去。
 4.关闭资源。


import java.net.*;
import java.io.*;

public class UdpSend {

 public static void main(String[] args) throws Exception {
  
  //1.创建udp服务。通过DatagramSocket对象。
  DatagramSocket ds = new DatagramSocket();
  
  
  BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  
  String line = null;
  while((line=bufr.readLine())!=null){
   
   //2确定数据,并封装成数据包。
   byte[] data = line.getBytes();
   DatagramPacket dp = new DatagramPacket(data,data.length,InetAddress.getByName

("192.168.1.224"),10001);
   //3.通过socket服务,将已有的数据包发送出去,通过send方法。
   ds.send(dp);
  }
  
  
  
  
  //关闭资源
  //ds.close();

 }

}

 

          TCP案例

  

需求:建立一个文本转换服务器。
客户端给服务端发送文本,服务端会将文本转换成大写返回给客户端。
而且客户端可以不断的进行文本转换。当客户端输入over时转换结束。
 
分析:
   客户端:
   既然是操作设备上的数据,那么就可以使用io技术,并按照io的操作规律思考。
   源:键盘录入
   目的:网络设备,网络输出流。
   而且操作的是文本数据。可以选择字符流。
 
步骤:
   1.建立服务。
   2.将取键盘录入
   3.将数据发给服务端。
   4.后去服务端返回大写数据。
   5.结束,关闭资源。
 
  都是文本数据,可以使用字符流进行操作,同时可以提高效率,加入缓冲。

客户端:

import java.net.*;
import java.io.*;

public class TransTextClient {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  
  try {
   //建立Socket服务
   Socket s = new Socket("118.230.3.62",10008);
   //键盘录入
   BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
   
   //自定义的,将数据写入到socket输出流,发给服务端
   //BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter

(s.getOutputStream()));
   PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
   
   
   //定义一个socket读取流,读取服务端返回的大写信息
   BufferedReader bufIn = new BufferedReader(new InputStreamReader

(s.getInputStream()));
   
   String line = null;
   while((line = bufr.readLine())!=null){
    
    if("over".equals(line))
     break;
    pw.println(line);
//     bufw.write(line);
//     bufw.newLine();
//     bufw.flush();
     
     String str = bufIn.readLine();
     System.out.println("server:" + str);
   }
   
   bufr.close();
   s.close();
   
  } catch (UnknownHostException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

 }

}

服务端:


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TransTextServer {
 
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  
  try {
   
   ServerSocket ss = new ServerSocket(10008);
   
   Socket s = ss.accept();
   
   String ip = s.getInetAddress().getHostAddress();
   System.out.println(ip + "....cennected.");
   //读取socket读取流当中的数据
   BufferedReader bufI = new BufferedReader(new InputStreamReader

(s.getInputStream()));
   
   //目的。socket输出流将大写数据写入到socket输出流并发送给客户端
   //BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter

(s.getOutputStream()));
   PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
   
   
   String line = null;
   while((line = bufI.readLine())!=null)
   {
    pw.println(line.toUpperCase());
//    bufOut.write(line.toUpperCase());
//    bufOut.newLine();
//    bufOut.flush();
   }
   
   s.close();
   ss.close();
   
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  

 }

}


 * 该例子出现的问题。
 * 现象:客户端和服务端都在莫名的等待。
 * 为什么呢》?
 * 因为客户端和服务端都有阻塞式的方法。这些方法么没读到结束标记。那么就一直等。而导致两端都在等待。

    那我这里加了简单的if("over".equals(line)) break;语句了。


 

 

 

 

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

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

原创粉丝点击