Java中网络编程

什么是网络编程呢?网络编程就是你的信息以发给别人达到共享。如何进行共享呢,这就需要说说网络编程的三要素了,首先是ip地址,也就是说你得知道你跟谁发的信息。其次是端口,就是别人得知道你是通过哪种方式发的信息,好让别人去接收,其中ip和端口组合起来就是Socket,也即是说通信的两端是Socket。最后就是协议了,详细的说就是你把你的信息通过某种协议发给别人,别人获得信息,以达到信息交流,这就是网络编程

一、UDP协议

UDP协议就是将想要发的数据打包成一个包,不用建立连接,数据大小的限制是64k,由于没有建立连接,所有是不可靠的协议,就是你发送成功与否不知道,当然因为不需要建立连接,这样速度也就快了。

首先要有接收,然后才能发送,要不然对方收不到,接收代码:

package UDP;

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

public class ReceiveMain {
	public static void main(String[] args) throws IOException {
		// 创建接受端Socket对象,用的是DatagramSocket(int port)方法
		DatagramSocket ds = new DatagramSocket(12345);

		// 创建一个数据包,用来接收数据用DatagramPacket(byte[] buf, int length)
		byte[] bt = new byte[1024];
		int length = bt.length;
		DatagramPacket dp = new DatagramPacket(bt, length);

		// 调用Socket对象的接收方法接收对象用receive(DatagramPacket p)
		ds.receive(dp);// 这是阻塞式,就是说在没接收到数据的时候我就在这等着

		// 解析数据包,并将数据显示出来

		// 获取对方的ip
		InetAddress address = dp.getAddress();// 返回ip地址对象
		String ip = address.getHostAddress();// 返回ip地址

		// 获取数据缓冲区用getData()方法
		byte[] bt2 = dp.getData();

		// 获取数据实际长度
		int len = dp.getLength();

		String s = new String(bt2, 0, len);

		System.out.println(ip + "---" + s);
		ds.close();
	}

}

运行结果:

认真观察,现在运行的是ReceiveMain,就是等着接收数据

发送数据代码:

package UDP;

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

public class SendMain {
	public static void main(String[] args) throws IOException {
		// 创建发送端Socket对象用DatagrameSocket()
		DatagramSocket ds = new DatagramSocket();

		// 创建数据,并把数据打包
		// 用DatagramPacket(byte[] buf, int length, InetAddress address, int port)
		// 创建数据
		byte[] bt = "hello UDP".getBytes();

		// 获取长度
		int len = bt.length;

		// 获取ip地址对象,这里是我本机的ip,你也可以发给别人,因为我只有一个电脑
		InetAddress address = InetAddress.getByName("172.28.22.66");

		// 设置端口,这个端口是我自己设置的,随便定义,范围一般是0到65535
                // 其中0到1024是系统使用或保留端口
		int port = 12345;
		DatagramPacket dp = new DatagramPacket(bt, len, address, port);

		// 调用Socket对象的发送方法发送数据包用send(DatagramPacket(p))
		ds.send(dp);

		// 释放资源
		ds.close();

	}

}

运行结果:

认真观察,当运行SendMain时,ReceiveMain就接受到了数据

二、TCP协议

TCP协议是需要建立连接的,通过建立数据通道,通过三次握手完成连接,是可靠协议,当然了速度相对也就慢了,具体步骤是,首先创建TCP服务器端的Socket对象,然后进行接收客户端的连接,接收到连接后会反馈给客户端,然后获取输入流并进行读取数据。对于客户端来说,首先需要创建TICP客户端Socket对象,获取输出流写数据。

服务器端代码:

package TCP;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerMain {
	public static void main(String[] args) throws IOException {
		// 创建接受端Socket对象,用ServerSocket()
		ServerSocket ss = new ServerSocket(12345);//这个是服务器,故不关闭,因为可能有多个客户端连接

		// 创建一个监听,用来返回一个对应的Socket对象,用accept()
		Socket s = ss.accept();

		// 获取输入流,读取客户端发送出来的数据
		InputStream is = s.getInputStream();

		byte[] by = new byte[1024];
		int len = is.read(by);// 这里是读取输入流中的数据,并放到字节数组by中,然后返回其长度

		String str = new String(by, 0, len);

		String ip = s.getInetAddress().getHostAddress();
		System.out.println(ip + "---" + str);
		
		//在这里服务器需要给客户端一个回复,告诉客户端一下
		//获取输出流
		OutputStream os = s.getOutputStream();
		os.write("数据已收到".getBytes());
		s.close();
	}
}

运行结果:

ServerMain以及启动,等待客户端发来信息

下面是客户端代码:

package TCP;

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

public class ClientMain {
	public static void main(String[] args) throws IOException {

		// 创建发送端Socket对象,用Socket(String host, int port)
		Socket s = new Socket("172.28.22.66", 12345);

		// 获取输出流,进行写数据,用getOutputStream()
		OutputStream os = s.getOutputStream();
		os.write("hello TCP".getBytes());
		
		//获取输入流,就是服务器端给的反馈
		InputStream is = s.getInputStream();
		byte[] by = new byte[1024];
		int len = is.read(by);
		 
		String str = new String(by,0,len);
		System.out.println(str);
		
		// 释放资源
		s.close();
	}
}

运行结果:

认真观察,这个是ClientMain中的运行结果,显示给客户端,服务器已经收到数据

这里是,ServerMain,这是服务器端的运行结果,显示出来了客户端发来的信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贺志营

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值