黑马程序员---------Java面向对象——网络编程

来源:互联网 发布:linux eclipse -inst 编辑:程序博客网 时间:2024/05/19 18:39

------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 {// 打印下IPSystem.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();}}}


0 0
原创粉丝点击