你的位置:首页 > Java教程

[Java教程]JAVA基础学习day25


一、上传图片

1.1、示例

 

/*上传图片*/import java.net.*;import java.io.*;import java.util.*;import java.text.*;/*客户端1.建立客户端服务2.读取客户端已经有数据,,将文件名发送给服务端3.通过Scoket,输出流将数据发送给服务端4.接收服务端返回信息5.关流Socket和流资源*/class UploadClient1{  public static void main(String[] args) throws Exception  {    //建立片客户端服务    Socket s=new Socket("localhost",10009);    //客户端资源    File file=new File("d:\\1.jpg");    //获取文件名    String filename=file.getName();    //获取打印流,并将文件名发送到服务端,true表示自动刷新    PrintWriter pw=new PrintWriter(s.getOutputStream(),true);    pw.println(filename);    //字节缓冲流读取文件    BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file));    //字节缓冲输出流     BufferedOutputStream bosOut=new BufferedOutputStream(s.getOutputStream());        int len=0;    while((len=bis.read())!=-1)    {      bosOut.write(len);      bosOut.flush();    }    //增加结束标记    s.shutdownOutput();    //字节缓冲输入流,用于接收服务端发回的数据    BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));    String rep=br.readLine();    System.out.println(rep);    bis.close();    s.close();  }}/*服务端1.建立服务端服务,并指定端口2.接收客户端发送的文件名,读取客户端发送的数据3.通过Scoket,输出流将数据写在服务端文件4.发送返回信息5.关流Socket和流资源*/class UploadServer1{  public static void main(String[] args) throws Exception  {    //建立服务端服务,指定端口    ServerSocket ss=new ServerSocket(10009);        //建立客户端Socket对象    Socket s=ss.accept();    //字节缓冲输入流,用于接收服务端发回的数据    BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));          String filename=br.readLine();    System.out.println(filename);    //文件读取流    BufferedInputStream bisIn=new BufferedInputStream(s.getInputStream());    //建立服务端文件    File file=new File("f:\\",filename);    if(file.exists())    {      //如果文件存在就重命名      SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd HHmmss");      Date date=new Date();      String time=sdf.format(date);      //只获取文件名的部分      String name=filename.substring(0,filename.indexOf("."));      String prefix=name+time;        //扩展名      String suffix=filename.substring(filename.indexOf("."));      filename=prefix+suffix;      //重新指定文件      file=new File("f:\\",filename);          }    FileOutputStream fos=new FileOutputStream(file);    byte[] bufw=new byte[1024];    int len=0;    while((len=bisIn.read(bufw))!=-1)    {      fos.write(bufw,0,len);    }    PrintWriter pw=new PrintWriter(s.getOutputStream(),true);    pw.println("上传成功");    fos.close();    s.close();    ss.close();  }}

 

 

二、客户端并发,使用多线程

2.1、示例

客户端:

 

package com.pb.demo2;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.io.OutputStream;import java.io.PrintWriter;import java.net.Socket;/*客户端*/class FileUploadClient {  public static void main(String[] args) throws Exception  {    //建立片客户 端服务    Socket s=new Socket("localhost",10010);    //获取文件    File file=new File("d:\\gm.mp3");    //获取流把文件名发送出去    String filename=file.getName();    System.out.println(filename);    PrintWriter pw=new PrintWriter(s.getOutputStream(),true);    //发送文件名    pw.println(filename);    //输出流    OutputStream os=s.getOutputStream();    //文件读取流    FileInputStream fis=new FileInputStream(file);    int len=0;    byte [] buf=new byte[1024];    //开始读取,并把文件通过网络流socket发送到服务端    while((len=fis.read(buf))!=-1)    {      os.write(buf,0,len);    }    //发送发闭,发送结束标记    s.shutdownOutput();    //接收服务器返回的信息    InputStream is=s.getInputStream();        byte []   bfw=new byte[1024];    int repLen=is.read(bfw);    String rep=new String(bfw,0,repLen);    System.out.println(rep);    fis.close();    s.close();  }}

 

服务端

package com.pb.demo2;import java.net.ServerSocket;import java.net.Socket;/*服务端*/class FileUploadServer{  public static void main(String[] args) throws Exception  {    //建立服务端服务    ServerSocket ss=new ServerSocket(10010);      //建立循环监听,一直运行    while(true)     {      Socket s=ss.accept();      //每个客户端 都一个单独的线程      new Thread(new FileServerThread(s)).start();    }      }}

线程

package com.pb.demo2;import java.io.BufferedReader;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.Socket;/*服务端线程类*/class FileServerThread implements Runnable{  //Socket做为参数  private Socket s;  public FileServerThread(Socket s)  {    this.s=s;  }  //多线程方法  public void run()  {      //定一个计数器用来给文件重命名      int count=1;      //获取IP      String ip=s.getInetAddress().getHostAddress();      System.out.println(ip+".................connected");    try    {  //读取流      BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));      //读取文件名      String filename=br.readLine();      System.out.println(filename);      File file=new File("f:\\",filename);      //判断文件是否存在      while(file.exists())      {          //截取文件名前缀与后缀        String prefix=null;        String suffix=null;        String name=filename.substring(0,filename.indexOf("."));        //判断文件名是否有(        if(name.contains("("))        {           prefix=filename.substring(0,filename.indexOf("("));        }else{          prefix=name;        }          prefix=prefix+"("+(count++)+")";         suffix=filename.substring(filename.lastIndexOf("."));        //文件名重命名        filename=prefix+suffix;        file=new File("f:\\",filename);        System.out.println(filename);      }      //读取文件      InputStream isr=s.getInputStream();      //输出流      FileOutputStream fos=new FileOutputStream(file);      int len=0;      byte []  bufw = new byte[1024];      while((len=isr.read(bufw))!=-1)      {        fos.write(bufw,0,len);      }      //发送信息到客户端       OutputStream os=s.getOutputStream();      os.write("上传成功".getBytes());            fos.close();      s.close();    }    catch (Exception e)    {      throw new RuntimeException("上传失败!");    }      }}

 

三、客户端 登录

3.1、示例

 

 

/*客户端 键盘输入用户名服务端对这个用户名进行校验如果该用户名存在,在服务端显示XXX,已经登录并在客户端显示XXX,欢迎光临如果该用户不存在,在服务端显示XXX,尝试登录并在客户显示XXX,该用户不存在最多登录三次*//*客户端*/import java.net.*;import java.io.*;class LoginClient{  public static void main(String[] args) throws Exception  {    //建立客户端服务    Socket s=new Socket("localhost",10010);    //接收键盘录入    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));    //打印流,向服务端发送信息    PrintWriter pw=new PrintWriter(s.getOutputStream(),true);    //接收服务端返回的信息    BufferedReader brIn=new BufferedReader(new InputStreamReader(s.getInputStream()));          for(int x=0;x<3;x++)    {    //接收键盘输入        String line=br.readLine();        if(line==null)          break;        pw.println(line);          //返回信息        String info=brIn.readLine();        System.out.println(info);        //比较是否登录成功        if(info.contains("欢迎"))          break;    }    br.close();    s.close();  }}/*服务端*/class LoginServer{  public static void main(String[] args) throws Exception  {      //建立服务端服务    ServerSocket ss=new ServerSocket(10010);    while(true)    {        //建立监听      Socket s=ss.accept();      new Thread(new LoginThread(s)).start();    }  }}/*服务端登录线程*/class LoginThread implements Runnable{  private Socket s;  public LoginThread(Socket s)  {    this.s=s;  }  public void run()  {  //IP    String ip=s.getInetAddress().getHostAddress();    System.out.println(ip+"......connected");    try    {      BufferedReader brIn=null;      BufferedReader br=null;      PrintWriter pw=null;      //只校验3次      for(int x=0;x<3;x++)      {  //读取客户端信息         brIn=new BufferedReader(new InputStreamReader(s.getInputStream()));                //用户名        String username=brIn.readLine();        if(username==null)          break;        //读取文件判断         br=new BufferedReader(new InputStreamReader(new FileInputStream("f:\\user.txt")));        //向客户端发送信息         pw=new PrintWriter(s.getOutputStream(),true);        //文件内容        String line=null;        boolean flag=false;        while((line=br.readLine())!=null)        {          if(line.equals(username))            {  //找到,结束,标记为true              flag=true;              break;            }        }        //判断        if(flag)        {          System.out.println(username+"已经登录!");          pw.println(username+",欢迎光临!");        }        else        {          System.out.println(username+"尝试登录!");          pw.println(username+",该用户不存在!");        }      }      //关闭      br.close();      s.close();    }    catch (Exception e)    {      throw new RuntimeException("登录失败");    }  }}/*user.txtzhangsanlisiwangwuqianqi*/

 

 

 

四、浏览器客户端-自定义服务端

4.1、示例

 

/*建立服务端,自定义服务端通过浏览器,访问服务端*/import java.net.*;import java.io.*;class ServerDemo{  public static void main(String[] args) throws Exception  {  //建立服务端    ServerSocket ss=new ServerSocket(11000);    //获取    Socket s=ss.accept();    String ip=s.getInetAddress().getHostAddress();    System.out.println(ip+"........connected");    //向浏览器客户端发送数据    PrintWriter out=new PrintWriter(s.getOutputStream(),true);    out.println("<font color='red' size='10'>"+ip+"客户</font>");    s.close();    ss.close();  }}

 

 

 

五、浏览器客户端-Tomcat服务端)

 

5.1、示例

六、自定义浏览器-tomcat

6.1、示例

 

package com.pb.tcp;import java.net.*;import java.io.*;class MyIE{  public static void main(String[] args) throws Exception  {    Socket s=new Socket("localhost",8080);    PrintWriter out=new PrintWriter(s.getOutputStream(),true);    out.println("GET /examples/index.jsp HTTP/1.1");    out.println("Accept: text/html, application/xhtml+);    out.println("Accept-Language: zh-CN");    out.println("Host: localhost:11000");    out.println("Connection: Keep-Alive");    out.println();    out.println();    System.out.println("==============");    InputStream is=s.getInputStream();    byte[] buf=new byte[1024];    int len=0;    while((len=is.read(buf))!=-1){    System.out.println(new String(buf,0,len));    }    s.close();  }}/*Http:请求头消息头GET / HTTP/1.1   浏览向服务器发送一个get请求,使用的是http:1.1协议Accept: text/html, application/xhtml+*/

==============HTTP/1.1 404 Not FoundServer: Apache-Coyote/1.1Content-Type: text/html;charset=utf-8Content-Language: enContent-Length: 1030Date: Sun, 18 Oct 2015 13:47:51 GMT<!DOCTYPE html><html><head><title>Apache Tomcat/8.0.26 - Error report</title><style type="text/css">H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}.line {height: 1px; background-color: #525D76; border: none;}</style> </head><body><h1>HTTP Status 404 - /examples/index.jsp</h1><div class="line"></div><p><b>type</b> Status report</p><p><b>message</b> <u>/examples/index.jsp</u></p><p><b>description</b> <u>The requested resource is not available.</u></p><hr class="line"><h3>Apache Tomcat/8.0.26</h3></body></html>

示例:图形化界面

package com.pb.demo2;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.net.*;import java.io.*;//http://localhost:8080/myweb/my.htmlpublic class MyFrame {    private Frame f;  private Button b;  private TextField tf;  private TextArea ta;    public MyFrame(){    init();  }  public void init(){    f=new Frame("我的窗体");    f.setBounds(300, 100, 600, 500);    f.setLayout(new FlowLayout());    tf=new TextField(50);    b=new Button("GO");    ta=new TextArea(20,50);    f.add(tf);    f.add(b);    f.add(ta);    myEvent();    f.setVisible(true);      }  public void myEvent(){        //按键添加监听器,事件输入完成,点按键执行        b.addActionListener(new ActionListener()        {          public void actionPerformed(ActionEvent e)          {              //调用显示             show();          }        }          );    //文本框添加事件监听,输入完成,敲回车执行        tf.addKeyListener(new KeyAdapter()        {          public void keyPressed(KeyEvent e)          {            if(e.getKeyCode()==KeyEvent.VK_ENTER)            {                //调用              show();            }          }        }          );  }  private void show(){    //获取文本框中输入的内容    String url=tf.getText();    //获取包含//的下标+2    int index1=url.indexOf("//")+2;    //获取/的下标    int index2=url.indexOf("/",index1);    //获取//----/之间的内容    String str=url.substring(index1, index2);    //按:分割192.168.1.254:8080    String [] arr=str.split(":");    String host=arr[0];    int port=Integer.parseInt(arr[1]);    //获取/后面的路径    String path=url.substring(index2);    //添加到文本域中    ta.append(host+"..."+port+"..."+path);    try {      showWeb(host,port,path);    } catch (Exception e) {      e.printStackTrace();    }      }  private void showWeb(String host,int port,String path) throws Exception{    //浏览器    Socket s=new Socket(host,port);    //打印流,true,自动刷新    PrintWriter out=new PrintWriter(s.getOutputStream(),true);    out.println("GET "+path+" HTTP/1.1");    out.println("Accept: */*");    out.println("Accept-Language: zh-CN");    out.println("Host: 127.0.0.1:11000");    out.println("Connection: Keep-Alive");    out.println();    out.println();    InputStream is=s.getInputStream();    byte [] buf=new byte[1024];    int len=0;    while((len=is.read(buf))!=-1){      ta.append(new String(buf,0,len));    }    s.close();      }      public static void main(String[] args) {    new MyFrame();  }}/*Http:请求头消息头GET / HTTP/1.1   浏览向服务器发送一个get请求,使用的是http:1.1协议Accept: text/html, application/xhtml+*/

 

七、URL数据方法获取

7.1、方法

 

URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。有关 URL 的类型和格式的更多信息,可从以下位置找到:

 

http://www.socs.uts.edu.au/MosaicDocs-old/url-primer.html

 

通常,URL 可分成几个部分。上面的 URL 示例指示使用的协议为 http (超文本传输协议)并且该信息驻留在一台名为 www.socs.uts.edu.au 的主机上。主机上的信息名称为 /MosaicDocs-old/url-primer.html。主机上此名称的准确含义取决于协议和主机。该信息一般存储在文件中,但可以随时生成。该 URL 的这一部分称为路径 部分。

 

URL 可选择指定一个“端口”,它是用于建立到远程主机 TCP 连接的端口号。如果未指定该端口号,则使用协议默认的端口。例如,http 协议的默认端口为 80。还可以指定一个备用端口,


 

构造方法摘要
URL(String spec)
根据 String 表示形式创建 URL 对象。
URL(String protocol, String host, int port, String file)
根据指定 protocolhostport 号和 file 创建 URL 对象。
URL(String protocol, String host, int port, String file, URLStreamHandler handler)
根据指定的 protocolhostport 号、filehandler 创建 URL 对象。
URL(String protocol, String host, String file)
根据指定的 protocol 名称、host 名称和 file 名称创建 URL。
URL(URL context, String spec)
通过在指定的上下文中对给定的 spec 进行解析创建 URL。
URL(URL context, String spec, URLStreamHandler handler)
通过在指定的上下文中用指定的处理程序对给定的 spec 进行解析来创建 URL。

 

方法摘要
booleanequals(Object obj)
比较此 URL 是否等于另一个对象。
StringgetAuthority()
获取此 URL 的授权部分。
ObjectgetContent()
获取此 URL 的内容。
ObjectgetContent(Class[] classes)
获取此 URL 的内容。
intgetDefaultPort()
获取与此 URL 关联协议的默认端口号。
StringgetFile()
获取此 URL 的文件名。
StringgetHost()
获取此 URL 的主机名(如果适用)。
StringgetPath()
获取此 URL 的路径部分。
intgetPort()
获取此 URL 的端口号。
StringgetProtocol()
获取此 URL 的协议名称。
StringgetQuery()
获取此 URL 的查询部分。
StringgetRef()
获取此 URL 的锚点(也称为“引用”)。
StringgetUserInfo()
获取此 URL 的 userInfo 部分。
inthashCode()
创建一个适合哈希表索引的整数。
URLConnectionopenConnection()
返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。
URLConnectionopenConnection(Proxy proxy)
与 openConnection() 类似,所不同是连接通过指定的代理建立;不支持代理方式的协议处理程序将忽略该代理参数并建立正常的连接。
InputStreamopenStream()
打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream
booleansameFile(URL other)
比较两个 URL,不包括片段部分。
protected voidset(String protocol, String host, int port, String file, String ref)
设置 URL 的字段。
protected voidset(String protocol, String host, int port, String authority, String userInfo, String path, String query, String ref)
设置 URL 的指定的 8 个字段。
static voidsetURLStreamHandlerFactory(URLStreamHandlerFactory fac)
设置应用程序的 URLStreamHandlerFactory
StringtoExternalForm()
构造此 URL 的字符串表示形式。
StringtoString()
构造此 URL 的字符串表示形式。
URItoURI()
返回与此 URL 等效的 URI

 

7.2、示例

 

URL url=new URL("http://127.0.0.1/myweb/demo.html?name=wangwu&age=89");  System.out.println("Protocol:"+url.getProtocol());  System.out.println("Host:"+url.getHost());  System.out.println("Port :"+url.getPort());  System.out.println("Path :"+url.getPath());  System.out.println("File :"+url.getFile());  System.out.println("Query :"+url.getQuery());

 

/* String getAuthority()      获取此 URL 的授权部分。 Object getContent()      获取此 URL 的内容。 Object getContent(Class[] classes)      获取此 URL 的内容。 int getDefaultPort()      获取与此 URL 关联协议的默认端口号。 String getFile()      获取此 URL 的文件名。 String getHost()      获取此 URL 的主机名(如果适用)。 String getPath()      获取此 URL 的路径部分。 int getPort()      获取此 URL 的端口号。 String getProtocol()      获取此 URL 的协议名称。 String getQuery()      获取此 URL 的查询部分。 String getRef()      获取此 URL 的锚点(也称为“引用”)。 String getUserInfo()      获取此 URL 的 userInfo 部分。 */

URL url=new URL("http://127.0.0.1:8080/myweb/my.html?name=java&age=30");    System.out.println("getAuthority:"+url.getAuthority());    System.out.println("getContent:"+url.getContent());    System.out.println("getDefaultPort:"+url.getDefaultPort());    System.out.println("getFile:"+url.getFile());    System.out.println("getHost:"+url.getHost());    System.out.println("getPath:"+url.getPath());    System.out.println("getPort:"+url.getPort());    System.out.println("getProtocol:"+url.getProtocol());    System.out.println("getQuery:"+url.getQuery());    System.out.println("getRef:"+url.getRef());    System.out.println("getUserInfo:"+url.getUserInfo());

 

 

 

getAuthority:127.0.0.1:8080getContent:sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@70dea4egetDefaultPort:80getFile:/myweb/my.html?name=java&age=30getHost:127.0.0.1getPath:/myweb/my.htmlgetPort:8080getProtocol:httpgetQuery:name=java&age=30getRef:nullgetUserInfo:null

示例2、URLConnection没有头文件

package com.pb.demo2;import java.io.*;import java.net.*;/* * URLConnection 封装了Socket */public class URLConnectionDemo {//127.0.0.1:8080/myweb/my.html?name=java&age=30  public static void main(String[] args) throws IOException {    URL url=new URL("http://127.0.0.1:8080/myweb/my.html?name=java&age=30");    //返回一个URL远程连接对象    URLConnection conn=url.openConnection();    //输出连接对象    System.out.println(conn);    InputStream is=conn.getInputStream();    int len=0;    byte[] buf=new byte[1024];    while((len=is.read(buf))!=-1){      System.out.println(new String(buf,0,len));          }      }}

sun.net.www.protocol.http.HttpURLConnection:http://127.0.0.1:8080/myweb/my.html?name=java&age=30<html><head>  <title>我的页面</title></head><body>  <h1>这是个标题</h1></body></html>

示例3:改变第六中的示例

package com.pb.demo2;import java.awt.Button;import java.awt.*;import java.awt.event.*;import java.io.*;import java.net.*;//http://localhost:8080/myweb/my.htmlpublic class MyFrame2 {            private Frame f;      private Button b;      private TextField tf;      private TextArea ta;            public MyFrame2(){        init();      }      public void init(){        f=new Frame("我的窗体");        f.setBounds(300, 100, 600, 500);        f.setLayout(new FlowLayout());        tf=new TextField(30);        b=new Button("GO");        ta=new TextArea(20,50);                f.add(tf);        f.add(b);        f.add(ta);                f.setVisible(true);        myEvent();              }      public void myEvent(){            //窗体监听器,            f.addWindowListener(new WindowAdapter(){              //关闭事件              public void windowClosing(WindowEvent e)              {                System.out.println("fsdfdsfds");                System.exit(0);              }            });                    //按键添加监听器,事件输入完成,点按键执行            b.addActionListener(new ActionListener()            {              public void actionPerformed(ActionEvent e)              {                  //调用显示                 try {                  show();                } catch (IOException e1) {                  e1.printStackTrace();                }              }            }              );            //文本框添加事件监听,输入完成,敲回车执行            tf.addKeyListener(new KeyAdapter()            {              public void keyPressed(KeyEvent e)              {                if(e.getKeyCode()==KeyEvent.VK_ENTER)                {                    //调用                  try {                    show();                  } catch (IOException e1) {                    // TODO Auto-generated catch block                    e1.printStackTrace();                  }                }              }            }              );      }      public void show() throws UnknownHostException, IOException{        ta.setText("");        //获取文本框中输入的内容        String urlPath=tf.getText();                        URL url=new URL(urlPath);        //和目标url建立连接        URLConnection conn=url.openConnection();        //添加到文本域中          //浏览器接收信息封装了Socket可以使用Socket中的流对象        InputStream is=conn.getInputStream();        byte [] buf=new byte[1024];        int len=0;        while((len=is.read(buf))!=-1){          ta.setText(new String(buf,0,len));            }      }                   public static void main(String[] args) {        new MyFrame2();      }}    /*    Http:请求头消息头    GET / HTTP/1.1   浏览向服务器发送一个get请求,使用的是http:1.1协议    Accept: text/html, application/xhtml+*/ 

 

八、域名解析

8.1、概述

127.0.0.1与localhost映射关系在本机

域名与IP可以在hosts中配置映射

C:\Windows\System32\drivers\etc\hosts文件中配置