Socket编程

主要是实现两个程序间的信息交流,客服端发送请求,服务器监听到请求则响应客服端请求

UDP

特点:
UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。无连接,不安全效率高

java编程步骤:

客服端:

  1. 创建Socket对象,使用DatagramSocket
  2. 创建数据包。使用DatagramPacket(byte[] buf, int length, InetAddress address, int port)
  3. 发送数据。使用send(DatagramPacket p)
  4. 释放资源 。使用close()
    注意:
    DatagramPacket(byte[] buf, int length, InetAddress address, int port) 此方法的传输的数据为byte[],可有String.getBytes();得到
    需要指定接受端的IP地址对象 InetAddress,如InetAddress.getByName(“本机名称");//当前设备

服务器端:

  1. 创建Soket对象,使用DatagramSocket(int port) 需要指定端口号
  2. 接受数据包。使用receive(DatagramPacket p)
  3. 解析数据包。调用DatagramPacket数据包中的get方法
  4. 输出数据
  5. 关闭连接

注意:

  • 创建服务器Socket时需要指定端口号,且端口号要与客服端数据包中端口号一致
  • 调用receive(DatagramPacket p)方法会阻塞线程,其中参数用此方法构造DatagramPacket(byte[] buf, int length) 构造一个 DatagramPacket用于接收长度的数据包 length 。

实例:

客服端:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;


public class UDPSend {

	public static void main(String[] args) throws IOException {
		//method();
		
		//创建socket
		DatagramSocket ds=new DatagramSocket();
		
		//创建数据包
		byte[] data="hello world!".getBytes();
		DatagramPacket dp=new DatagramPacket(data, data.length, InetAddress.getByName("DESKTOP-NFHEV8O"), 10086);
		
		//发送数据包
		ds.send(dp);
		
		//释放资源
		ds.close();
	}

	static void method() throws IOException {
		// 1.创建Socket对象
		DatagramSocket dgs = new DatagramSocket();
		
		// 2.打包数据
		String str = "hello udp";
		byte[] data = str.getBytes();
		int len = data.length;
		InetAddress address = InetAddress.getByName("DESKTOP-NFHEV8O");//当前设备
		int port = 10086;

		DatagramPacket dp = new DatagramPacket(data, len, address, port);
		
		// 3.发送数据
		dgs.send(dp);
		
		// 4.关闭连接
		dgs.close();
	}
}

服务器端:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class UDPReceive {

	public static void main(String[] args) throws IOException {
		
		//method();
		
		//创建socket对象
		DatagramSocket ds=new DatagramSocket(10086);
		
		//接收数据包
		byte[] bys=new byte[1024];	
		DatagramPacket dp=new DatagramPacket(bys,bys.length);
		ds.receive(dp);
	
		//解析数据
		InetAddress address=dp.getAddress();//获取发送端地址
		byte[] data=dp.getData();
		int len=dp.getLength();
		
		//显示数据
		System.out.println("hostAddress------>"+address);
		System.out.println(new String(data,0,len));
		
		//释放资源
		ds.close();
		
	}

        static void method() throws SocketException, IOException {
		// 1.创建Soket对象
		DatagramSocket ds=new DatagramSocket(10086);//指定端口
		
		// 2.接受数据包
		byte[] by=new byte[1024];
		DatagramPacket dp=new DatagramPacket(by,by.length);
		System.out.println(1);
		ds.receive(dp);
		System.out.println(2);
		
		// 3.解析数据包
		byte[] data=dp.getData();
		int datalen=dp.getLength();//获取数据的实际长度
		InetAddress address=dp.getAddress();
	
		// 4.输出数据
		System.out.println("hostaddress---->"+address); 
		//String(byte[] bytes, int offset, int length) 
        //通过使用平台的默认字符集解码指定的字节子阵列来构造新的 String 。 
		System.out.println(new String(data,0,datalen));
		
		// 5.关闭连接
		ds.close();
	}
}

TCP

特点:
TCP是一种面向广域网的通信协议,目的是在跨越多个网络通信时,为两个通信端点之间提供一条具有下列特点的通信方式: [1]
(1)基于流的方式;
(2)面向连接;
(3)可靠通信方式;
(4)在网络状况不佳的时候尽量降低系统由于重传带来的带宽开销;
(5)通信连接维护是面向通信的两个端点的,而不考虑中间网段和节点。
有链接,安全,效率低

java编程步骤:

客服端:
TCP发送数据步骤:
1.创建Socket对象。使用Socket(InetAddress address, int port) 创建流套接字并将其连接到指定IP地址的指定端口号。
2.获取输出流。使用getOutputStream() 返回此套接字的输出流。
3.发送数据。使用输出流直接发送输出数据
4.释放资源。使用close(),关闭Socket会自动关闭输出流

服务器端:
TCP接受数据步骤:
1.创建Socket对象。使用ServerSocket(int port) 创建绑定到指定端口的服务器套接字。
2.监听,等待客服端发送请求。accept() 侦听要连接到此套接字并接受它。返回值为客服端Socket对象
3.获取输入流对象
4.输出数据
5.释放资源
注意:

  • tcp发送数据前 首先建立连接
  • 实质是输入输出流收发数据

实例:

客服端:

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class TCPClient {

	public static void main(String[] args) throws IOException {
		// * 1.创建Socket对象
		Socket s=new Socket(InetAddress.getByName("DESKTOP-NFHEV8O"),10086);
		
		// * 2.获取输出流
		OutputStream os=s.getOutputStream();
		
		// * 3.发送数据
		byte[] data="hello tcp,im comming!".getBytes();
		os.write(data);
		
		// * 4.释放资源
		//os.close(); //关闭socket会自动管不输出流
		s.close();
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值