小奥的学习笔记

  • Home
  • Learning & Working
    • Speech Enhancement Notes
    • Programming language
    • Computer & DL
    • MOOC
  • Life
    • Life Time
    • Thinking & Comprehension
    • Volunteer
    • Plan
    • Travel
  • Footprints
  • GuestBook
  • About
    • About Me
    • 个人履历
    • 隐私策略
  1. 首页
  2. Study-notes
  3. Programming language
  4. Java
  5. 正文

Java语言程序设计(进阶)(第四章)整理

2018年4月3日 1466点热度 0人点赞 0条评论

第四章 网络编程(上)

4.1 URL对象

例:通过URL读取WWW信息

代码:

import java.net.*;
import java.io.*;
 
public class URLReader{
       public static void main(String[] args) throws Exception{
              URL cs = new URL("http://www.yushuai.me/");
              BufferedReader in = new 
       BufferedReader(new InputStreamReader(cs.openStream()));
              String inputLine;
              while((inputLine  = in.readLine())!=null)
                     System.out.println(inputLine);
              in.close();
       }
}

构造URL对象:

(1)public URL(String spec)

URL urlBase = new URL("http://www.yushuai.me");

直接把网址作为一个字符串,然后并作为参数传递给URL资源。

(2)我还可以用一个URL对象来表示它的上下文的这个环境

public URL(URL context, String spec)

URL yushuai = new URL("http://www.yushuai.me/pages/1");

URL yush = new URL(yushuai, "Gamelan.game.html");

URL gamelanNetwork = new URL(gamelan, "Gamelan.net.html");

获取URL对象属性:

public String getProtocol():返回你所描述的URL访问时采用的协议;

public String getHost():获得它的主机名;

public String getPort():获得端口号;

public String getFile():获得文件名;

public String getRef():获得引用地址。

4.2 URL Connection对象

这个对象代表了java和互联网资源上的一个访问链接,可以通过它对URL资源进行读写。它与URL的区别是,URL是单向,而本对象是双向,本对象还可以查看服务器的相响应消息的首部,它还可以设置客户端请求消息的首部。

1.使用URLConnection通信的一般步骤:

(1)构造一个URL对象;

(2)调用URL对象的openConnection()方法获得对应URL的URLConnection对象;

(3)配置此URLConnect对象;

(4)读取首部字段;

(5)获得输入流以便进行读取数据;

(6)获得输出流写入数据;

(7)关闭连接。

例:通过URLConnection抓取网页

代码:

import java.net.*;
import java.io.*;
 
public class URLReader{
    public static void main(String[] args){
       try {
           URL cs =new URL("http://www.yushuai.me/");
           URLConnection tc =cs.openConnection();
           BufferedReader in = new 
   BufferedReader(new InputStreamReader(tc.getInputStream()));
           String inputLine;
           while((inputLine = in.readLine())!= null)
              System.out.println(inputLine);
           in.close();
       }catch(MalformedURLException e) {
           System.out.println("MalformedURLException");
       }
       catch(IOException e) {System.out.println("IOException");}
    }
}

4.3 Get请求与Post请求

例:发送get请求

代码:

  

  public static String sendGet(String url, String param) {
       String result = "";
       BufferedReader in = null;
       try {
           String urlNameString = url + "?" + param;
           URL realUrl = new URL(urlNameString);
           // 打开和URL之间的连接
           URLConnection connection = realUrl.openConnection();
           // 设置通用的请求属性
           connection.setRequestProperty
           ("accept", "*/*");
           connection.setRequestProperty
           ("connection", "Keep-Alive");
           // 建立实际连接
           connection.connect();
           // 定义BufferedReader输入流来读取URL的响应
           in = new BufferedReader
      (new InputStreamReader(connection.getInputStream()));
           String line;
           while ((line = in.readLine()) != null) {
              result += line;
           }
       } catch (Exception e) {
       } finally {
           try {
              if (in != null) {
                  in.close();
              }
           } catch (final Exception e2) {
           }
           return result;
       }
    }

发送POST请求,POST请求的参数需要通过URLConnection的输出流来写入参数。

例:发送POST请求

代码:

  

  public static String sendPost(String url, String param) {
       PrintWriter out = null;
       BufferedReader in =null;
       String result = "";
       try {
           URL realUrl = new URL(url);
           //打開和URL之間的連接
           URLConnection conn =
            realUrl.openConnection();
           //设置通用的请求属性
           conn.setRequestProperty("accept", "*/*");
           conn.setRequestProperty
           ("connection", "Keep-Alive");
           //允许输出流
           conn.setDoOutput(true);
           //获取URLConnection对象对应的输出流
           out = new PrintWriter(conn.getOutputStream());
           //发送请求参数
           out.print(param);
           out.flush();
           in = new 
  BufferedReader(new InputStreamReader(conn.getInputStream()));
           String line;
           while((line = in.readLine())!=null) {
              result +=line;
           }
       }
       catch(Exception e) {}
       finally {
           try {
              if(out!=null) {
                  out.close();
              }
              if(in!=null) {
                  in.close();
              }
           }catch(IOException ex) {}
       }
       return result;

    }

HttpURLConnection类在URLConnection的基础上提供一系列针对http请求的内容:

    (1)HTTP状态码(例如HTTP_OK:200);

(2)setRequestMethod(设置请求方法get/post等);

(3)getResponseCode(获取HTTP响应)。

4.4 Socket通信原理

本节讲述如何在两个java程序之间建立网络连接。

网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端成为一个socket。Socket通常用来实现客户方和服务方的连接。

怎样用socket大道客户端和服务端之间的通信呢?

如图1所示,客户端有一个客户端的ClientSocket,在Server端也有一个ServerStocket。由客户端向服务器端发出一个Socket连接请求,服务器收到后会给它返回一个响应信号,在客户端就建立了连接。

1522765551117781.jpg

图1

4.5 Socket通信实现

1.创建Socket

①Socket()

②Socket(InetAddress address, int port);

③Socket(String host, int port);

④Socket(InetAddress host, int port, InetAddress localAddr, int localPort);

⑤Socket(String host, int port, InetAddress localAddr, int localPort)

例:客户端Socket的建立

代码:

try{
       Socket socket = new Socket("127.0.0.1", 2000);//2000是端口号
}catch(IOException e){
       System.out.println("Error:" +e);
}

例:服务器端Socket的建立

代码:

ServerSocket server =null;
try{
       server = new ServerSocket(2000);
}catch(IOException e){
       System.out.println("can not listen to:" +e);
}
Socket socket = null;
try{
       socket = server.accept();
//accept方法代表等着客户端发送链接请求,
//如果没有客户端发请求,它就一致循环执行,直到客户端发送请求来。
}catch(IOException e){
       System.out.println("Error:" +e);
}

2.打开输入/输出流

利用socket构建几个输入输出流。如图2所示,第一行就是通过我们一个socket对象的getoutputstream方法获得一个输出流,反过来理解就是拿到socket输入流以后外面包一层BufferedOutputStream,然后外面再包一层PrintStream,这样利用PrintStream就可以进行通讯了。只不过这是一个输出流。输出流是干什么用的呢?站在java程序来看,这个输出流就是往外发送信息的。

第二行来说,这是一个输入流。我们通过socket对象的getInputStream方法获得了输入流,然后在外面包了一层DataInputStream。

所以我们构造了这个socket输入输出流了以后,就可以用来进行通讯。第三行和第四行是另外一种方式来构造socket的输入输出流。

3.进行读写操作。

4.关闭socket

在关闭socket之前,先关闭输入输出流,使用close()方法。记住,先关闭流,再关闭socket。

例:命令行聊天程序

客户端代码:

import java.io.*;
import java.net.*;
 
public class TalkClient {
 
    public static void main(String[] args) {
       // TODO Auto-generated method stub
       try {
           //构造一个socket,端口号4700
           Socket socket = new Socket("127.0.0.1", 4700);
           //构造三个输入输出流。
           //第一个sin是键盘输入流。第二个os输出流,
           //从客户端发信息给服务端
           BufferedReader sin = new 
     BufferedReader(new InputStreamReader(System.in));
           PrintWriter os = new 
     PrintWriter(socket.getOutputStream());
           //第三个是接受网络上发给我的信息
           BufferedReader is = new
  BufferedReader(new InputStreamReader(socket.getInputStream()));
           //接受信息
           String readline;
           readline = sin.readLine();
           while(!readline.equals("bye"))
           {
              os.println(readline);
              os.flush();
              //下面是打印客户端和服务器端发送的信息
              System.out.println("Client:"+ readline);
              System.out.println("Server:"+ is.readLine());
              readline = sin.readLine();//再获取客户键盘输入
           }
           os.close();
           is.close();
           socket.close();//先关闭流再关闭socket
       }catch(Exception e) {
           System.out.println("Error"+e);
       }
 
    }
 
}

服务器端代码:

import java.io.*;
import java.net.*;
import java.applet.Applet;
 
public class TalkServer {
 
    public static void main(String[] args) {
       // TODO Auto-generated method stub
       try {
           ServerSocket server = null;
           //声明一个serversocket对象
           try {
              server = new ServerSocket(4700);
           }catch(Exception e) {
              System.out.println("can not listen to:" +e);
           }
           Socket socket = null;
           try {
              socket = server.accept();
           }catch(Exception e) {
              System.out.println("Error."+e);
           }
           //下面开始通信。第一个流是读入客户端发送的信息。
           //第二个是发送信息给客户端,第三个是键盘输入流
           String line;
           BufferedReader is = new
     BufferedReader(new InputStreamReader(socket.getInputStream()));
           PrintWriter os =new 
    PrintWriter(socket.getOutputStream());
           BufferedReader sin = new 
   BufferedReader(new InputStreamReader(System.in));
           System.out.println("Client:"+is.readLine());
           line =sin.readLine();
           while(!line.equals("bye"))
           {
              os.println(line);
              os.flush();
              //下面是打印客户端和服务器端发送的信息
              System.out.println("Server:"+ line);
              System.out.println("Client:"+ is.readLine());
              line = sin.readLine();
              
           }
           os.close();
           is.close();
           server.close();
       }catch(Exception e) {\
           System.out.println("Error:"+e);
       }
 
    }
 
}

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: Java
最后更新:2018年4月3日

yszhang

这个人很懒,什么都没留下

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

搜索
欢迎关注我的个人公众号
最新 热点 随机
最新 热点 随机
DEEPFILTERNET:一种基于深度滤波的全频带音频低复杂度语音增强框架 奥地利匈牙利九日游旅程 论文阅读之Study of the General Kalman Filter for Echo Cancellation 小奥看房之鸿荣源珈誉府 杭州往返旅途及西溪喜来登和万怡的体验报告 2022年的第一篇碎碎念
奥地利匈牙利九日游旅程论文阅读之Study of the General Kalman Filter for Echo CancellationDEEPFILTERNET:一种基于深度滤波的全频带音频低复杂度语音增强框架
《青春如歌》(莱芜一中51级1级部11班纪念册)电子版正式发布 Python chapter 6 learning notes 数据结构【浙江大学】(第5节)整理 爱情的三个问题——我提出的 流浪歌手 退出奥赛
标签聚合
算法 学习 Python Java leetcode 鸟哥的linux私房菜 linux python学习 高中 生活
最近评论
davidcheung 发布于 6 个月前(02月09日) The problem has been fixed. May I ask if you can s...
tk88 发布于 6 个月前(02月07日) Hmm is anyone else having problems with the pictur...
cuicui 发布于 10 个月前(10月20日) :wink:
niming 发布于 11 个月前(09月19日) 同级校友,能刷到太巧了
davidcheung 发布于 2 年前(08月16日) 我得找一下我之前整理的word文档看一下,如果找到了我就更新一下这篇文章。
Nolan 发布于 2 年前(07月25日) 您的笔记非常有帮助。贴图不显示了,可以更新一下吗?
davidcheung 发布于 3 年前(06月19日) 到没有看webrtc的代码。现在主要在看我们公司的代码了。。。只是偶尔看一看webrtc的东西。。。
aobai 发布于 3 年前(03月13日) gain_change_hangover_ 应该是每三个block 只能够调整一次,这样保证每帧...
匿名 发布于 5 年前(12月30日) 烫
小奥 发布于 5 年前(12月12日) webRTC里面的NS本身我记得就是在C++里面呀

COPYRIGHT © 2025 小奥的学习笔记. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

陕ICP备19003234号-1

鲁公网安备37120202000100号