什么是网络编程呢?网络编程就是你的信息以发给别人达到共享。如何进行共享呢,这就需要说说网络编程的三要素了,首先是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,这是服务器端的运行结果,显示出来了客户端发来的信息