首页 > 代码库 > 黑马程序员——Java基础——网络编程02

黑马程序员——Java基础——网络编程02

第一讲  TCP的应用

使用TCP客户端上传图片:

  1 /*使用TCP客户端上传图片  2  * 注:单线程的服务端有个举行性:当A客户客户端连接上一行,被服务端获取,B客户必须等待  3  *     那么为了可以让多个客户端同时并发访问服务器,最后服务短短将每个客户端封装一个单独的线程中  4  *   5  * 定义线程的方法  6  * 只有明确了每一个客户端要在服务端执行的代表。就将该代码存入run()方法中  7  */  8 import java.io.*;  9 import java.net.*; 10 //客户端 11 class TCp { 12     public static void main(String[] args)throws Exception{ 13 //    一下是判断文件用的,其实应该写在服务端比较好 14 //        对传入的值进行判断 15         if(args.length!=1){ 16             System.out.println("请指定一个图片"); 17             return; 18         } 19          20         File file=new File(args[0]); 21 //        对文件路径进行判断 22         if(!(file.exists()&&file.isFile())){ 23             System.out.println("你上传的文件有问题,或不存在"); 24             return; 25         } 26 //        判断文件大小 27         if(file.length()>1024*1024){ 28             System.out.println("文件太大"); 29             return; 30         } 31 //        判断后缀 32         if(!file.getName().endsWith(".jpg")){ 33             System.out.println("图片格式错误"); 34             return; 35         } 36 //    创建服务 37         Socket s=new Socket("localhost",8888); 38         FileInputStream fis=new    FileInputStream(file); 39          40         OutputStream out=s.getOutputStream(); 41          42         BufferedReader in = 43                 new BufferedReader(new InputStreamReader(s.getInputStream())); 44         byte[] buf=new byte[1024]; 45          46         int len=0; 47         while((len=fis.read(buf))!=-1){ 48              49             out.write(buf,0,len); 50         } 51     //    结束标记 52         s.shutdownInput(); 53     //    反馈信息 54         String info = in.readLine(); 55         System.out.println(info); 56         fis.close(); 57         s.close(); 58     } 59 } 60 //服务端 61 class Server{ 62     public static void main(String[] args)throws Exception{ 63          64         ServerSocket ss=new ServerSocket(8888); 65         while(true){ 66             Socket s=ss.accept(); 67 //            每进入一个客户就执行的线程 68             new Thread(new PisThread(s)).start(); 69         }         70     } 71 } 72 //利用对现场实现并上传 73  74 class PisThread implements Runnable{ 75     private Socket s ; 76     PisThread(Socket s){ 77         this.s=s; 78     } 79 //复写run 80     public void run() { 81         int count=1;//计数器 82         String IP=s.getInetAddress().getHostAddress(); 83          84         try { 85             System.out.println(IP+"~~`connected"); 86 //            文件保存路径 87             File dir=new File("D:\\ttt\\"); 88              89             File file=new File(dir,IP+"tt.txt"); 90 //            判断文件是否存在 91             while(file.exists()){ 92                 file=new File(dir,IP+"("+(count++)+").jpg"); 93             } 94 //            数据写入 95             FileOutputStream fos=new FileOutputStream(file); 96             byte[] buf=new byte[1024]; 97             int len=0; 98             while((len=in.read(buf))!=-1){ 99                 100                 fos.write(buf,0,len);101             }102 //            反馈信息103             OutputStream out =s.getOutputStream();104             out.write("上传成功".getBytes());105             106             fos.close();107             s.close();108         } catch (Exception e) {109             throw new RuntimeException("上传失败");110         }111         112     }113         114 }

二、客户端并发登陆

  客户端键盘录入用户名,服务端对这个用户名进行校验。

  如果该用户名存在,服务端现象XX,已登录;并在客户端显示,xx欢迎光临

  如果用户不存在,在服务端显示xxx,尝试登陆,并在客户端显示xxx,该用户名不存在

 1 //练习:用户登录 2 import java.io.*; 3 import java.net.*; 4 //客户端 5 class LoginCilent { 6     public static void main(String[] args)throws Exception{ 7         Socket s=new Socket("localhost",8888); 8         BufferedReader bufr= 9                 new BufferedReader(new InputStreamReader(System.in));10 //        输出数据11         PrintWriter pout=new PrintWriter(s.getOutputStream(),true);12         13         BufferedReader bufin=14                 new BufferedReader(new InputStreamReader(s.getInputStream())); 15         String line=null;16 //        三次登录17         for(int x=0;x<3;x++){18             line=bufr.readLine();19             if(line==null){20                 break;21             }22 //            搞出去23             pout.println(line);24             String info=bufin.readLine();//读取信息25             System.out.println(info);26             if(info.contains("欢迎")){27                 break;28             }29         }30         bufr.close();31         s.close();32     }33 }34 //服务端35 36 class LoginServer{37     38     public static void main(String[] args)throws Exception{39         ServerSocket ss=new ServerSocket(8888);    40     41         while(true){42             43             Socket s=ss.accept();44             45             new Thread(new LoginThread(s)).start();46         }47         48     }49 }50 51 //线程端52 class LoginThread implements Runnable{53     private Socket s;54     LoginThread(Socket s){55         this.s=s;56     }57     public void run(){58 //        获得IP59         String IP=s.getInetAddress().getHostAddress();60         System.out.println(IP+"~`connected");61         try {62             for(int i=0;i<3;i++){63                 BufferedReader in=//读取获得的信息64                         new BufferedReader(new InputStreamReader(s.getInputStream()));65     //            读取自己数据库的信息66                 BufferedReader brin=67                         new BufferedReader(new FileReader("ttt.txt"));68     //            读取获得的数据和数据库对比69                 String line=in.readLine();70                 if(line==null){//客户端没有发生数据,跳出循环71                     break;72                 }73                 String data=http://www.mamicode.com/null;74                 boolean flag=false;75                 while((data=http://www.mamicode.com/in.readLine())!=null){76                     if(data.equals(line)){77                         flag=true;78                         break;79                     }80                     81                 }82 //                将数据输出83                 PrintWriter out=new PrintWriter(s.getOutputStream(),true);84                 if(flag){85                     System.out.println(line+",已登录");86                     out.print(line+"欢迎光临");87                 }else{88                     System.out.println(line+",尝试登录失败");89                     out.print(line+",用户名不存在");90                 }91             }92             s.close();93         } catch (Exception e) {94             throw new RuntimeException("用户名登录失败");95         }96         97     }98     99 }

 

URL和URLConnection

1、URL:

  URI:范围更大,条形码也包含于此范围

  URL:范围下,即域名

方法:

  1)构造函数:URL(protocal,host,port,file)

  2)String  getProtocol():获取协议名称

  3)Stirng  getHost();获取主机名

  4)int  getPort():获取端口

  5)String  getFile():获取URL文件名

  6)Stirng  getPath():获取URL的路径部分

  7) Stirng  getQuety():获取URL的查询部

2、URLConnection使用步骤  

  1)URL  Connection openConnection():用URL调用此方法,返回URLconnection对象

  2)INputStream getInputStream():获取输入流

  3)OutputStream getOutputStream():获取输出流

 1 import java.io.*; 2 import java.awt.*; 3 import java.awt.event.*; 4 import java.net.*; 5  6 class myIEGUiDemo { 7 //    各组件 8     private Frame f; 9     private Button but,bok;10     private TextField tf;11     private TextArea ta;12 //    构造函数13     myIEGUiDemo(){14         init();15     }16 //    实现组件功能17     private void init() {18         f=new Frame("我的IE");19         but=new Button("跳转");20         tf=new TextField(50);21         ta=new TextArea(20,60);22         23     //    基本设置24         f.setBounds(300,10,500,500);25         f.setLayout(new FlowLayout());26 //        添加组件27         f.add(tf);28         f.add(but);29         f.add(ta);30 //        窗体事件31         myEvent();32         33         f.setVisible(true);34     }35 //    注册事件36     private void myEvent() {37 //        窗体关闭38         f.addWindowListener(new WindowAdapter(){39             public void windowClosing(WindowEvent e){40                 System.exit(0);41             }42         });43 //        跳转事件    44         but.addActionListener(new ActionListener() {45 46             public void actionPerformed(ActionEvent e0) {47 //                在文本域中显示内容48                 showFile();49                 50             }51         });52         53 //        文本框事件54         tf.addKeyListener(new KeyAdapter(){55             public void keyPressed(KeyEvent ex){56 //                键盘按下回车57                 if(ex.getKeyCode()==KeyEvent.VK_ENTER){58                     showFile();                    59                 }60             }61         });62     }63 //    网页显示64     private void showFile(){65 //        刷空66         ta.setText("");67         String path=tf.getText();//获得输入路径68         try {69 //            路径封装为地址对象URL的对象url70             URL url=new URL(path);71 //            URL的对象通过openConnection连接网页并返回URLConnection的对象有点象Socket72             URLConnection conn=url.openConnection();73             74 //            读取流,用于读取服务器返回数据75             InputStream in=conn.getInputStream();76             77             byte[] buf=new byte[1024*1024];78             79             int len=in.read(buf);80 //            显示在文本域81             ta.append(new String(buf,0,len));82             83         } catch (Exception e) {84             throw new RuntimeException("连接失败");85         }86     }87     88     public static void main(String[] args){89         new myIEGUiDemo();90     }    91 }

域名解析:

技术分享

host应用:可屏蔽一些恶意网站,即将对应的映射关系写在hosts中,将IP地址改为本机的回环地址,那么会直接找到hosts,就不会讲请求发送出去了

 

 

 

 

黑马程序员——Java基础——网络编程02