Core Java第十五章知识点总结——网络编程
知识点预览
网络应用的结构
网络中的基本概念
TCP编程
UDP编程
URL编程
网络应用的结构
1. 网络应用的结构
2. IP地址
a) 概念:用于唯一识别连接到Internet上的计算机
b) 地址表示形式
i. IPV4:点分十进制表示方式,四个整数用点分开,每个十进制数字代表一个8bits整数 如 192.168.123.1
ii. IPV6:点分十六进制表示方式,八个整数用点分开,每个十六进制数字代表一个16bits整数 如:CDCD:910A:2222:5498:8475:1111:3900:2020
3.域名 便于记忆 由DNS(域名服务器)进行解析
4.本地IP 127.0.0.1等同于localhost
5.端口号 数字 计算机网络中的计算机唯一标识一个软件(或者说进程)
6.协议
TCP编程
1.TCP协议简介
TCP协议是一个有连接、可靠的协议。
类似于打电话
可靠:数据不会丢失,接收方接收的数据包有序
2. TCP编程
java.net.Socket//套接字
java.net.ServerSocket
3. TCP编程的核心思路
a)开发服务器端
ServerSocket ss = newServerSocket();
ss.accept();
b) 开发客户端
Socket s = new Socket(“150.236.56.101”,9000);
4.总结
a)服务器端
i. 创建ServerSocket对象(并绑定端口)
ii.调用accept方法,等待客户端的连接
iii.调用getXXXStream,并进行I/O
iv.关闭Socket
b) 客户端
i.创建Socket对象,并连接服务器
ii. 调用getXXXStream,并进行I/O
iii.关闭Socket
5. 具体示例
a) 客户端发送一个helloworld串
package chp15.ex01;import java.io.PrintWriter;import java.net.Socket;/** * * @Author: Wentasy * @FullName: TCPClient.java * @Description: TCP客户端的创建 * @Create Date: 2012-8-20 */public class TCPClient {public static void main(String[] args) throws Exception {//创建Socket对象(并连接服务器)Socket s = new Socket("127.0.0.1", 9001);//调用getXXXStream方法,进行I/OPrintWriter pw = new PrintWriter(s.getOutputStream());pw.println("hello world");pw.flush();//关闭 s.close();}}
b) 服务器端接受字符串并打印
package chp15.ex01;import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.ServerSocket;import java.net.Socket;/** * * @Author: Wentasy * @FullName: TCPServer.java * @Description: TCP服务器端的创建 * @Create Date: 2012-8-20 */public class TCPServer {public static void main(String[] args) throws Exception {//创建ServerSocket对象(并绑定端口)ServerSocket ss = new ServerSocket(9001);//调用accept方法Socket s = ss.accept();//调用getXXXStream方法,进行I/OBufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));String line = br.readLine();System.out.println(line);//关闭Sockets.close(); }}
c)客户端发送一个helloworld串,并接受服务器端回传的from serve helloworld
package chp15.ex02;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;/** * * @Author: Wentasy * @FullName: TCPClient.java * @Description: TCP 客户端 完成读写 * @Create Date: 2012-8-20 */public class TCPClient {public static void main(String[] args) throws Exception {//创建Socket对象(并连接服务器)Socket s = new Socket("127.0.0.1", 9000);//调用getXXXStream方法,进行I/OPrintWriter pw = new PrintWriter(s.getOutputStream());pw.println("hello world");pw.flush(); BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));String line = br.readLine(); System.out.println(line);//关闭Sockets.close();}}
d)服务器端回传的from serve helloworld
package chp15.ex02;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;/** * * @Author: Wentasy * @FullName: TCPServer.java * @Description: TCP服务器端 完成读写 * @Create Date: 2012-8-20 */public class TCPServer {public static void main(String[] args) throws Exception {ServerSocket ss = new ServerSocket(9000);Socket s = ss.accept();BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));String line = br.readLine();PrintWriter pw = new PrintWriter(s.getOutputStream());pw.println("from server" + line );pw.flush();s.close();}}
6. 程序存在的问题:服务器只能运行一次
while(true){
调用accept()方法
调用getXXXStream方法,进行I/O
关闭Socket
}
package chp15.ex03;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;/** * * @Author: Wentasy * @FullName: TCPServer.java * @Description: TCP 服务器端 带多线程 * @Create Date: 2012-8-20 */class ServerThread extends Thread{private Socket s; public ServerThread(Socket s) {this.s = s;}public void run(){try{BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));String line = br.readLine();PrintWriter pw = new PrintWriter(s.getOutputStream());pw.println(line + " from server");pw.flush();} catch (IOException e) {e.printStackTrace();}finally{try {s.close();} catch (IOException e) {e.printStackTrace();}}}}public class TCPServer {public static void main(String[] args) throws Exception {ServerSocket ss = new ServerSocket(9000);while(true){ Socket s = ss.accept(); Thread st = new ServerThread(s); st.start();}}}package chp15.ex03;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;/** * * @Author: Wentasy * @FullName: TCPClient.java * @Description: TCP 客户端 * @Create Date: 2012-8-20 */public class TCPClient {public static void main(String[] args) throws Exception {//创建Socket对象(并连接服务器)Socket s = new Socket("127.0.0.1", 9000);//调用getXXXStream方法,进行I/OPrintWriter pw = new PrintWriter(s.getOutputStream());pw.println("hello world");pw.flush(); BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));String line = br.readLine(); System.out.println(line);//关闭Sockets.close();}}
UDP编程
1.UDP协议简介
UDP是一个无连接,不可靠的协议。即:数据的发送方只负责将数据发送出去,数据的接收方值负责接收数据。发送方和接收方不会相互确认数据的传输是否成功。
存在的意义:效率高,在实时性较强的场合适用。
示例:发短信
2.UDP编程
java.net.DatagramSocket(想象成传真机)
java.net.DatagramPacket(想象成传真机上的纸)
3.UDP编程的核心思路
a) 服务器端 DatagramSocket socket = new DatagramSocket(9000);
b) 客户端 DatagramSocket socket = new DatagramSocket();
客户端不用端口号
端口号和协议相关 本机TCP和UDP可以使用相同的端口号
4. DatagramPacket
DatagramPacket(byte[] buf, int offset,int length);
DatagramPacket(byte[] buf, int offset,int length,SocketAddress);
SocketAddress:接口 使用时用它的实现类 InetSocketAddress
getAddress()/getSoketAddress()/getPort()/getLength()
setAddress()/setSoketAddress()/setPort()/setLength()
package chp15.ex05;import java.net.DatagramPacket;import java.net.DatagramSocket;/** * * @Author: Wentasy * @FullName: UDPServer.java * @Description: UDP 服务器端 完成读写 * @Create Date: 2012-8-20 */public class UDPServer {public static void main(String[] args) throws Exception {DatagramSocket socket = new DatagramSocket(9000); byte[] buf = new byte[100];DatagramPacket paper = new DatagramPacket(buf, 0, buf.length);socket.receive(paper);String str = new String(buf, 0 , paper.getLength());System.out.println(str);byte[] data = "hello client".getBytes();DatagramPacket packet = new DatagramPacket(data, 0 ,data.length,paper.getSocketAddress() );socket.send(packet);socket.close(); }}package chp15.ex05;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetSocketAddress;/** * * @Author: Wentasy * @FullName: UDPClient.java * @Description: UDP 客户端 完成读写 * @Create Date: 2012-8-20 */public class UDPClient {public static void main(String[] args) throws Exception {DatagramSocket socket = new DatagramSocket();String str = "hello server";byte[] data = str.getBytes();DatagramPacket packet = new DatagramPacket(data, 0, data.length,new InetSocketAddress("127.0.0.1", 9000));socket.send(packet);byte[] buf = new byte[100];DatagramPacket paper = new DatagramPacket(buf, 0, buf.length);socket.receive(paper);String msg = new String(buf, 0, paper.getLength());System.out.println(msg);socket.close();}}
URL编程
1. URL概念
URL统一资源定位符——互联网中唯一定位一个资源
2. URL组成
协议名://主机名(或者IP地址):端口号/资源
http://localhost:8080/web/a.jpg
http://www.oracle.com/index.html
3. URL编程
a) URL
b)URLConnection
4. URL编程思路
a) 创建URL对象
b) 调用URL对象的openConnection方法获得URLConnection对象
c) 调用URLConnection对象的getInputStream方法,获得输入流,从而获得资源
d) I/O操作
e) 关闭资源
package chp15.ex06;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.net.URL;import java.net.URLConnection;/** * * @Author: Wentasy * @FullName: TestURL.java * @Description: URL 编程 * a)创建URL对象b)调用URL对象的openConnection方法获得URLConnection对象c)调用URLConnection对象的getInputStream方法,获得输入流,从而获得资源d)I/O操作e)关闭资源 * @Create Date: 2012-8-20 */public class TestURL {public static void main(String[] args) throws Exception {//创建URL对象URL url = new URL("http://www.oracle.com");//调用URL对象的openConnection方法,获得URLConnectionURLConnection conn = url.openConnection();//调用URLConnection方法的getInputStreamInputStream in = conn.getInputStream();//I/O操作BufferedReader br = new BufferedReader(new InputStreamReader(in));String line = null;while( (line=br.readLine()) != null ){System.out.println(line);}br.close(); }}
“人无完人金无足赤”,只要是人就不会是完美的,