黑马程序员--Java基础--网络编程java.net
来源:互联网 发布:留学生乱 知乎 编辑:程序博客网 时间:2024/06/05 07:17
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
网络编程 java.net
1. 找到对方IP2. 数据要发送到对方指定的应用程序上,为了标示这些应用程序,给这些应用程序都用数字进行标识,为了方便称呼这个数字叫做端口.3. 定义通讯规则.也成为协议.国际组织定义了一个通用协议:TCP/IP.
我们编程涉及带传输层和网际层.
IP地址的类:InetAddress.
端口号并未封装成对象,因为只有一个数字.
传输协议:TCP,UDP
UDP:
* 将数据及源和目的封装成数据包,不需要建立连接* 每个数据报的大小限制在64k内* 因无连接,是不可靠的协议* 不需要建立连接,速度快
TCP:
* 建立连接,形成传输数据的通道* 在连接中进行大量数据传输* 通过三次握手完成连接,是可靠协议.第一次发过来,对方收到,然后回复,然后再确认.再发出去,就可以传输数据了.* 必须建立连接,效率会稍低
一:网络传输
网络传输一般是先找到IP地址然后把数据发送到对方指定的应用程序上,网络应用程序都用数字进行标示,就是逻辑端口。通信规则就是协议,国际组织通信规则是TCP/IP。网络参考模型如图所示。
数据传输的时候都是从应用层开始往下推进,每过一层都会被数据封包,再经过传输线路传输到对方的主机上,再从物理层往上层层递进,每过一层都会被数据拆包,最后获得数据。传输层最常见协议是TCP和UDP,网际层常见协议就是IP。应用层是http协议。
二:网络通信三要素
1, IP地址:网络设备标示,本地循环地址127.0.0.1主机名localhost,IP地址是IP使用的32位或128位无符号数字,低级协议,TCP和UDP都是基于它建立而成的。
2, 端口号:标示进程的逻辑地址,0到65535,其中0到1024系统使用或者保留端口。
3, 传输协议:常见的TCP/UDP
Java.net包就是关于网络编程的数据包。
IP地址常用InetAddress类来表示,InetAddress常用的方法:
Socket:套接字
* 是一种为网络服务提供的一种机制* 通讯的两端都有Socket* 网络通讯其实就是Socket之间的通讯* 数据在两个Socket中用IO传输
UDP使用DatagramSocket,
需求:
通过udp传输服务,将一段文字数据发送出去.
思路:
1. 建立UDPSocket服务2. 提供数据,并将数据封装到数据包3. 通过Socket服务的发送功能,将数据包发送出去4. 关闭资源
package netDemos;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;public class UdpSendDemo1 { public static void main(String[] args) throws IOException { // TODO 自动生成的方法存根 // 创建udp服务,通过DatagramSocket对象. DatagramSocket ds = new DatagramSocket(8888); // 确定数据,并封装成数据包. byte[] data = "udp comes".getBytes(); DatagramPacket dp = new DatagramPacket(data, data.length, InetAddress.getByName("127.0.0.1"), 10003); // 通过socket服务将已有的数据包发送出去,通过send(); ds.send(dp); // 关闭资源// ds.close(); }}
改进程序使其可以发送键盘录入:
package netDemos;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;public class UdpSendDemo2 { public static void main(String[] args) throws IOException { // TODO 自动生成的方法存根 DatagramSocket ds = new DatagramSocket(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line = null; while((line=br.readLine())!=null) { byte[] buf = new byte[line.length()]; buf =line.getBytes(); DatagramPacket dp = new DatagramPacket(buf, line.length(),InetAddress.getByName("127.0.0.1"),10034); ds.send(dp); } }}
- 定义一个程序用于接受udp协议传输的数据并处理数据的.
- 定义接收端的时候都会监听一个端口,就是给这个接收网络应用程序定义个数字标识,
- 方便于明确哪些数据
- 1.建立udpsocket服务
- 2.定义一个数据包,因为要存储接受到的字节数据,因为数据包对象中有更多功能可以提取字节数据
- 不同数据信息.
- 3.通过socket服务的receive()将受到的数据存入已经定义好的数据包中.
- 4.通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上.
- 5.关闭资源.
-
*/
package netDemos;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;public class UdpRecDemo1 { public static void main(String[] args) throws IOException { // TODO 自动生成的方法存根 // 1.创建udp socket服务,建立端点 DatagramSocket ds = new DatagramSocket(10003); // 2.定义数据包用于存储数据 byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length); // 3.通过服务的receive方法将受到的数据存入数据包中 while (true) { ds.receive(dp); // 4.通过数据包的方法获取其中的数据 String ip = dp.getAddress().getHostAddress(); String data = new String(dp.getData(), 0, dp.getLength()); int port = dp.getPort(); System.out.println("received From:\t" + ip + ":" + port + "\r\n" + data);// ds.close(); } }}
需求
编写一个聊天程序.
有接收和发送数据的部分.需要同时运行,因此需要用到多线程技术.收和发是不一致的,因此要定义两个Run方法,要封装到不同的类中.
package netDemos;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;public class ChatDemo { public static void main(String[] args) throws IOException { DatagramSocket ss = new DatagramSocket(); DatagramSocket rs = new DatagramSocket(10100); new Thread(new Send(ss)).start(); new Thread(new Rec(rs)).start(); }}/* * 编写一个聊天程序 同时可以接收和发送,因此需要用到多线程. 要定义两个实现runnable接口的类. */class Send implements Runnable { private DatagramSocket ds; Send(DatagramSocket ds) { this.ds = ds; } public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line = null; while ((line = br.readLine()) != null) { if ("886".equals(line)) break; byte[] buf = line.getBytes(); DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 10100); ds.send(dp); } } catch (Exception e) { throw new RuntimeException("发送失败!"); } }}class Rec implements Runnable { private DatagramSocket ds; Rec(DatagramSocket ds) { this.ds = ds; } public void run() { try { while (true) { byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length); ds.receive(dp); String ip = dp.getAddress().getHostAddress(); String data = new String(dp.getData(),0,dp.getLength()); System.out.println(ip+":"+data); } } catch (Exception e) { // TODO: handle exception throw new RuntimeException("发送失败!"); } }}
package netDemos;import java.net.InetAddress;import java.net.UnknownHostException;public class IPDemo { public static void main(String[] args) throws UnknownHostException { // TODO 自动生成的方法存根 InetAddress[] ia2 = InetAddress.getAllByName("www.zhanqi.tv"); //获取服务器ip,由于网站服务器不止一个,因此ip有多个,那么InetAddress对象也有多个.用InetAddress数组接收. for(InetAddress is: ia2) { System.out.println(is.getHostAddress()+"\t"+is.getHostName()); } }}
Socket和ServerSocket
建立客户端和服务器端
建立连接后,通过Socket中的IO流进行数据的传输
关闭Socket
同样,客户端与服务器端是两个独立的应用.
演示Tcp传输:
Tcp分客户端和服务端.
客户端对应Socket,服务端对应ServerSocket.
客户端:通过查阅Socket对象发现该对象建立的时候就可以去连接指定的主机.因为tcp是面向连接的所以在建立Socket服务时就要有服务端存在并连接成功,形成通路后在该通道进行数据传输.
步骤:
创建客户端的Socket服务并指定要连接的主机和端口.通路一旦建立就有一个Socket流,这个流里面就有输入和输出流.getOutputStream(0;getInputStream();
package netDemos;import java.io.IOException;import java.io.OutputStream;import java.net.Socket;public class TcpClientDemo1 { public static void main(String[] args) throws IOException { // TODO 自动生成的方法存根 // 创建客户端的socket服务,指定目的主机和端口 Socket s = new Socket("127.0.0.1", 10009); OutputStream os = s.getOutputStream(); os.write("client run".getBytes()); s.close(); }}/* * * 1.tcp分客户端和服务端 2.服务端对应ServerSocket,客户端对应Socket * * 通过查阅Socket发现在该对象建立的时候就应该去连接指定主机. 因为tcp是面向连接的,因此在建立socket服务时就要有服务端存在,并连接成功. * 形成通路后在该通道进行数据传输 * * 创建socket服务并指定要连接的主机和端口. */
服务端没有流,使用客户端的流与客户端交互.
1. 服务端:定义端点接收数据并打印在控制台上 1. 建立服务端的Socket服务-->ServerSocket();并监听一个端口. 2. 获取连接过来的客户端对象.通过ServerSocket的accept().没有连接就会等(阻塞式方法). 3. 客户端如果发送过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据,并打印在控制台 4. 关闭服务端(可选择操作)
package netDemos;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.ServerSocket;import java.net.Socket;public class TcpServerDemo1 { public static void main(String[] args) throws IOException { // TODO 自动生成的方法存根 //建立服务端的socket服务并监听一个端口 ServerSocket ss = new ServerSocket(10009); //通过accept方法获取连接过来的客户端对象. Socket s = ss.accept(); System.out.println(s.getInetAddress().getHostAddress()+".....connected"); //获取客户端发送过来的数据,那么要使用客户端的读取流来读取数据. BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); String line = null; while((line = br.readLine())!=null) System.out.println(line); s.close(); }}/* * * * 定义端点接收数据并打印到控制台上. * 服务端: * 1.建立服务端Socket服务,ServerSocket,并绑定端口. * 2.获取连接的客户端对象.通过ss的accept();来完成.因此这个方法是阻塞式方法. * 3.客户端如果发送过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流 * 来读取发送过来的数据,打印在控制台 * */
演示Tcp的传输的客户端和服务端的互访:需求:客户端给服务端发送数据,服务端收到后给客户端反馈信息.
客户端:
建立Socket服务,指定要连接的主机和端口
获取Socket中的输出流将数据写到该流中通过网络发送给服务端.
获取Socket流中的输入流.将服务端反馈的数据获取到,并打印
关闭客户端资源
需求:建立一个文本转换服务器,客户端给服务端发送文本,服务端将文本转换成大写换回个以客户端,而且客户端可以不断进行文本转换,当客户端输入over时结束.
分析:
客户端:既然是操作设备上的数据,那么就可以使用io技术,并按照IO操作的规律来死开.
源:键盘录入.
目的:网络输出流.而且操作的是文本数据.
BufferedWriter bufw = new BufferedWriter(new )
步骤:
1. 建立服务2. 获取键盘录入3. 将数据发给服务端4. 获取服务端返回的大写数据,5. 3,4重复6. 结束,关闭资源
都是文本数据,可以使用字符流进行操作,同时提高效率,使用Buffered流.
BufferedReader bufr = new BufferedReader(InputStreamReader(System.in));//定义读取键盘数据的流对象
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));//定义目的,将数据写入到socket输出流,发送给服务端
package netDemos;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.Socket;public class TcpClientDemo3 { public static void main(String[] args) throws Exception { // TODO 自动生成的方法存根 Socket s = new Socket("127.0.0.1",10001); //定义读取键盘数据的流对象 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //定义目的,将数据写入到socket输出流,发送给服务端 BufferedWriter bwOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); //PrintWriter out = new PrintWriter(s.getOutputStream(),true); //然后使用out的println()方法直接输出. //定义一个socke读取流,读取服务端返回的大写信息 BufferedReader brIn = new BufferedReader(new InputStreamReader(s.getInputStream())); String line = null; while((line = br.readLine())!=null){ bwOut.write(line); bwOut.newLine(); // System.out.println(line); bwOut.flush(); if("over".equals(line)) break; Thread.sleep(1000); String inline = brIn.readLine(); System.out.println("Server:"+inline); } br.close(); }}
服务端:
源:Socket读取流
目的:Socket输出流.都是文本.
package netDemos;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.ServerSocket;import java.net.Socket;public class TcpServerDemo3 { public static void main(String[] args) throws IOException { // TODO 自动生成的方法存根 ServerSocket ss = new ServerSocket(10001); Socket s = ss.accept(); //读取socket读取流中的数据 String ip = s.getInetAddress().getHostAddress(); System.out.println(ip+".....connected"); BufferedReader brIn = new BufferedReader(new InputStreamReader(s.getInputStream())); //目的:socket输出流将大写数据写入到socket的输出流中.并发送给客户端 BufferedWriter bwOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));// PrintWriter out = new PrintWriter(s.getOutputStream(),true); //使用out.println()直接输出. String line = null; while((line = brIn.readLine())!=null){ bwOut.write(line.toUpperCase()); bwOut.newLine(); bwOut.flush(); // System.out.println(line); } s.close(); ss.close(); }}/* * * * 需求:建立一个文本服务器,处理客户端发送的字符串.服务端可以一直发送,当发送over时转换结束. * * 分析: * 客户端:既然是操作数据,那么就可以使用IO技术并按照IO的操作规律来思考! * 源:键盘录入 * 目的:网络输出流,网络输出流 * 而且操作的是文本数据.字符流. * * 步骤: * 1.建立服务 * 2.获取键盘录入 * 3.将数据发给服务端 * 4.获取服务端返回的大写数据. * 5.结束,关资源. * * 都是文本数据,可以使用字符流进行操作.同时提高效率,使用Buffered. * * * 服务端: * 源:socket读取流 * 目的:socket输出流 * * * 这个例题出现的问题: * 现象: * 客户端和服务端都在莫名等待,readLine()方法读取回车才可以读取得到, * 解决方案:因此在发送给对方数据时应该newLine()然后再flush(); * */
该例出现的问题:
现象:客户端和服务端都在莫名地等待,这就是客户端和服务端都有阻塞式的方法造成的后果.这些方法没有读到结束标记就会一直等,而导致两端都在等待.
开发时,应该查询阻塞式方法readLine().如果没有newLine()则一直等待.
上例中的流可以被PrintWriter替代:
**需求:Tcp复制文件**分析步骤:Tcp复制文件: 1. 建立客户端对象,并绑定目标地址和端口. 2. 创建一个BufferedReader读取文件FileReader 3. PrintWriter(s.getOutputStream,true); 4. 发送数据,使用readLine(); 5. 服务端:建立服务端对象,创建BufferedReader,PrintWriter(new FileWriter()) 6. 使用readLine(),写入到目标文件. 7. 使用PrintWriter返回给客户端信息 8. 关闭资源.那么文件发送到什么时候才结束呢?我们可以在Socket类里面找一个方法.shutdownOutput()shutdownInput()**服务端实现代码:**
package netDemos;import java.io.BufferedReader;import java.io.FileWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;public class TcpServerDemo4 {public static void main(String[] args) throws IOException { // TODO 自动生成的方法存根 ServerSocket ss = new ServerSocket(10081); // 读取socket读取流中的数据 Socket s = ss.accept(); String ip = s.getInetAddress().getHostAddress(); System.out.println(ip + ".....connnected"); BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); PrintWriter out = new PrintWriter(new FileWriter("server.txt"), true); String line = null; String mark = br.readLine(); while ((line = br.readLine()) != null) { if (mark.equals(line)) break; out.println(line); } PrintWriter pw = new PrintWriter(s.getOutputStream(), true); pw.println("Upload Success"); out.close(); s.close(); ss.close(); }}
客户端: 1. 客户端点的建立 2. 建立一个流,读取数据 3. 发送给服务端 4. 接受服务端的反馈信息 5. 关闭客户端实现代码```package netDemos;import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;public class TcpClientDemo4 { public static void main(String[] args) throws IOException { // TODO 自动生成的方法存根 Socket s = new Socket("127.0.0.1", 10081); BufferedReader br = new BufferedReader(new FileReader("IO")); PrintWriter out = new PrintWriter(s.getOutputStream(), true); String line = null; // 或者也可以使用DataOutputStream发送标记,服务端也使用对应的输入流接收标记. // long time = System.currentTimeMillis(); // 定义标记麻烦,可以使用Socket中的方法. // out.println(time); while ((line = br.readLine()) != null) { out.println(line); } // out.println(time); s.shutdownOutput();// 关闭客户端输出流,相当于给流中加一个-1标记. BufferedReader brIn = new BufferedReader(new InputStreamReader(s.getInputStream())); String linein = brIn.readLine(); System.out.println(linein); br.close(); s.close(); }}<div class="se-preview-section-delimiter"></div>
需求:TCP练习-客户端并发上传图片:
ServerSocket ss = new ServerSocket(10086); while (true) { Socket s = ss.accept(); InputStream is = s.getInputStream(); }
这个服务端有一个局限性,当A客户端连接上以后,被服务端获取到,服务端就在执行代码,直到执行完另一个客户端才可以连接成功.因为服务端还没有处理完A客户端的请求.没有循环回来执行到accept()方法,所以暂时获取不到B客户端对象.
那么为了可以让多个客户端同时并发访问服务端,那么服务端最好就是将每个客户端封装到一个单独的线程中,那样就可以同时处理多个客户端请求.
那么如何定义线程呢?
只要明确了每一个客户端要在服务端执行的代码即可!将该代码存入Run方法中 .
package netDemos; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class UploadPicServerDemo { public static void main(String[] args) throws IOException { // TODO 自动生成的方法存根 ServerSocket ss = new ServerSocket(10086); while (true) { Socket s = ss.accept(); new Thread(new picServer(s)).start(); } ss.close(); } } class picServer implements Runnable { private Socket s; picServer(Socket s) { this.s = s; } public void run() { InputStream in; String ip = s.getInetAddress().getHostAddress(); int num = 0; try { System.out.println(ip + ".....connected"); in = s.getInputStream(); File f = new File(ip+""+num+".jpg"); while(f.exists()) f = new File(ip+""+num+++".jpg"); FileOutputStream fos = new FileOutputStream(f); byte[] buf = new byte[1024]; int len = 0; while ((len = in.read(buf)) != -1) fos.write(buf, 0, len); OutputStream out = s.getOutputStream(); out.write("Upload success".getBytes()); fos.close(); s.close(); } catch (IOException e) { // TODO 自动生成的 catch 块 throw new RuntimeException(ip + "上传失败!"); } } }那么在客户端,为了服务器性能的考虑,我们应该限制客户发送过大或者其他格式的文件.<div class="se-preview-section-delimiter"></div>
package netDemos;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class UploadPicClientDemo {
public static void main(String[] args) throws IOException { // TODO 自动生成的方法存根 if (args.length != 1) { System.out.println("只允许一个参数"); return; } File file = new File(args[0]); if(!(file.exists()&&file.isFile())){ System.out.println("文件有问题"); return; } if(!file.getName().endsWith(".jpg")){ System.out.println("格式有问题"); return; } if(file.length()>1024*8){ System.out.println("图片过大!"); return; } Socket s = new Socket("127.0.0.1", 10086); FileInputStream fis = new FileInputStream(file); OutputStream out = s.getOutputStream(); byte[] buf = new byte[1024]; int len = 0; while ((len = fis.read(buf)) != -1) out.write(buf, 0, len); s.shutdownOutput(); InputStream in = s.getInputStream(); byte[] bufIn = new byte[1024]; int num = in.read(bufIn); System.out.println(new String(bufIn, 0, num)); fis.close(); s.close();}
}
/*
* * 客户端: 1.服务端点 2.读取图片数据 3.通过socket输出流将数据发送给服务端. 4.读取服务端反馈信息 5.关闭socket.
*/
**需求:客户端通过键盘录入用户名,服务端对这个用户名进行校验.如果该用户存在那么服务端显示xxx已登录.并在客户端显示xxx欢迎光临.如果用户不存在,服务端显示xxx尝试登录.在客户端显示xxx,该用户不存在.最多登录三次.****客户端实现代码**<div class="se-preview-section-delimiter"></div>
package netDemos;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class LoginClientDemo {
public static void main(String[] args) throws IOException { // TODO 自动生成的方法存根 Socket s = new Socket("127.0.0.1", 10023); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); PrintWriter out = 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; out.println(line); String info = brIn.readLine(); if(info.contains("welcome")) break; System.out.println("info:" + info); } br.close(); s.close();}
}
**服务端实现代码**<div class="se-preview-section-delimiter"></div>
package netDemos;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class LoginServerDemo {
public static void main(String[] args) throws IOException { // TODO 自动生成的方法存根 ServerSocket ss = new ServerSocket(10023); while (true) { Socket s = ss.accept(); new Thread(new UserThread(s)).start(); }}
}
class UserThread implements Runnable {
private Socket s;
UserThread(Socket s) { this.s = s;}public void run() { String ip = s.getInetAddress().getHostAddress(); BufferedReader br = null; System.out.println(ip + ".....connected"); try { for (int x = 0; x < 3; x++) { BufferedReader brIn = new BufferedReader(new InputStreamReader(s.getInputStream())); String name = brIn.readLine(); if (name == null) break; br = new BufferedReader(new FileReader("user.txt")); PrintWriter out = new PrintWriter(s.getOutputStream(), true); String line = null; boolean flag = false; while ((line = br.readLine()) != null) { if (line.equals(name)) { flag = true; break; } } if (flag) { System.out.println(name + ",已登录!"); out.println(name + ",欢迎光临"); break; } else { System.out.println(name + ",尝试登录!"); out.println(name + "用户不存在!"); break; } } br.close(); s.close(); } catch (Exception e) { // TODO: handle exception throw new RuntimeException(ip + "校验失败!"); }}
}
类 **URL** 代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。与IO流相同,IO流有个类叫做File,net有个类叫做URL.该类使用字符串进行操作.使用该类需要进行异常处理.参数:protocol - 要使用的协议名称。host - 主机名称。port - 主机端口号。file - 主机上的文件 <div class="se-preview-section-delimiter"></div>
package netDemos;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
public class URLDemo {
public static void main(String[] args) throws IOException { // TODO 自动生成的方法存根 URL url = new URL("http://127.0.0.1:11000/myweb/demo.html"); System.out.println(url.getProtocol()); System.out.println(url.getHost()); System.out.println(url.getPort()); System.out.println(url.getPath()); System.out.println(url.getFile());}
}
<div class="se-preview-section-delimiter"></div>
package netDemos;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class URLConnectionDemo {
public static void main(String[] args) throws IOException { // TODO 自动生成的方法存根 URL url = new URL("http://localhost:8080"); URLConnection conn = url.openConnection();
// System.out.println(conn);
InputStream is = conn.getInputStream();
byte[] buf = new byte[1024]; int len = 0; while((len=is.read(buf))!=-1){ System.out.println(new String(buf,0,len)); }}
}
//通过这段代码可以看出,URL这个类方便于我们进行网络编程,其实URL类内部封装了Socket类我们才得以方便地使用Socket流进.
“`
DNS域名解析:
Domain Network Servise
关于localhost和127.0.0.1 映射关系就在本机上,C:\windows\system\drivers\etc\hosts文件上.
先找本地,本地hosts文件内没有就去dns服务器上查询.
package netDemos;import java.io.IOException;import java.io.InputStream;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;public class URLConnectionDemo { public static void main(String[] args) throws IOException { // TODO 自动生成的方法存根 URL url = new URL("http://localhost:8080"); URLConnection conn = url.openConnection();// System.out.println(conn); InputStream is = conn.getInputStream(); byte[] buf = new byte[1024]; int len = 0; while((len=is.read(buf))!=-1){ System.out.println(new String(buf,0,len)); } }}//通过这段代码可以看出,URL这个类方便于我们进行网络编程,其实URL类内部封装了Socket类我们才得以方便地使用Socket流进.
- 黑马程序员--Java基础--网络编程java.net
- 黑马程序员Java基础之网络编程(net)
- 黑马程序员-java基础 网络编程
- 黑马程序员---java基础之网络编程
- 黑马程序员 Java基础 ---> 网络编程
- 黑马程序员:Java基础总结----网络编程
- 黑马程序员 java基础回顾---网络编程
- <<黑马程序员>>java基础之网络编程
- 黑马程序员Java基础__网络编程
- 黑马程序员-Java基础-网络编程
- 黑马程序员--java基础--网络编程
- 黑马程序员--Java基础--11网络编程
- 黑马程序员--Java基础总结---网络编程
- 黑马程序员-java基础-网络编程
- 黑马程序员 Java基础 网络编程
- 黑马程序员---java基础之网络编程
- 黑马程序员--JAVA基础之网络编程
- 黑马程序员--Java基础--GUI、网络编程
- MAC复制 压缩 拷贝报错:编码错误8058解决方案
- java do...while与while
- 简单Android 双y坐标折线图,可以画单线
- spring的Annotation动态代理报错$Proxy11 cannot be cast to com.spring.service.BServiceImpl解决方案
- C++11右值引用本质是什么?
- 黑马程序员--Java基础--网络编程java.net
- js两种定义函数方式及区别
- Linux下时间输出格式精确到微秒-gettimeofday
- android平台的视频播放器中需要的屏幕滑动源代码.
- C# 中实现快捷键的3种不同的方式
- 公钥、私钥详解
- weblogic 启动报错 java.lang.LinkageError: loader constraint violation in interface itable initialization
- 自定义 球 + 波纹 View
- javaScript 中立即执行函数相关