Java网络编程-实现TCP的网络编程

案例一:服务器收到客户端发送的信息,并打印到控制台

客户端

@Test
public void client02(){
    Socket socket=null;
    //造一个数据输出流
    DataOutputStream dos=null;
    try {
        //造一个Socket套接字
        socket=new Socket("127.0.0.1",4433);
        //数据输出流的输出位置是  socket的输出流
        dos=new DataOutputStream(socket.getOutputStream());
        //给服务器传送数据
        for(int i=0;i<1024;i++)
        {
            //使用数据输出流输出基本数据类型数据
            dos.writeUTF("我是客户端,你好服务器\n");
        }
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        //关闭资源
        if (dos != null) {
            try {
                dos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (socket != null) {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
View Code

服务器

@Test
public void server02()
{
    try {
        ServerSocket serverSocket=new ServerSocket(4433);
        while (true)
        {
            Socket client = serverSocket.accept();
            InputStream is = client.getInputStream();
            int len;
            byte [] bytes=new byte[5];
            //不建议这样写,可能会乱码
            while ((len=is.read(bytes))!=-1)
            {
                String str=new String(bytes,0,len);
                System.out.println(str);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
View Code

服务器不建议这样直接读取数据,可能会乱码

我

是�

�户�

��,�

�好�

��务

器

推荐写法

@Test
    public void server02()
    {
        try {
            ServerSocket serverSocket=new ServerSocket(4433);
            while (true)
            {
                Socket client = serverSocket.accept();
                InputStream is = client.getInputStream();
                int len;
                byte [] bytes=new byte[5];
                ByteArrayOutputStream bos=new ByteArrayOutputStream();
                while ((len=is.read(bytes))!=-1)
                {
                    bos.write(bytes,0,len);
                }
                String str=bos.toString();
                System.out.println(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
View Code

 

我是客户端,你好服务器

我是客户端,你好服务器

我是客户端,你好服务器

...

  

补充:

Java ByteArrayOutputStream

字节数组输出流在内存中创建一个字节数组缓冲区,所有发送到输出流的数据保存在该字节数组缓冲区中。

另外也可以使用转换流处理,效率较低

@Test
    public void server02()
    {
        try {
            ServerSocket serverSocket=new ServerSocket(4433);
            while (true)
            {
                Socket client = serverSocket.accept();
                InputStream is = client.getInputStream();
                int len;
                //方式二,使用转换流
                InputStreamReader isr=new InputStreamReader(is);
                char [] cbuf=new char[5];
                while ((len=isr.read(cbuf))!=-1)
                {
                    for (int i=0;i<len;i++)
                    {
                        System.out.print(cbuf[i]);
                    }
                }

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
View Code

 

 

 

案例二:服务器收到客户端数据,并将数据回传给客户端

客户端

@Test
public void client03()
{
    Socket socket=null;
    ByteArrayOutputStream bos=new ByteArrayOutputStream();
    try {
        socket=new Socket("127.0.0.1",4443);
        //发送数据给服务器
        String str=new String("你好服务器,我是李华");
        byte[] strBytes = str.getBytes(StandardCharsets.UTF_8);
        socket.getOutputStream().write(strBytes);
        //告诉服务器我已经发送完所有数据了
        socket.shutdownOutput();
        //接受服务器回传数据
        int len;
        byte [] bytes=new byte[1024];
        while ((len=socket.getInputStream().read(bytes))!=-1)
        {
            bos.write(bytes,0,len);
        }
        System.out.println(bos.toString());
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        //资源关闭
        try {
            bos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (socket != null) {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
View Code

服务器

@Test
public void server03()
{
    try {
        ServerSocket serverSocket=new ServerSocket(4443);
        while (true)
        {
            ByteArrayOutputStream bos=new ByteArrayOutputStream();
            Socket client = serverSocket.accept();
            int len;
            byte [] bytes=new byte[1024];
            while ((len=client.getInputStream().read(bytes))!=-1)
            {
                bos.write(bytes,0,len);
            }
            String str=bos.toString();
            System.out.println(str);

            String str1="我是服务器,我已经收到你的信息{"+str+"}";
            byte[] str1Bytes = str1.getBytes(StandardCharsets.UTF_8);
            client.getOutputStream().write(str1Bytes);
            client.shutdownOutput();
            client.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
View Code

 

客户端

我是服务器,我已经收到你的信息{你好服务器,我是李华} 

服务器

你好服务器,我是李华

 

 

案例三:客户端给服务器发送文件,服务器保存文件到本地,并把文件路径告诉客户端

客户端

@Test
public void client04()
{
    try {
        Socket socket=new Socket("127.0.0.1",4443);
        //读取文件并发送
        File file=new File("hello.txt");
        FileInputStream fis=new FileInputStream(file);
        int len;
        byte [] buff=new byte[1024];
        while ((len=fis.read(buff))!=-1)
        {
            socket.getOutputStream().write(buff,0,len);
        }
        socket.shutdownOutput();
        //读取服务器发来的信息
        buff=new byte[1024];
        ByteArrayOutputStream baos=new ByteArrayOutputStream();
        while ((len=socket.getInputStream().read(buff))!=-1)
        {
            baos.write(buff,0,len);
        }
        System.out.println(baos.toString());
        //关闭资源
        baos.close();
        fis.close();
        socket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
View Code

服务器

@Test
public void server04()
{
    try {
        ServerSocket serverSocket=new ServerSocket(4443);
        while (true)
        {
            Socket client = serverSocket.accept();
            String str=System.currentTimeMillis()+".txt";
            File file=new File(str);
            FileOutputStream fos=new FileOutputStream(file);
            int len;
            byte [] buff=new byte[1024];
            while ((len=client.getInputStream().read(buff))!=-1)
            {
                fos.write(buff,0,len);
            }

            byte[] strBytes = str.getBytes(StandardCharsets.UTF_8);
            client.getOutputStream().write(strBytes);
            client.shutdownOutput();
            client.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
View Code

 

客户端

1604033753035.txt

服务器

 

 

 

 

posted @ 2020-07-30 23:26  orz江小鱼  阅读(143)  评论(0编辑  收藏  举报