第84节:Java中的网络编程(中)

作者 : 开心源码 本文共15604个字,预计阅读时间需要40分钟 发布时间: 2022-05-12 共188人阅读

标题图

第84节:Java中的网络编程(中)

实现用户端和服务端的通信:

用户端需要的操作,创立socket,明确地址和端口,进行键盘录入,获取需要的数据,而后将录入的数据发送给服务端,为socket输出流,而后进行读取服务端发送回来的大写数据,为socket读取流,最后进行用户端显示器的显示,进行读写操作,关闭资源。

网络编程TCP用户端

package com.dashucoding.tcp3;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;public class TransClient {    public static void main(String[] args) throws IOException {        // 用户端        // 创立socket 明确地址和端口        Socket s = new Socket("192.168.1.151",10005);                // 键盘录入        BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));                // 网络, socket输出流//      OutputStream out = s.getOutputStream();                // 传的是字符数据, 转换,提高效率//      BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(out));                // 打印流,既能接收字符又能接收字节        PrintWriter out = new PrintWriter(s.getOutputStream());                // 读取流,读取服务端发来的数据//      InputStream in = s.getInputStream();        BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));                // 显示数据,使用输出语句                // 频繁读写,读键盘        String line = null;        while((line=bufr.readLine()) != null) {            if("over".equals(line)) {                break;            }            // 读取键盘的数据发送到服务端            out.println(line);                        // 读取服务端返回的数据            String upperText = bufIn.readLine();            System.out.println(upperText);                    }                // 关闭资源        s.close();            }}

对于服务端,要创立一个服务端的socket,而后明确端口,要读取用户端发送过来的数据,要读取socket输入流,接着使用socket输出流,将数据发送给用户端,进行读写操作,关闭资源。

网络编程TCP服务端

package com.dashucoding.tcp3;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;public class TransServer {    public static void main(String[] args) throws IOException {        System.out.println("服务端运行。。。");        // 服务端:        // 创立服务端的socket,明确端口        ServerSocket ss = new ServerSocket(10005);        while (true) {            // 获取用户端对象            Socket s = ss.accept();                        // 打印ip地址            System.out.println(s.getInetAddress().getHostAddress()+"...connected");            // socket输入流,读取用户端发过来的数据            BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));            // socket输出流,将数据发送给用户端//          PrintWriter out = new PrintWriter(s.getOutputStream());            PrintWriter out = new PrintWriter(s.getOutputStream(), true);            // 频繁的读写操作            String line = null;            while ((line = bufIn.readLine()) != null) {                // 假如用户端发送过来的是over                if ("over".equals(line)) {                    break;                }                                // 用户端的数据                System.out.println(line);                // 字母转大写                out.println(line.toUpperCase());                // 都在缓冲区中,刷新//              out.flush();            }            // 关闭用户端            s.close();        }    }}
package com.dashucoding.tcp3;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;public class TransClient {    public static void main(String[] args) throws IOException {                System.out.println("用户端运行。。。");        // 用户端        // 创立socket 明确地址和端口        Socket s = new Socket("192.168.2.151",10005);                // 键盘录入        BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));                // 网络, socket输出流//      OutputStream out = s.getOutputStream();                // 传的是字符数据, 转换,提高效率//      BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(out));                // 打印流,既能接收字符又能接收字节//      PrintWriter out = new PrintWriter(s.getOutputStream());        PrintWriter out = new PrintWriter(s.getOutputStream(), true);                // 读取流,读取服务端发来的数据//      InputStream in = s.getInputStream();        BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));                // 显示数据,使用输出语句                // 频繁读写,读键盘        String line = null;        // 都一行,有行终止符才返回        while((line=bufr.readLine()) != null) {            // 读取键盘的数据发送到服务端//          out.print(line+"\r\n");            out.println(line);            // 刷数据,都在缓冲区中//          out.flush();            if("over".equals(line)) {                break;            }                        // 读取服务端返回的数据            String upperText = bufIn.readLine();            System.out.println(upperText);                    }                // 关闭资源        s.close();            }}

上传文件

void shutdownInput() 此套接字的输入流置于“流的末尾”void shutdownOutput() 禁用此套接字的输出流String toString() 将此套接字转换为String.

用户端:

package com.dashucoding.net.uploadtext;import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;public class UploadTextClient {    public static void main(String[] args) throws UnknownHostException, IOException {        System.out.println("上传文件用户端运行。。。");        // 用户端        // 创立socket 明确地址和端口        Socket s = new Socket("192.168.43.126", 10006);        // 读取文本文件        BufferedReader bufr = new BufferedReader(new FileReader("tempfile\\client.txt"));        // 将数据发送给服务端        PrintWriter out = new PrintWriter(s.getOutputStream(), true);                        // 显示数据,使用输出语句        // 频繁读写,读键盘        String line = null;        // 都一行,有行终止符才返回true        while ((line = bufr.readLine()) != null) {                        out.println(line);        }                // 给服务端发送一个结束标记,条约标记//      out.println("over");        s.shutdownOutput();        // 向服务端发送了结束标记                // 读取流,读取服务端发来的数据        BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));        String info = bufIn.readLine();        System.out.println(info);        // 关闭资源        bufr.close();        s.close();    }}

服务端:

package com.dashucoding.net.uploadtext;import java.io.BufferedReader;import java.io.FileWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;public class UploadTextServer {    public static void main(String[] args) throws IOException {        System.out.println("上传文本服务端运行。。。");        // 服务端:        // 创立服务端的socket,明确端口        ServerSocket ss = new ServerSocket(10006);        while (true) {            // 获取用户端对象            Socket s = ss.accept();            System.out.println(s.getInetAddress().getHostAddress() + "...connected");            // socket输入流,读取用户端发过来的数据            BufferedReader bufIn = new BufferedReader(new InputStreamReader(                    s.getInputStream()));            // socket输出流,目的是文件            PrintWriter pw = new PrintWriter(new FileWriter("tempfile\\server.txt"), true);            // 频繁的读写操作            String line = null;            while ((line = bufIn.readLine()) != null) {                if("over".equals(line)) {                    break;                }                                pw.println(line);            }                        // 发回给用户端,上传成功            PrintWriter out = new PrintWriter(s.getOutputStream(),true);            out.println("上传成功");                        // 关闭用户端            s.close();        }    }}

上传图片

用户端:

package com.dashucoding.net.uploadpic;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.net.UnknownHostException;public class UploadPicClient {    public static void main(String[] args) throws IOException {                System.out.println("上传图片用户端运行。。。");        // 上传图片        // 创立socket        Socket s = new Socket("192.168.43.126",10007);                // 读取图片,图片路径        File picFile = new File("tempfile\\001.jpg");        FileInputStream fis = new FileInputStream(picFile);                // socket 输出流        OutputStream out = s.getOutputStream();                byte[] buf = new byte[1024];        int len = 0;        while((len=fis.read(buf)) != -1) {            out.write(buf,0,len);        }                // 告诉服务器端图片数据发送完毕,不要等着读了。        s.shutdownOutput();                // 读取上传成功        InputStream in = s.getInputStream();        byte[] bufIn = new byte[1024];        int lenIn = in.read(bufIn);        System.out.println(new String(bufIn, 0, lenIn));                // 关闭        fis.close();        s.close();            }}

服务端:

package com.dashucoding.net.uploadpic;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.ServerSocket;import java.net.Socket;import org.omg.CORBA_2_3.portable.OutputStream;public class UploadPicServer {    public static void main(String[] args) throws IOException {                        System.out.println("上传图片服务端运行。。。");        // 创立serversocket        ServerSocket ss = new ServerSocket(10007);        while (true) { // 实现上传多回            // 获取用户端            Socket s = ss.accept();            String ip = s.getInetAddress().getHostAddress();            System.out.println(ip+"...connected");            // 读取图片数据            InputStream in = s.getInputStream();            // 写图片数据到文件            File picFile = new File("tempfile\\server.jpg"); // 存储图片            FileOutputStream fos = new FileOutputStream(picFile);            byte[] buf = new byte[1024];            int len = 0;            while ((len = in.read(buf)) != -1) {                fos.write(buf, 0, len);            }            // 给用户端返回一个回馈信息            java.io.OutputStream out = s.getOutputStream();            out.write("上传成功".getBytes());            // 关闭资源            fos.close();            s.close();        }    }}

如何处理图片重名的问题:

package com.dashucoding.net.uploadpic;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.net.UnknownHostException;public class UploadPicClient {    public static void main(String[] args) throws IOException {                System.out.println("上传图片用户端运行。。。");        // 上传图片        // 创立socket        Socket s = new Socket("192.168",10007);                // 读取图片,图片路径        File picFile = new File("tempfile\\001.jpg");        FileInputStream fis = new FileInputStream(picFile);                // socket 输出流        OutputStream out = s.getOutputStream();                byte[] buf = new byte[1024];        int len = 0;        while((len=fis.read(buf)) != -1) {            out.write(buf,0,len);        }                // 告诉服务器端图片数据发送完毕,不要等着读了。        s.shutdownOutput();                // 读取上传成功        InputStream in = s.getInputStream();        byte[] bufIn = new byte[1024];        int lenIn = in.read(bufIn);        System.out.println(new String(bufIn, 0, lenIn));                // 关闭        fis.close();        s.close();            }}
package com.dashucoding.net.uploadpic;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.ServerSocket;import java.net.Socket;import org.omg.CORBA_2_3.portable.OutputStream;public class UploadPicServer {    public static void main(String[] args) throws IOException {                        System.out.println("上传图片服务端运行。。。");        // 创立serversocket        ServerSocket ss = new ServerSocket(10007);        while (true) { // 实现上传多回            // 获取用户端            Socket s = ss.accept();            String ip = s.getInetAddress().getHostAddress();            System.out.println(ip+"...connected");            // 读取图片数据            InputStream in = s.getInputStream();            // 写图片数据到文件            // 创立目录            File dir = new File("e:\\uploadpic");            // 假如不存在就创立目录            if(!dir.exists()) {                dir.mkdir();            }            // 给文件编号            // 加计数器            int count = 1;            // 防止第二次为0            File picFile = new File(dir, ip + "("+count+").jpg");//          if(picFile.exists()) {            while(picFile.exists()) {                count++;                picFile = new File(dir, ip + "("+count+").jpg");            }            FileOutputStream fos = new FileOutputStream(picFile);            //          File picFile = new File("tempfile\\" + ip + ".jpg");//          File picFile = new File("tempfile\\server.jpg");             // 存储图片                        byte[] buf = new byte[1024];            int len = 0;            while ((len = in.read(buf)) != -1) {                fos.write(buf, 0, len);            }            // 给用户端返回一个回馈信息            java.io.OutputStream out = s.getOutputStream();            out.write("上传成功".getBytes());            // 关闭资源            fos.close();            s.close();        }    }}

处理上传并发的问题

结构

package com.dashucoding.net.uploadpic;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.net.UnknownHostException;public class UploadPicClient {    public static void main(String[] args) throws IOException {                System.out.println("上传图片用户端运行。。。");        // 上传图片        // 创立socket        Socket s = new Socket("",10007);                // 读取图片,图片路径        File picFile = new File("tempfile\\001.jpg");        FileInputStream fis = new FileInputStream(picFile);                // socket 输出流        OutputStream out = s.getOutputStream();                byte[] buf = new byte[1024];        int len = 0;        while((len=fis.read(buf)) != -1) {            out.write(buf,0,len);        }                // 告诉服务器端图片数据发送完毕,不要等着读了。        s.shutdownOutput();                // 读取上传成功        InputStream in = s.getInputStream();        byte[] bufIn = new byte[1024];        int lenIn = in.read(bufIn);        System.out.println(new String(bufIn, 0, lenIn));                // 关闭        fis.close();        s.close();            }}
package com.dashucoding.net.uploadpic;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.ServerSocket;import java.net.Socket;import org.omg.CORBA_2_3.portable.OutputStream;public class UploadPicServer {    public static void main(String[] args) throws IOException {        System.out.println("上传图片服务端运行。。。");        // 创立serversocket        ServerSocket ss = new ServerSocket(10007);        while (true) { // 实现上传多回            // 获取用户端            Socket s = ss.accept();            new Thread(new UploadPic(s)).start();        }    }}
package com.dashucoding.net.uploadpic;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.Socket;// 创立任务// 线程完成任务后,会自动结束public class UploadPic implements Runnable {    private Socket s;    // 创立构造函数    public UploadPic(Socket s) {        this.s = s;    }    @Override    public void run() {        try {            // 主线程负债接收用户端,其它线程负责接收数据            String ip = s.getInetAddress().getHostAddress();            System.out.println(ip + "...connected");            // 读取图片数据            InputStream in = s.getInputStream();            // 写图片数据到文件            // 创立目录            File dir = new File("e:\\uploadpic");            // 假如不存在就创立目录            if (!dir.exists()) {                dir.mkdir();            }            // 给文件编号            // 加计数器            int count = 1;            // 防止第二次为0            File picFile = new File(dir, ip + "(" + count + ").jpg");//                      if(picFile.exists()) {            while (picFile.exists()) {                count++;                picFile = new File(dir, ip + "(" + count + ").jpg");            }            FileOutputStream fos = new FileOutputStream(picFile);            // 开始循环进行读写操作            // 一个线程,不能解决并发的数据            byte[] buf = new byte[1024];            int len = 0;            while ((len = in.read(buf)) != -1) {                fos.write(buf, 0, len);            }            // 给用户端返回一个回馈信息            java.io.OutputStream out = s.getOutputStream();            out.write("上传成功".getBytes());            // 关闭资源            fos.close();            s.close();        } catch (IOException e) {            e.printStackTrace();        }    }}

用户端:浏览器,服务端:Tomcat

端口号,\con\server.xml

效果

浏览器发送HTTP请求

GET / HTTP / 1.1Accept: Accept-Language:Accept-Encoding:User-Agent:Host:Connection:

请求行,协议,应用层协议,超文本传输协议,请求方式,访问资源的路径,http的协议版本,

效果

package com.dashucoding.net.myserver;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;public class MyBrowser {    public static void main(String[] args) throws UnknownHostException, IOException {        // 浏览器发送http消息        Socket s = new Socket("",8080);                // 把信息发送给服务端        PrintWriter out=new PrintWriter(s.getOutputStream(),true);        out.println("");        out.println();//空行                // 读取服务端的数据        InputStream in = s.getInputStream();        byte[] buf = new byte[1024];        String text = new String(buf,0,len);        System.out.print(text);        s.close();    }}

发送和http协议相同的信息,收到了Tomcat服务器返回的数据。

版本插件

package com.dashucoding.net.myserver;import java.awt.BorderLayout;import java.awt.EventQueue;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.border.EmptyBorder;public class MyBrowserGui extends JFrame {    private JPanel contentPane;    /**     * Launch the application.     */    public static void main(String[] args) {        EventQueue.invokeLater(new Runnable() {            public void run() {                try {                    MyBrowserGui frame = new MyBrowserGui();                    frame.setVisible(true);                } catch (Exception e) {                    e.printStackTrace();                }            }        });    }    /**     * Create the frame.     */    public MyBrowserGui() {        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        setBounds(100, 100, 450, 300);        contentPane = new JPanel();        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));        contentPane.setLayout(new BorderLayout(0, 0));        setContentPane(contentPane);    }}

下载插件

url的形容

java.net类 urljava.lang.objectjava.net.url所有已实现的接口:serializablepublic final class url extends object implements serializableurl 表示一个统一的资源定位符,用于指向互联网"资源"的指针。
// 构造方法url (string spec):根据string表示形式创立url对象url (string protocol, string host, int port, string file)根据指定protocol,host,port号和file创立url对象
package com.dashucoding.net.url;import java.io.IOException;import java.io.InputStream;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;public class URLDemo {    public static void main(String[] args) throws IOException {        String str_url = "http://";                //将url地址封装成对象。        URL url = new URL(str_url);        //      System.out.println("getProtocol:"+url.getProtocol());//      System.out.println("getHost:"+url.getHost());//      System.out.println("getPort:"+url.getPort());//      System.out.println("getPath:"+url.getPath());//      System.out.println("getFile:"+url.getFile());//      System.out.println("getQuery:"+url.getQuery());                //获取指定资源的连接对象,封装了socket。        URLConnection conn = url.openConnection();        //      System.out.println(conn);                InputStream in = conn.getInputStream();        byte[] buf = new byte[1024];        int len = in.read(buf);        String text = new String(buf,0,len);        System.out.println(text);                    }}
openConnectionpublic URLConnection openConnection() throws IOException返回一个URLConnection对象,它表示到url所引用的远程对象的连接

urlconnection

图片

package com.dashucoding.net.url;import java.io.IOException;import java.io.InputStream;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;public class URLDemo {    public static void main(String[] args) throws IOException {        String str_url = "http://";        // 将url地址封装成对象。        URL url = new URL(str_url);//      System.out.println("getProtocol:"+url.getProtocol());//      System.out.println("getHost:"+url.getHost());//      System.out.println("getPort:"+url.getPort());//      System.out.println("getPath:"+url.getPath());//      System.out.println("getFile:"+url.getFile());//      System.out.println("getQuery:"+url.getQuery());        // 获取指定资源的连接对象,封装了socket。        URLConnection conn = url.openConnection();//      System.out.println(conn);        InputStream in = conn.getInputStream();        byte[] buf = new byte[1024];        int len = in.read(buf);        String text = new String(buf, 0, len);        System.out.println(text);    }}

网络编程中HTTP版本的区别

http1.0请求一次连接就断开了,一次连接只能有一次请求,http1.1一次连接屡次请求。

URL用于解析url地址,URLConnection用于获取url的连接。

常见的网络架构:cs和bs

client / server用户端和服务端,维护麻烦browser / server只要要服务端,只需系统内置浏览器所有的运算在服务端,简单易用

结言

好了,欢迎在留言区留言,与大家分享你的经验和心得。

感谢你学习今天的内容,假如你觉得这篇文章对你有帮助的话,也欢迎把它分享给更多的朋友,感谢。

达叔小生:往后余生,唯独有你
You and me, we are family !
90后帅气小伙,良好的开发习惯;独立思考的能力;主动并且善于沟通
简书博客: 达叔小生
https://www.songma.com/u/c785ece603d1

结语

  • 下面我将继续对 其余知识 深入讲解 ,有兴趣可以继续关注
  • 小礼物走一走 or 点赞

上一篇 目录 下一篇

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 第84节:Java中的网络编程(中)

发表回复