基于UDP用JAVA实现客户端和服务端通信

Posted JC97

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于UDP用JAVA实现客户端和服务端通信相关的知识,希望对你有一定的参考价值。

案例模型分析:

基于TCP实现,一个Clinet(发送端)向,一个Server(接收端)上传图片文件的功能。要求,客户端上上传的图片路径,需要从配置文件.properties文件中读取

为了简化并可视结果:客户端和服务端,用本机ip上两个端口模拟即可;

定义Socket的时候,本机端口是OS随机分配的;

发送的文件类型是图片,用字节流(图片可能很大,这里用缓冲流包装)

由于服务器端套接字输入流是一个阻塞方法,客户端发送完数据后,需要用shutdown方法关闭客户端套接字输出流,这样服务端就不会一直阻塞等待新的输入;

 

客户端:

package netTCP;

import java.io.*;
import java.net.Socket;

public class Clinet {

    public static void main(String args[]) throws IOException {
        //获取文本内容,得到目标文件的路径
        String filepathtoUpload = getPath();
        System.out.println("获得要上传的文件所在路径是: "+filepathtoUpload);

        //定义客户端端口(目的ip,目的端口)
        Socket socket = new Socket("127.0.0.1",9991);

        //定义缓冲输入流,准备读入图片的字节缓冲数组
        BufferedInputStream bi = new BufferedInputStream(new FileInputStream(filepathtoUpload));
        byte[] buffpic= new byte[1024];
        int len;

        //获取客户端发送流,做包装;一边读图片字节数据,一边发送
        OutputStream out = socket.getOutputStream();
        BufferedOutputStream bos = new BufferedOutputStream(out);
        while((len = bi.read(buffpic))!=-1){
            bos.write(buffpic,0,len);
        }
        bos.flush();//刷新缓存
        socket.shutdownOutput();//禁用此套接字的输出流,可以使服务器端的InputStream不在阻塞

        //获取客户端输入流,接受文件上传后反馈信息
        InputStream in = socket.getInputStream();
        byte [] feedBack = new byte[1024];
        int lenfeedBack = in.read(feedBack);
        System.out.println(new String(feedBack,0,lenfeedBack));

        //收到反馈信息后,关闭套接字socket
        socket.close();
        bi.close();
    }


    public static String getPath() throws IOException {
        FileInputStream fileInputStream = new FileInputStream("G:\\\\JavaTestDir\\\\路径有中文\\\\config.properties");
        byte[] buffer = new byte[1024];
        int len = fileInputStream.read(buffer);
        String s = new String(buffer,0,len);
        return s;

    }

}

服务端:

package netTCP;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
   public static void main(String args[]) throws IOException {
       //定义服务端SeverSocker,并获取服务端连接的socket
       ServerSocket serverSocket = new ServerSocket(9991);
       Socket socket = serverSocket.accept();

       //获取socket输入流,并用缓存字节流包装;
       InputStream in = socket.getInputStream();
       BufferedInputStream bis = new BufferedInputStream(in);

       //指定一个路径(这里用默认路径),定义缓冲输出流,用于将图片保存到默认路径
       FileOutputStream fo = new FileOutputStream("copy.jpg");
       BufferedOutputStream bos = new BufferedOutputStream(fo);

       //接收客户端的数据,并写到指定位置
       byte[] buff = new byte[1024];
       int len = 0;
       while((len = bis.read(buff))!=-1){
            bos.write(buff,0,len);
       }
        bos.flush();

       //获取socket输出流
       OutputStream out = socket.getOutputStream();
       //返回文件上传结束信息给客户端(中文)
       String feedbackMessage ="文件上传结束";
       out.write(feedbackMessage.getBytes());

       //out.close();//可不用,由客户端关闭socket即可
       fo.close();
      // in.close();//可不用,有客户端关闭socket即可
       socket.close();
       serverSocket.close();;
   }

}

可以看到运行完,图片被上传到默认路径



以上是关于基于UDP用JAVA实现客户端和服务端通信的主要内容,如果未能解决你的问题,请参考以下文章

Java网络编程基于UDP的聊天通信

java网络聊天软件开发,要基于UDP的

Java Socket实现基于TCP和UDP多线程通信

linux网络编程之用socket实现简单客户端和服务端的通信(基于UDP)

c++编写UDP客户/服务器程序,要求:使用udp服务实现客户端与服务器交互信息.

Java系列讲座二:Socket网络通信实现聊天软件项目讲解(UDP)