1. UDP协议下,客户端与服务器的交互
客户端:
public class UDP_Send {
public static void main(String[]args) throws IOException {
Scanner sc =new Scanner(System.in);
//向服务器发送消息
while(true) {
DatagramSocket ds_Send =new DatagramSocket();
System.out.println("向服务器发送消息: ");
String message =sc.nextLine();
byte[]bt = message.getBytes();
InetAddress ip = InetAddress.getLocalHost();
//向服务器发送消息<服务器接收端口号45667>
DatagramPacket dp_Send =new DatagramPacket(bt,bt.length,ip, 45667);
ds_Send.send(dp_Send);
//关流防止线程阻塞
ds_Send.close();
//接收服务器反馈的消息<客户端接收端口号46667>
DatagramSocket ds_Receive =new DatagramSocket(46667);
//接收消息
byte[]bt_receive =new byte[1024];
DatagramPacket dp_receive =new DatagramPacket(bt_receive,bt_receive.length);
ds_Receive.receive(dp_receive);
//解析数据到控制台
System.out.println("服务器消息: ");
byte[]data = dp_receive.getData();
System.out.println(new String(data));
//关流防止线程阻塞
ds_Receive.close();
}
}
}
服务器:
public class UDP_Receive {
public static void main(String[]args) throws IOException {
Scanner sc =new Scanner(System.in);
System.out.println("服务器启动....");
//循环接收客户端消息并发送响应
while(true) {
//用于发送的Socket
DatagramSocket ds_Send =new DatagramSocket();
//接收客户端消息,接收端口<45667>
DatagramSocket ds_receive =new DatagramSocket(45667);
byte[]bt_receive =new byte[1024];
DatagramPacket dp_receive =new DatagramPacket(bt_receive,bt_receive.length);
ds_receive.receive(dp_receive);
//解析数据
byte[]data = dp_receive.getData();
System.out.println("客户端消息: ");
System.out.println(new String(data));
//关流防止线程阻塞
ds_receive.close();
//向客户端发送响应<客户端接收端口号46667>
System.out.println("向客户端发送消息: ");
String message =sc.nextLine();
byte[]bt_send = message.getBytes();
DatagramPacket dp_send =new DatagramPacket(bt_send,bt_send.length,InetAddress.getLocalHost(), 46667);
ds_Send.send(dp_send);
//关流防止线程阻塞
ds_Send.close();
}
}
}
2. TCP协议下客户端与服务器的交互(文件传输)
客户端:
public class TCP_Send {
public static void main(String[]args) throws IOException {
//客户端创建Socket对象<指向服务器端口45667>
Socket socket_send =new Socket(InetAddress.getLocalHost(), 45667);
//创建输入流,读取客户端文件到客户端内存
InputStream in =new FileInputStream("C:\\Users\\Administrator\\Desktop\\a.png");
//创建输出流对象,将文件上传服务器
OutputStream output =socket_send.getOutputStream();
//上传文件
int len;
byte[]b = new byte[1024];
while((len =in.read(b))!=-1) {
output.write(b,0,len);
}
//关闭输出流,但不能关闭连接
socket_send.shutdownOutput();
System.out.println("正在上传.....");
//创建输入流,接收服务器响应
InputStream input =socket_send.getInputStream();
byte[]b2 = new byte[1024];
input.read(b2);
System.out.println(new String(b2));
}
}
服务器:
public class TCP_Receive {
public static void main(String[]args) throws IOException {
// 创建SeverSocket对象,建立与客户端的连接<用于接收的端口45667>
ServerSocket socket =new ServerSocket(45667);
System.out.println("服务器开启....");
while (true) {
System.out.println("等待接收数据....");
// 创建输入流,接收客户端文件到服务器内存
// 需要简介创建socket对象/accept()方法
Socket accept =socket.accept();
InputStream input =accept.getInputStream();
// 创建输出流对象,将内存中文件传递到硬盘
FileOutputStream out =new FileOutputStream(System.currentTimeMillis() +".png");
// 开始从客户端接收文件并保存本地服务器
int len;
byte[]b = new byte[1024];
while ((len =input.read(b)) != -1) {
out.write(b, 0,len);
}
// 关闭流,防止阻塞
out.close();
accept.shutdownInput();
// 创建输出流将响应信息反馈到客户端
OutputStream output =accept.getOutputStream();
output.write("上传成功!".getBytes());
System.out.println("保存成功");
// 关闭流
accept.shutdownOutput();
}
}
}
3. UDP协议下实现文件传输,并与主机交互
客户端:
public class UDP_Send {
public static void main(String[]args) throws IOException {
// 创建输入流,将客户端本地文件读到内存
FileInputStream in =new FileInputStream("C:\\Users\\Administrator\\Desktop\\a.png");
// 创建packet包装数据
byte[]b = new byte[1024];
while (true) {
int len =in.read(b);
if (len != -1) {
// 使用客户端随机端口向服务器传输信息
DatagramSocket ds_send =new DatagramSocket();
DatagramPacket dp_send =new DatagramPacket(b,len, InetAddress.getLocalHost(), 45667);
// 向服务器发送数据包
ds_send.send(dp_send);
ds_send.close();
}else {
// 向服务器传入结束标签
DatagramSocket ds_send =new DatagramSocket();
byte[]end = "end".getBytes();
DatagramPacket dp_send =new DatagramPacket(end,end.length, InetAddress.getLocalHost(), 45667);
ds_send.send(dp_send);
ds_send.close();
break;
}
}
in.close();
System.out.println("正在上传....");
// 创建DatagramSocket接收服务器反馈<接收端口46667>
DatagramSocket ds_receive =new DatagramSocket(46667);
byte[]message = new byte[1024];
DatagramPacket dp_receive =new DatagramPacket(message,message.length);
// 接收响应
ds_receive.receive(dp_receive);
// 解析到控制台
byte[]result = dp_receive.getData();
System.out.println(new String(result));
// 关流
ds_receive.close();
}
}
服务器:
public class UDP_Receive {
public static void main(String[]args) throws SocketException, IOException {
System.out.println("服务器开启.....");
// 创建输出流,将内存文件保存到服务器硬盘
FileOutputStream out =new FileOutputStream(System.currentTimeMillis() +".png");
// 创建DatagramSocket指定接收端口
DatagramSocket ds_receive =new DatagramSocket(45667);
byte[]receive = new byte[1024];
DatagramPacket dp_receive =new DatagramPacket(receive,receive.length);
System.out.println("等待上传...");
// 接收客户端数据,遇到结束标签退出
while (true) {
ds_receive.receive(dp_receive);
byte[]b = dp_receive.getData();
String data =new String(b).substring(0,3);
// 判断是否结束
//由于上一步接收的字节信息仍在字节数组中存在,所以只获取前三个字符才能读到end标签
if (data.trim().endsWith("end")) {
ds_receive.close();
break;
}
// System.out.println(data);不写这句话正常
// 文件写到硬盘
out.write(b,0,dp_receive.getLength());
}
// 关闭流
out.close();
ds_receive.close();
System.out.println("保存成功!");
// 向客户端发送响应信息
DatagramSocket ds_send =new DatagramSocket();
byte[]message = "上传成功!".getBytes();
DatagramPacket dp_send =new DatagramPacket(message,message.length, InetAddress.getLocalHost(), 46667);
ds_send.send(dp_send);
// 关流
ds_send.close();
}
}