java基础——网络编程基础TCP,URL

Posted zsbenn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java基础——网络编程基础TCP,URL相关的知识,希望对你有一定的参考价值。

TCP部分

new socket对象

package ip;
/*
1.通过IP地址和域名new InetAddress对象
2.本地回路地址:127.0.0.1 对应localhost,表示本地主机
3.IP地址和端口号接在一起组成一个socket,类似于网络节点
@author zsben
@create 2020-01-07 15:34
*/

import java.net.InetAddress;
import java.net.UnknownHostException;

public class Iptest {

    public static void main(String[] args) {
        try {
            //File file = new File("hello.txt");File对应文件,Inet对应网络地址
            InetAddress inetAddress = InetAddress.getByName("192.168.10.14");
            System.out.println(inetAddress);

            InetAddress inetAddress1 = InetAddress.getByName("www.baidu.com");
            System.out.println(inetAddress1);

            InetAddress inetAddress2 = InetAddress.getByName("127.0.0.1");
            System.out.println(inetAddress2);

            InetAddress inetAddress3 = InetAddress.getLocalHost();
            System.out.println(inetAddress3);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }

}

客户端  发消息给  服务器

package tcp;
/*
实现TCP的网络编程
例子1:客户端发送信息给服务端,服务端将数据显示到控制台上
@author zsben
@create 2020-01-07 16:45
*/

import org.junit.Test;

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

public class TcpTest1 {

    //客户端发送数据
    @Test
    public void client()    {

        Socket socket = null;
        OutputStream os = null;


        try {
            //创建socket对象,指明服务器端的ip 和端口号
            InetAddress inet = InetAddress.getByName("172.23.104.31");
            socket = new Socket(inet,10000);

            //得到输出流并写数据,进行发送
            os = socket.getOutputStream();
            os.write("你好,我是client".getBytes());

        }
        catch (IOException e) {
            System.out.println(e.getMessage());;
        }//资源关闭
        finally {
            if(os!=null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }


    //服务端接收数据
    @Test
    public void server(){
        ServerSocket ss = null;
        Socket socket = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;

        try {
            ss = new ServerSocket(10000);//服务器端口

            socket = ss.accept();//调用accept接受来自客户端的socket

            is = socket.getInputStream();//从客户端socket得到输入流

            //从输入流里接受字节
            //防止字符的连续字节表示被截断出现乱码,必须保存一个完整的连续串
            baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[5];
            int len;
            while((len = is.read(buffer)) !=-1 )
                baos.write(buffer,0,len);//数据写到了baos,baos可以自动扩充容量

            System.out.println(baos.toString());

            //获取客户端的ip地址
            System.out.println("收到了来自"+socket.getInetAddress().getHostAddress()+"的数据");
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            if(ss!=null){
                try {
                    ss.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(is!=null){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(baos!=null){
                try {
                    baos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }


    public static void main(String[] args) {

    }
}

客户端发文件给服务器

package tcp;
/*
客户端发送文件给服务器,服务器将文件保存在本地:
知识点:文件传输
@author zsben
@create 2020-01-07 22:43
*/

import org.junit.Test;

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

public class TcpTest2 {
    @Test
    public void client(){
        Socket socket = null;
        OutputStream os = null;
        FileInputStream fis = null;
        try {
            //1.获取socket
            InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
            socket = new Socket(inetAddress, 12000);
            //2.获取socket的输出流
            os = socket.getOutputStream();
            //os.write("hello,i am client".getBytes());
            //3.获取文件的输入流
            fis = new FileInputStream("zsbenn.jpg");
            //4.fis->os
            byte[] buffer = new byte[1020];
            int len;
            while((len = fis.read(buffer))!=-1){
                os.write(buffer,0,len);
            }

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        finally {
            if(os!=null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(socket!=null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(fis!=null){
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    @Test
    public void server()  {
        ServerSocket ss = null;
        Socket socket = null;
        InputStream is = null;
        FileOutputStream fos = null;
        try {
            //1.获取服务器socket
            ss = new ServerSocket(12000);
            //获取客户端socket
            socket = ss.accept();
            //获取客户端socket的输入流
            is = socket.getInputStream();

            //服务器端创建一个输出流,接受客户端发送的文件
            fos = new FileOutputStream("zsbennn.jpg");

            //读取客户端的文件
            byte[] buffer = new byte[1004];
            int len;
            while((len=is.read(buffer)) != -1)
                fos.write(buffer,0,len);

        } catch (IOException e) {
            System.out.println(e.getMessage());;
        }
        finally {
            if(socket!=null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(ss!=null) {
                try {
                    ss.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(fos!=null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(is!=null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

客户端发送终止信号给服务器

package tcp;
/*
客户端发送文件给服务器,服务器将文件保存在本地,再给客户端发送一个接受成功
知识点:输出终止信号使用
@author zsben
@create 2020-01-07 22:43
*/

import org.junit.Test;

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

public class TcpTest3 {
    @Test
    public void client(){
        Socket socket = null;
        OutputStream os = null;
        FileInputStream fis = null;
        try {
            //1.获取socket
            InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
            socket = new Socket(inetAddress, 12000);
            //2.获取socket的输出流
            os = socket.getOutputStream();
            //os.write("hello,i am client".getBytes());
            //3.获取文件的输入流
            fis = new FileInputStream("zsbenn.jpg");
            //4.fis->os
            byte[] buffer = new byte[1020];
            int len;
            while((len = fis.read(buffer))!=-1){
                os.write(buffer,0,len);
            }

            //关闭数据的输出,强制终止输出
            socket.shutdownOutput();

            //5.接受来自服务器的数据,显示到控制台上
            InputStream is = socket.getInputStream();
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            while((len = is.read(buffer))!=-1) {
                baos.write(buffer,0,len);
            }
            System.out.println(baos.toString());

            baos.close();
            is.close();

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        finally {
            if(os!=null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(socket!=null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(fis!=null){
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    @Test
    public void server()  {
        ServerSocket ss = null;
        Socket socket = null;
        InputStream is = null;
        FileOutputStream fos = null;
        try {
            //1.获取服务器socket
            ss = new ServerSocket(12000);
            //2.获取客户端socket
            socket = ss.accept();
            //3.获取客户端socket的输入流
            is = socket.getInputStream();

            //4.服务器端创建一个输出流,接受客户端发送的文件
            fos = new FileOutputStream("zsbennn.jpg");

            //5.读取客户端的文件
            byte[] buffer = new byte[1004];
            int len;
            //服务器得等到客户端强制终止输出,才算输出完成
            while((len=is.read(buffer)) != -1)
                fos.write(buffer,0,len);

            System.out.println("图片传输完成");

            //6.服务器给客户端反馈
            OutputStream os = socket.getOutputStream();
            os.write("数据接收成功".getBytes());

            os.close();

        } catch (IOException e) {
            System.out.println(e.getMessage());;
        }
        finally {
            if(socket!=null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(ss!=null) {
                try {
                    ss.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(fos!=null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(is!=null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

URL部分

package url;
/*
URL:统一资源定位符
1.URL:同一资源定位符,对应着互联网的某一资源地址
2.格式:
    http://localhost:8080/examples/beauty.jpg?username=Tom
    协议   主机名     端口号  资源地址              参数列表
@author zsben
@create 2020-01-08 22:30
*/

import java.net.MalformedURLException;
import java.net.URL;

public class URLTest1 {

    public static void main(String[] args) {
        try {
            URL url = new URL("http://localhost:8080/examples/beauty.jpg?username=Tom");
            System.out.println("get协议名:"+url.getProtocol());
            System.out.println("get主机名:"+url.getHost());
            System.out.println("get端口号:"+url.getPort());
            System.out.println("get路径:"+url.getPath());
            System.out.println("get文件名:"+url.getFile());
            System.out.println("getQuery:"+url.getQuery());
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }


    }
}
package url;
/*


@author zsben
@create 2020-01-08 22:46
*/

import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class URLTest2 {

    public static void main(String[] args) {

        try {
            URL url = new URL("http://dmimg.5054399.com/allimg/pkm/pk/22.jpg");
            //打开一个关于Http服务器的连接
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            //获取连接
            urlConnection.connect();
            //从链接里获取输入流
            InputStream is = urlConnection.getInputStream();
            FileOutputStream fos = new FileOutputStream("image.jpg");

            byte[] buffer = new byte[1020];
            int len;
            while((len = is.read(buffer))!=-1){
                fos.write(buffer,0,len);
            }

            System.out.println("下载完成");

            //关闭资源
            is.close();
            fos.close();
            urlConnection.disconnect();//断开连接

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

以上是关于java基础——网络编程基础TCP,URL的主要内容,如果未能解决你的问题,请参考以下文章

java基础之网络编程

Java网络编程基础

[Java网络编程基础]TCP发送和接收数据

Java网络编程

java基础——TCP网络编程实现文件的上传

阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第2节 TCP协议_3_TCP通信的客户端代码实现