TDP协议

UDP/TCP区别

区别在于,UDP中只有发送端和接收端,不区分客户端与服务器端,计算机之间可以任意地发送数据。

而TCP通信是严格区分客户端与服务器端的,在通信时,必须先由客户端去连接服务器端才能实现通信,服务器端不可以主动连接客户端,并且服务器端程序需要事先启动,等待客户端的连接。

 

TCP相关类

一个是ServerSocket类,用于表示服务器端,一个是Socket类,用于表示客户端。

相关方法

ServerSocket类

服务器得到客户端

ServerSocket ServerSocket();

获取客户端Socket对象

Socket accept()

获取本机地址

InetAddress getInetAddress();

Socket类

地址:端口号

Socket(String host,int port)

获取端口号

int getPort()

结束标志

void sutdownIntPut();

相关实例

 * 实现TCP 服务器程序

 * 表示服务器程序的类 java.net.ServerSocket

 * 构造方法:

 *     ServerSocket(int port)传递端口号

 *     很重要的事情:必须要获得客户端的套接字对象Socket

 *     Socket accept()

 *

 * 1,创建服务器ServerSocket对象(指定服务器端口号)

 * 2,开启服务器了,等待客户端的连接,当客户端连接后,可以获取到连接服务器的客户端Socket对象

 * 3,给客户端反馈信息

 * 4,关闭流资源

 */

publicclass TCPServer {

    publicstaticvoid main(String[] args) throws IOException {

        //1,创建服务器ServerSocket对象(指定服务器端口号)

        ServerSocket ss = new ServerSocket(8888);

        //2,开启服务器了,等待客户端的连接,当客户端连接后,可以获取到连接服务器的客户端Socket对象

        Socket s = ss.accept();

        //3,给客户端反馈信息

        /*

         * a,获取客户端的输出流

         * b,在服务端端,通过客户端的输出流写数据给客户端

         */

        //a,获取客户端的输出流

        OutputStream out = s.getOutputStream();

        //b,在服务端端,通过客户端的输出流写数据给客户端

        out.write("你已经连接上了服务器".getBytes());

        //4,关闭流资源

        out.close();

        s.close();

        //ss.close();  服务器流 通常都是不关闭的

    }

}

 

完成了服务器端程序的编写,接下来编写客户端程序。

/*

 * 实现TCP 客户端,连接到服务器

 * 和服务器实现数据交换

 * 实现TCP客户端程序的类 java.net.Soket

 * 构造方法

 *    Socket(String host,int port) 传递服务器IP和端口号

 *    注意:构造方法只要运行,就会和服务器进行连接,连接失败,抛出异常

 

 *    OutputStream   getOutputStream() 返回套接字的输出流

 *    作用:将数据输出,输出到服务器

 *    InputStream   getInputStream() 返回套接字的输入流

 *    作用:从服务器端读取数据

 

 *    客户端服务器数据交换,必须使用套接字对象Socket中的获取的IO流,自己new流,不行

 

 * 1,创建客户端Socket对象,(指定要连接的服务器地址与端口号)

 * 2,获取服务器端的反馈回来的信息

 * 3,关闭流资源

 */

publicclass TCPClient {

    publicstaticvoid main(String[] args) throws IOException {

        //1,创建客户端Socket对象,(指定要连接的服务器地址与端口号)

        Socket s = new Socket("192.168.74.58", 8888);

        //2,获取服务器端的反馈回来的信息

        InputStream in = s.getInputStream();

        //获取获取流中的数据

        byte[] buffer = newbyte[1024];

        //把流中的数据存储到数组中,并记录读取字节的个数

        int length = in.read(buffer);

        //显示数据

        System.out.println( new String(buffer, 0 , length) );

        //3,关闭流资源

        in.close();

        s.close();

    }

}

文件上传实例(多线程)

* 文件上传多线程版本, 服务器端

 */

publicclass TCPServer {

    publicstaticvoid main(String[] args) throws IOException {

        //1,创建服务器,等待客户端连接

        ServerSocket serverSocket = new ServerSocket(6666);

       

        //实现多个客户端连接服务器的操作

        while(true){

           final Socket clientSocket = serverSocket.accept();

           //启动线程,完成与当前客户端的数据交互过程

           new Thread(){

               publicvoid run() {

                   try{

                       //显示哪个客户端Socket连接上了服务器

                       InetAddress ipObject = clientSocket.getInetAddress();//得到IP地址对象

                       String ip = ipObject.getHostAddress(); //得到IP地址字符串

                       System.out.println("小样,抓到你了,连接我!!" + "IP:" + ip);

                      

                       //7,获取Socket的输入流

                       InputStream in = clientSocket.getInputStream();

                       //8,创建目的地的字节输出流   D:\upload\192.168.74.58(1).jpg

                       BufferedOutputStream fileOut = new BufferedOutputStream(new FileOutputStream("D:\upload\"+ip+"("+System.currentTimeMillis()+").jpg"));

                       //9,把Socket输入流中的数据,写入目的地的字节输出流中

                       byte[] buffer = newbyte[1024];

                       int len = -1;

                       while((len = in.read(buffer)) != -1){

                           //写入目的地的字节输出流中

                           fileOut.write(buffer, 0, len);

                       }

                      

                       //-----------------反馈信息---------------------

                       //10,获取Socket的输出流, 作用:写反馈信息给客户端

                       OutputStream out = clientSocket.getOutputStream();

                       //11,写反馈信息给客户端

                       out.write("图片上传成功".getBytes());

                      

                       out.close();

                       fileOut.close();

                       in.close();

                       clientSocket.close();

                   } catch(IOException e){

                       e.printStackTrace();

                   }

               };

           }.start();

        }

 

        //serverSocket.close();

    }

}

原文地址:https://www.cnblogs.com/1997WY/p/10708742.html