java基础之网络套接字编程

来源:互联网 发布:三中三用7.12.22.9算法 编辑:程序博客网 时间:2024/05/22 06:40

 

 

UDP通信

   >将数据及源和目的封装在数据包中,不需要建立连接

   >每个数据报的大小限制在64k以内

   >因为无连接,是不可靠传输。QQ输天

   >不需要建立连接,速度快,效率高

  UDP套接字编程:

package Socket;
import java.io.IOException;
import java.net.*;

/**
 *
 * @author Administrator
 * 需求:通过Udp转输方式,将一段文字发送出去
 *  思路:
 *  1、建立UdpSocket服务
 *  2、提供数据,并将数据封装到数据包中
 *  3、通过Socket服务功能,将数据包发出去
 *  4、关闭资源
 */
public class UdpSend {
  public static void main(String[] args) throws IOException {
  //1、创建udp服务,通过DatagramSocket 对象
  DatagramSocket socket = new DatagramSocket(8888);
  
  //2、确定数据,并封装成DatagramPacket数据包(字节数组)
  byte[]data = "udp ,哥们儿来了!".getBytes();
  DatagramPacket packet = new DatagramPacket(data,data.length,InetAddress.getByName("192.168.0.12"),1000);
  
  //3、通过Socket服务将已有的数据包发送出去。通过send方法
  socket.send(packet);
  
  //4、关闭
  socket.close();
 }

/**
 *
 * @author Administrator
 * 需求:定义一个应用程序,用于接收并处理upd数据
 * 思路:
 * 1、建立udpSocket服务
 * 2、定义数据包
 * 3、通过socket服务中的receive方法将接收到的数据存入定义好的数据包中
 * 4、通过数据包对象的特有功能,将这些不同的数据提取出来
 * 5、关闭资源
 */
class UdpReceive{
 public static void main(String[] args) throws IOException {
  //1、创建udpSocket服务 ,通常会监听一个端口
  DatagramSocket socket = new DatagramSocket(1000);
  
  //2、定义数据包,用于存储数据
  byte []data = new byte[1024];
  DatagramPacket packet = new DatagramPacket(data,data.length);
  
  //3、通过receive方法将接收到的数据放到定义好的数据包中
  socket.receive(packet);
  
  //4、通过数据包中的方法获取其中的数据
  String ip = packet.getAddress().getHostAddress();
  String str = new String(packet.getData(),0,packet.getLength());
  int port = packet.getPort();
  
  System.out.println("ip:"+ip);
  System.out.println("data:"+str);
  System.out.println("port:"+port);
  socket.close();
 }
}

 

 TCP通信

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

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

  >通过三次握手建立连接,可靠传输。下载文件

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

TCP套按字编程:

package Socket;
import java.net.*;
import java .io.*;

/**
 * 需求:建立一个文本转换服务器。客户端给服务端发送文本,服务端会将文本转换成大写再返回给客户端,
 * 而且客户端可以不断地进行文本转换,当客户端输入over时,转换结束。
 *
 */
public class TcpDemo2 {
 public static void main(String[] args) {
  
 }
}

/**
 * 客户端分析:
 * 既然是操作设备上的数据,那么就可以用io技术,并按照io的操作规律来思考
 * 源:键盘录入
 * 目的:网络设备,网络输出流
 * 而且操作的是文本数据,可以使用字符流
 * 步骤:
 * 1、建立服务
 * 2、获取键盘录入
 * 3、将数据发给服务端
 * 4、获取服务端返回的大写数据
 * 5、结束,关资源
 * 注:都是文本数据,可以用字符流操作,同时加入缓冲提高效率
 *
 */
class TcpClient2{
 public static void main(String[] args) throws Exception {
  Socket s = new Socket("192.168.0.6",8889);
  //定义读取键盘数据的流对象
  BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  
  //定义目的,将数据写出到socket输出流,发给服务器端
  BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
  
  //定义一个socket读取流,读取服务器端返回的大写信息
  BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
  
  String line = null;
  while((line = bufr.readLine())!=null){
   if("over".equals(line))
    break;
   bufOut.write(line);
   bufOut.newLine();
   bufOut.flush(); 
   String str = bufIn.readLine();
   System.out.println("Server:"+str);
  }
  
  bufr.close();
  s.close();
 }
 
}

class TcpServer2{
 
 public static void main(String[] args) throws Exception{
  
  ServerSocket ss = new ServerSocket(8889);
  Socket s = ss.accept();
  String ip = s.getInetAddress().getHostAddress();
  System.out.println(ip+"connected...");
  BufferedReader bf = new BufferedReader(new InputStreamReader(s.getInputStream()));
  //BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
  PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
  String line = null;
  while((line = bf.readLine())!=null){
   System.out.println(line);
   pw.println(line.toUpperCase());
//   System.out.println(line);
//   bw.write(line.toUpperCase());
//   bw.newLine();
//   bw.flush();
  }
  s.close();
  ss.close();
 }
 
}

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

 

 

原创粉丝点击