码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-12-25 00:13:01      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:

第一讲  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 //        获得IP
59         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=null;
74                 boolean flag=false;
75                 while((data=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的对象url
70             URL url=new URL(path);
71 //            URL的对象通过openConnection连接网页并返回URLConnection的对象有点象Socket
72             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

标签:

原文地址:http://www.cnblogs.com/shuiyinmeizi/p/4183634.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!