第84节:Java中的网络编程(中)
标题图
第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中的网络编程(中)