------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ---
</pre><pre name="code" class="java"> UDP: 1.将数据及源和目的封装成数据包中,不需要建立连接,也就是面向无连接。 2.每个数据报包的大小在限制在64k内。 3.因无连接,是不可靠的协议。 4.不需要建立连接,速度快。 应用场景:不管连上连不上它都发送数据,所以数据也就有可能收不到,不可靠。 主要用于视频会议聊天,微信之类的,一些缺少点数据不重要,可靠性要求低,传输经济的。 TCP:1.建立连接,形成传输数据的通道。 2.在连接中进行大数据传输。 3.通过三次握手完成连接,是可靠协议。 4.因为必须建立连接,所以效率会稍低。 应用场景:主要用于数据下载,文件传输,可靠性要求高的;如打电话,百度云,迅雷等。
</pre><pre name="code" class="java">
</pre><pre name="code" class="java">import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; /* 需求 使用TCP协议完成一个客户端一个服务器。客户端从键盘输入读取一个字符串,发送到服务器。 服务器接收客户端发送的字符串,反转之后发回客户端。客户端接收并打印。 */ //注解:方便操作我把服务端和客服端写入不同文件中. /* 需求:建立一个文本转换服务器。 客服端给文本服务端发送文本,服务端会将文本转成大写在返回给客服端。 而且客服端可以不断的进行文本转换。给客服端输入over时,转换结束。 分析: 客服端: 既然是操作设备上的数据,那么就可以用IO技术,并按照IO的操作规律来思考。 源:键盘录入。 目的:网络设备,网络输出流。 而且操作的是文本数据。可以选择字符流。 步骤: 1,建立服务。 2,获取键盘录入字符串数据。 3,将数据发给客服端。 4,后去服务端返回反转的字符串数据。 5,结束,关闭资源。 都是书文本数据,可以使用字符流进行操作,同时提高效率,加入缓冲。 */ //客服端: public class Test_10_Client{ public static void main(String[] args) throws Exception { //创建客服端建立服务,指定与之相关联的主机和端口。 Socket s = new Socket("192.168.0.101",10000); //定义读取键盘数据的流对象。 BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); //定义目的。将数据写入socket输出流,发给服务端。 BufferedWriter bufO = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); //获取输入流对象 BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream())); //读取数据 String line = null; while((line=bufr.readLine())!=null){ if("over".equals(line))//over作为键盘录入结束标记! break; //写入数据 bufO.write(line); bufO.newLine();//换行 bufO.flush();//刷新 String str =bufIn.readLine(); System.out.println("server:"+str); } //关闭资源 s.close(); } }
package com.itheima; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; //服务端: public class Test_10_Server{ public static void main(String[] args) throws Exception { //创建ServerSocket对象 ServerSocket ss = new ServerSocket(10000); //获取链接过来的对象 Socket s =ss.accept(); //获取IP 并输出 String ip = ss.getInetAddress().getHostAddress(); System.out.println(ip+"...connected!"); //创建一个输入流对象 BufferedReader bufr = new BufferedReader(new InputStreamReader(s.getInputStream())); //创建一个输出流对象 BufferedWriter bufW = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); //读取数据 String line = null; while((line = bufr.readLine())!=null){ System.out.println(line); //字符串反转处理:定义缓冲区。调用反转方法reverse() StringBuffer sb = new StringBuffer(line); String str = sb.reverse().toString(); //服务器本地输出 System.out.println(sb+"::"+str); //将反转后的字符串输出给客服端 bufW.write(str); bufW.newLine(); bufW.flush(); } //关闭资源 ss.close(); } }
package com.itheimaday24; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; /* 需求:上传图片。 */ /* 客服端: 1,服务端点。 2,读取客服已有的图片数据。 3,通过socket输出将数据发给服务端。 4.读取服务端反馈信息 5.关闭。 */ class PicClient { public static void main(String[] args) throws Exception { // 创建文件路径 if (args.length != 1) { System.out.println("请选择一个jpg格式图片"); return; } File file = new File(args[0]); if (!(file.exists() && file.isFile())) { System.out.println("该文件有问题,要么不存在,要么有问题"); return; } if (!file.getName().endsWith(".JPG")) { System.out.println("图片格式错误重新选择"); return; } if (file.length() > 1024 * 1024 * 5) { System.out.println("文件过大,没安好心"); return; } // 建立客服端端点。并指定与之关联的主机和端口 Socket s = new Socket("192.168.0.101", 11110); // 读取客服端已有的图片数据。 FileInputStream fis = new FileInputStream(file); // OutputStream getOutputStream() 返回此套接字的输出流。 OutputStream Out = s.getOutputStream(); // 创建缓冲区 byte[] buf = new byte[1024 * 5]; // 读取流对象并往外写 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 * 5]; int num = in.read(bufIn); System.out.println(new String(bufIn, 0, num)); // 关闭流资源 s.close(); fis.close(); } } /* * * 服务端: * * 这个服务端有个局限性。当A客服端连接上以后,被服务端获取到。服务端执行具体流程。 * * 这时B客服端连接,只有等待。 * * 因为服务端还没有处理完A客服端的请求,还没有循环回来执行下次accept方法。所以 * * 那么为了可以让多个客服端同时并发访问客服端。 * * 那么服务端最好是将每一个客服端封装到一个单独的线程中,这样,就可以同时处理多个客服端请求。 * * 如何定义线程呢? * * 只要明确了每一个客服端要在服务端要执行的代码即可。将该代码存入run方法中。 */ // 定义线程 实现Runnable接口。 class PicThread implements Runnable { private Socket s; PicThread(Socket s) { this.s = s; } public void run() { // 定义一个计数器。 int count = 1; // 获取IP地址 String ip = s.getInetAddress().getHostAddress(); try { // 打印下IP System.out.println(ip + ".....connected"); // 读取客服端发送过来的数据 InputStream in = s.getInputStream(); // 为了让文件不覆盖用IP地址来命名 File file = new File(ip + "(" + (count) + ")" + ".jpg"); while (file.exists()) { file = new File(ip + "(" + (count++) + ")" + ".jpg"); } // 把文件写入到一个文件中去 (我默认我的F盘中) FileOutputStream fisOut = new FileOutputStream(file); // 定义一个写入数据的缓冲区 byte[] Out = new byte[1024 * 5]; int len = 0; while ((len = in.read(Out)) != -1) { fisOut.write(Out, 0, len); } // 用输出流给客服端反馈信息。 OutputStream out = s.getOutputStream(); out.write("上传成功".getBytes()); s.close(); fisOut.close(); } catch (Exception e) { throw new RuntimeException(ip + "上传失败"); } } } class PicServer { public static void main(String[] args) throws Exception { // 创建服务端端口 ServerSocket ss = new ServerSocket(11110); while (true) { // 接收客服端发送过来的数据 (Socket accept() 侦听并接受到此套接字的连接。 ) Socket s = ss.accept(); new Thread(new PicThread(s)).start(); } } }
黑马程序员---------Java面向对象——网络编程
最新推荐文章于 2022-11-03 16:55:40 发布