A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 曹睿翔 于 2013-6-9 09:42 编辑

  1. <P> 搜集知识点范围:客户端并发登陆、浏览器客户端与自定义服务器练习。</P>
  2. <P>
  3. 一、客户端并发登陆:</P>
  4. <P>前提,要有存储用户信息的数据库放在服务端。当用户输入自己的用户名和密码时,该信息通过IO流传送到服务端,服务端将信息与数据库中的数据进行比对,若正确,返回true,允许登陆,否则,返回false。并发则体现在同时可以有多个用户进行提交,也可以是一个用户提交多次,但最多为3次,防止恶意攻击服务器,用多线程来进行实现。</P>
  5. <P>中心思想:
  6. 客户端:完成用户的输入,并将信息传给服务器,在传输之前进行简单的验证,防止穿空信息;要创建自己的套接字,绑定主机ip和指定端口号
  7. 服务端:接受客户端传来的信息,读取数据库,判断登陆是否成功,将结果反馈给用户
  8. 客户端线程:用来实现多用户并发登陆功能</P>
  9. <P>代码如下:</P>
  10. <P>//客户端
  11. class  Client
  12. {
  13. public static void main(String[] args) throws UnknowHostException,IOException
  14. {
  15.   Socket s  = new Socket("180.125.239.175",10008);//创建客户端套接字,180.125.239.175是我本机的ip地址,10008是指定的端口号
  16.   PrintStream ps = new PrintStream(s.getOutputStream(),true);//把客户端输入的信息发给服务端
  17.   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//读取键盘录入
  18.   BufferedReader bur = new BufferedReader(new InputStreamReader(s.getInputStream()));//接收客户端反馈给的信息</P>
  19. <P>        //只允许客户端错误提交三次,用for循环进行限制
  20.   for(int i=0; i<3; i++){
  21.   String line = br.readLine();//读取客户端的录入信息
  22.   if(line == null)//判断空,防止发空的信息到服务端
  23.    break;
  24.   ps.println(line);//把客户端信息传到服务端</P>
  25. <P>  String info = bur.readLine();//服务端的信息</P>
  26. <P>  System.out.println("info:" + info);//返回服务端的信息
  27.   if(info.contains("welcome"))//判断登陆是否成功
  28.    break;
  29.   }
  30.   //校验过三次之后关闭
  31.   pr.close();
  32.   s.close();
  33. }
  34. }</P>
  35. <P>//定义多用户线程
  36. class UserThread implements Runnable
  37. {
  38. private Socket s;</P>
  39. <P> UserThread(Socket s){
  40. this.s = s;
  41. }
  42. //线程的执行方法
  43. public void run(){

  44. String ip = s.getInetAddress().getHostAddress();//获得传过来的用户的ip</P>
  45. <P> try{
  46.   //首先要进行验证
  47.   for(int x=0; x<3; x++){
  48.   BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));</P>
  49. <P>  String name = bufIn.readLine();</P>
  50. <P>  BufferedReader bufr = new BufferedReader(new FileReader("user.txt"));//读取数据库</P>
  51. <P>  PrintWriter out = new PrintWriter(s.getOutputStream(),true);//服务端的输出流</P>
  52. <P>  String line = null;
  53.   
  54.   boolean flag = false;//用一个标记来看是否找到用户
  55.   while((line=bufr.readLine())!=null){
  56.   if(line.equals(name)){
  57.   flag = true;
  58.   break;//跳出for循环
  59.   }
  60.   }
  61.   if(flag){//如果登陆成功
  62.   System.out.println(name + "已登录");
  63.   out.println(name+"欢迎光临");
  64.   break;
  65.   }
  66.   else{//如果登陆不成功
  67.   System.out.println(name + "尝试登录");
  68.   out.println(name+"用户名不存在");
  69.   }
  70.   }
  71.   s.close;
  72. }
  73. catch(){}
  74. }
  75. }</P>
  76. <P>//服务端
  77. public class Server{
  78.    
  79.    public static void main(String[] args)
  80.    {
  81.     ServerSocket ss = new ServerSocket(10008);//将服务端的套接字绑定在客户端的端口上进行监听</P>
  82. <P>    while(true){
  83.     Socket s == ss.accept();</P>
  84. <P>    //同时允许多用户进行登陆,将客户端线程封装起来
  85.     new Thread(new UserThread(s)).start();
  86.     }
  87.    }</P>
  88. <P>}</P>
  89. <P>二、自定义服务端</P>
  90. <P>自定义的服务端要求能够与客户端进行连接,接受其发过来的请求或信息,根据需求自定义方法进行处理,并将结果反馈给用户。初学者可以先从简单的功能做起,然后模仿tomcat服务器逐步增加新的功能。简单的自定义服务端示例如下:</P>
  91. <P>//服务器端
  92. import java.net.*;
  93. import java.io.*;
  94. class ServerDemo
  95. {
  96. public static void main(String[] args)throws Exception{</P>
  97. <P>  Socket s = ss.accept();//连接服务端和客户端
  98.   System.out.println(s.getInetAddress().getHostAddress());//输出客户端的地址</P>
  99. <P>  PrintWriter out = new PrintWriter(s.getOutputStream(),true);//服务端输出流</P>
  100. <P>  out.println("客户端你好");//反馈给客户端的信息</P>
  101. <P>  s.close();//关闭客户端套接字</P>
  102. <P>  ss.close();//关闭服务端套接字

  103. }
  104. }</P>
  105. <P>//浏览器客户端</P>
  106. <P>import java.io.*;
  107. import java.net.*;</P>
  108. <P>class MyIE{
  109.    
  110.    public static void main(String [] args) throws Exception{
  111.    
  112.    Socket s = new Socket("180.125.239.175",8080);//8080为http上网的默认端口号</P>
  113. <P>   PrintWriter out = new PrintWriter(s.getOutputStream(),true);</P>
  114. <P>   //在java语言中通过输出html的规范语言来形成一个网页
  115.    out.println("GET/myweb/domo.html HTTP/1.1");
  116.    out.println("Accept:");
  117.    out.println("Accept-Language:zh-cn");
  118.    out.println("Host:180.125.239.175:11000");
  119.    out.println("Connection:Keep_Alive");</P>
  120. <P>
  121.    BufferedReader bufr = new BufferedReader(new InputStreamReader(s.getInputStream()));//输入流</P>
  122. <P>   String line = null;//line属性用来读取客户端输入的内容</P>
  123. <P>   while((line = bufr.readLine())!= null){
  124.    System.out.println(line);
  125.    }
  126.    s.close();//关闭套接字</P>
  127. <P>   }
  128. }</P>
  129. <P>
  130. 三、自定义浏览器
  131.     除了用传统的“黑窗口”可以与服务端进行交互之外,我们还可以自定义GUI浏览器实现该功能。它主要是讲图形用户接口跟相应的链接类进行对应,当用户点击某一按钮或输入内容时能够达到希望得到的结果。</P>
  132. <P> 简单的示例如下:</P>
  133. <P> import java.awt.*;
  134. import java.awt.event.*;
  135. import java.io.*;</P>
  136. <P> class MyIEByGUI
  137. {
  138.   private Frame f;
  139.   private TextField tf;
  140.   private Button but;
  141.   private TextArea ta;</P>
  142. <P>  private Dialog d;
  143.   private Label lab;
  144.   private Button okBut;</P>
  145. <P>  MyIEByGUI(){//构造方法
  146.   
  147.   init();
  148.   
  149.   }</P>
  150. <P>  public void init(){//构造方法中调用的初始化方法
  151.   
  152.   f =new Frame("my window");
  153.   f.setBounds(300,100,600,500);//设置frame边框大小
  154.   f.setLayout(new FlowLayout());//设置布局为流式布局</P>
  155. <P>  tf = new TextField(60);//文本框用来输入内容
  156.   but = new Button("转到");//定义一个转到按钮
  157.   ta = new TextArea(25,70);//共25行,每行最多70个字
  158.   d = new Dialog(f,"提示信息 -self",true);//提示信息
  159.   d.setBounds(400,200,240,150);//提示窗口的大小和位置
  160.   d.setLayout(new FlowLayout());//提示窗口的布局
  161.   lab = new Label();//标签
  162.   okBut = new Button("确定");//确定按钮
  163.         
  164.   //将标签和按钮添加到提示框上
  165.   d.add(lab);
  166.   d.add(okBut);</P>
  167. <P>        //将文本域等添加到frame上
  168.   f.add(tf);
  169.   f.add(but);
  170.   f.add(ta);</P>
  171. <P>  myEvent();//自定义动作方法
  172.   f.setVisible(true);//必须将此值设置为true才能显示文本框</P>
  173. <P>  }</P>
  174. <P>        //次方法用来给组建添加监听器
  175.   private void myEvent(){</P>
  176. <P>  //button添加监听器
  177.   okBut.addActionListener(new ActionListener(){
  178.   public void actionPerformed(ActionEvent e){
  179.   d.setVisible(false);
  180.   }
  181.   });
  182.      //提示框添加窗口监听器
  183.   d.addWindowListener(new WindowAdapter(){
  184.   public void windowClosing(WindowEvent e){
  185.   d.setVisible(false);
  186.   }
  187.   });
  188.         //文本域添加KeyListener
  189.   tf.addKeyListener(new KeyAdapter(){
  190.   public void keyPressed(KeyEvent e){
  191.   if(e.getKeyCode() == KeyEvent.VK_ENTER)
  192.    showDir();
  193.   }
  194.   });
  195.         //按钮添加动作监听器
  196.   but.addActionListener(new ActionListener(){
  197.   public void actionPerformed(ActionEvent e){
  198.   
  199.   showDir();</P>
  200. <P>  }
  201.   });
  202.         //窗口设置关闭操作
  203.   f.addWindowListener(new WindowAdapter(){
  204.   
  205.   public void windowClosing(WindowEvent e){
  206.   System.exit(0);
  207.   }
  208.   });
  209.   }</P>
  210. <P>        //
  211.   private void showDir(){
  212.   
  213.   String dirPath = tf.getText();//获取用户输入的内容</P>
  214. <P>  File dir = new File(dirPath);</P>
  215. <P>  if(dir.exists() && dir.isDirectory()){
  216.   
  217.   ta.setText("");
  218.   String[] names = dir.list();
  219.   for(String name : names){
  220.   ta.append(name +"\r\n");
  221.   }</P>
  222. <P>  }
  223.   else{
  224.   String info = "您输入的信息:" + dirPath + "是错误的,请重新输入!";
  225.    lab.setText(info);
  226.       d.setvisible(true);
  227.   }
  228.   
  229.   }</P>
  230. <P>  //主方法体
  231.    public static void main(String[] args){
  232.    
  233.    new MyIEByGUI();
  234.    }
  235. }</P>
  236. <P>
  237. PS:这部分的视频主要带领大家了解B/S和C/S模式,并学会编程实现客户端与服务端的交互,核心原理即通过套接字将客户端与服务端建立连接,然后通过流的方式将客户端请求传递到服务端,服务端经过处理后把结果反馈给用户。</P>
复制代码

3 个回复

正序浏览
曹睿翔 发表于 2013-5-22 13:10
不是打包给我看的,是给大伙看的,重新编辑下,有劳了

~~~~~已改:)

点评

哎,我以为我忙,你们更忙,还是我帮你修改吧  发表于 2013-6-9 09:41
回复 使用道具 举报
曹睿翔 来自手机 金牌黑马 2013-5-22 13:10:07
沙发
不是打包给我看的,是给大伙看的,重新编辑下,有劳了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马