Java TCP\UDP的典型案例

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();

}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值