Java之网络编程,
Java之网络编程,
目录
一、网络
二、协议
三、IP地址
1.什么是IP地址?
2.IP地址的表示方式
3.IP地址的分类
4.Java中获取IP地址:InetAddress 类
四、域名及DNS
五、端口
六、URL
八、数据传输
九、客户端 / 服务器模式
十、java.net 包
十二、实现通讯程序
一、网络
什么是网络?一组由网线连接的计算机。互联网(internet),因特网(Internet)是最大的互联网,万维网(万维网web)是互联网提供的一种服务。
二、协议
什么是协议?网络中计算机之间通信的规则。
常用的协议:
- IP:网际协议。遵守这个协议就能传输数据。
- TCP:传输控制协议。控制传输数据的准确性。
- HTTP:超文本传输协议。通过它可以传输超链接。
- FTP:文件传输协议。通过它可以传输文件。
- SMTP:简单邮件传输协议。通过它可以传邮件。
三、IP地址
1.什么是IP地址?
IP地址是网络中一个通讯实体的唯一标识。
2.IP地址的表示方式
- 二进制表示:8位4字节,也就是32位。比如11000000 . 00001001 . 00010000 . 00001100
- 点分十进制表示:十进制表示。比如192 . 9 . 16 . 12
3.IP地址的分类
IP地址由网络号和主机号。网络号表示主机所在的网络,主机号表示网络中的主机。
IP地址分类:
A:0 . 0 . 0 . 0 -- 127 . 255 . 255 . 255,其中段0和127不可用。
B:128 . 0 . 0 . 0 -- 191 . 255 . 255 . 255
C:192 . 0 . 0 . 0 -- 223 . 255 . 255 . 255
D:224 . 0 . 0 . 0 -- 239 . 255 . 255 . 255
E:240 . 0 . 0 . 0 -- 255. 255 . 255 . 255,其中段255不可用。
4.Java中获取IP地址:InetAddress 类
常用方法:
- getLocalHost():静态方法,获取本机主机名和IP地址
- getByName(String host):静态方法,根据主机名获取InetAddress
- getHostName():实例方法,获取主机名
- getHostAddress():实例方法,获取IP地址
示例:
import java.net.InetAddress;
import java.net.UnknownHostException;
public class TestInetAdress {
public static void main(String[] args) throws UnknownHostException {
//获取本机主机名和IP地址
System.out.println(InetAddress.getLocalHost());
//根据主机名获取InetAddress
// InetAddress net = InetAddress.getByName("aura-bd-PC");
InetAddress net = InetAddress.getByName("www.taobao.com");
//获取主机名
System.out.println(net.getHostName());
//获取IP地址
System.out.println(net.getHostAddress());
}
}
四、域名及DNS
1.什么是域名?有什么用?
域名是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机,和IP地址一一对应。作用是用来寻找主机的。
2.什么是DNS?有什么用?
DNS被称为域名解析器,就是将域名自动匹配到对应的IP地址,从而找到网络上的主机。
五、端口
什么是端口?
端口号用于定位机器上的特定程序,从而实现程序间的通信。端口号的取值范围是1-65535。其中1-1023为系统端口,也叫保留端口。自定义端口都不应该使用保留端口号。
常见端口号:
- 超文本传输协议 80
- 文件传输协议 21
- 简单邮件传输协议 25
六、URL
1.什么是URL?
统一资源定位符。网上的每一个资源都有自己的URL。
2.URL格式
- 协议:// 主机名:[端口] / 路径 / [?查询字符串]#片段 ,比如http://192.168.1.190:5678/data/a.txt/?id=1&page=2#hello
- 路径:表示目录或文件
3.Java中的URL类
常用方法:
getProtocol()
getHost()
getPort()
getDefaultPort()
getQuery()
getRef()
示例:
//资源传输
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
public class TestURL1 {
public static void main(String[] args) throws IOException {
URL url = new URL("http://www.5442.com/showpic.html?http://pic2016.5442.com:82/img/20180510/quzlx2c3h43.jpg");
System.out.println(url.getProtocol());
System.out.println(url.getHost());
System.out.println(url.getPort());
System.out.println(url.getDefaultPort());
System.out.println(url.getQuery());
System.out.println(url.getRef());
//读
InputStream in = url.openStream();
OutputStream out = new FileOutputStream("d:\\data\\datou.jpg");
int temp;
while((temp = in.read()) != -1){
out.write(temp);
}
in.close();
out.close();
}
}
八、数据传输
- Java支持TCP和UDP协议族;
- TCP/IP:较可靠的双向流协议,可以发送任意量的数据。如果没有连接上就会处于阻塞状态,这说明会耗费很大的系统资源。
- UDP:传输不可靠,不能保证数据一定发生到对方,但数据快,限制64k一下。
九、客户端 / 服务器模式
- 网络编程的基本模型就是客户机到服务器模型。
- 客户端:向另一台计算机请求服务的计算机。
- 服务器:处理客户端请求的计算机。
十、java.net 包
1.介绍
Java的java.net包含了所有用于网络操作的类。常用的类就是 Socket 类和 ServerSocket 类。
2.Socket 类
- 当客户程序需要与服务器程序通讯的时候,客户程序必须在客户端创建一个Socket 对象。
- 构造方法:
- Socket(InetAddress addr, int port)
- Socket(String host, int port)
- 示例:
- Socket(InetAddress.getLocalHost(), 5678);
- Socket("127.0.0.1", 5678);
十二、实现通讯程序
版本1.0 单客户端和服务端通信。
代码如下:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
public static void main(String[] args) throws IOException {
//创建服务器对象,参数是服务端端口号
ServerSocket server = new ServerSocket(5678);
Socket socket = server.accept();//同一个客户端连接可以获取几次?
//流
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
//包装
Scanner in = new Scanner(is);
PrintWriter out = new PrintWriter(os,true);
//写
out.println("客户端连接服务器成功");
out.println("end");
//读
String sr;
while(true){
sr = in.nextLine();
System.out.println("客户端说:" + sr);
if (sr.equals("end")) {
break;
}
}
//关闭客户端连接
socket.close();
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
/**客户端*/
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
//创建一个客户端
//参数1:服务器IP,参数2:服务器的软件的端口号
//本机IP:127.0.0.1
Socket socket = new Socket(InetAddress.getLocalHost(), 5678);
//聊天:用流
//获得了底层的socket流:输入流
OutputStream os = socket.getOutputStream();
//获得了底层的socket流:输入流
InputStream is = socket.getInputStream();
//包装
Scanner in = new Scanner(is);//读
PrintWriter out = new PrintWriter(os,true);//自动刷新
String sr,sw;
//读
while(true){
sr = in.nextLine();
System.out.println("服务器说:" + sr);
if (sr.equals("end")) {
break;
}
}
//写
Scanner input = new Scanner(System.in);
while(true){
System.out.print("客户端说:");
//客户端获得键盘输入
sw = input.next();
//写入到服务器
out.println(sw);
if (sw.equals("end")) {
break;
}
}
//关闭客户端
socket.close();
}
}
版本2.0 多客户端和服务端通信,客户端排队。加入while循环,不断获取新的socket。
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
public static void main(String[] args) throws IOException {
while(true){
//创建服务器对象,参数是服务端端口号
ServerSocket server = new ServerSocket(5678);
Socket socket = server.accept();//同一个客户端连接可以获取几次?
//流
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
//包装
Scanner in = new Scanner(is);
PrintWriter out = new PrintWriter(os,true);
//写
out.println("客户端连接服务器成功");
out.println("end");
//读
String sr;
while(true){
sr = in.nextLine();
System.out.println("客户端说:" + sr);
if (sr.equals("end")) {
break;
}
}
//关闭客户端连接
socket.close();
}
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
/**客户端*/
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
//创建一个客户端
//参数1:服务器IP,参数2:服务器的软件的端口号
//本机IP:127.0.0.1
Socket socket = new Socket(InetAddress.getLocalHost(), 5678);
//聊天:用流
//获得了底层的socket流:输入流
OutputStream os = socket.getOutputStream();
//获得了底层的socket流:输入流
InputStream is = socket.getInputStream();
//包装
Scanner in = new Scanner(is);//读
PrintWriter out = new PrintWriter(os,true);//自动刷新
String sr,sw;
//读
while(true){
sr = in.nextLine();
System.out.println("服务器说:" + sr);
if (sr.equals("end")) {
break;
}
}
//写
Scanner input = new Scanner(System.in);
while(true){
System.out.print("客户端说:");
//客户端获得键盘输入
sw = input.next();
//写入到服务器
out.println(sw);
if (sw.equals("end")) {
break;
}
}
//关闭客户端
socket.close();
}
}
版本3.0 多客户端同时和服务端通信。加入while循环+多线程,不断和新的socket通信。
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
class NetThread extends Thread{
private Socket socket;
public NetThread(){}
public NetThread(Socket socket){this.socket = socket;}
@Override
public void run() {
//流
InputStream is;
OutputStream os;
try {
is = socket.getInputStream();
os = socket.getOutputStream();
//包装
Scanner in = new Scanner(is);
PrintWriter out = new PrintWriter(os,true);
//写
out.println("客户端连接服务器成功");
out.println("end");
//读
String sr;
while(true){
sr = in.nextLine();
System.out.println("客户端说:" + sr);
if (sr.equals("end")) {
break;
}
}
} catch (IOException e1) {
e1.printStackTrace();
} finally {
//关闭客户端连接
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public class Server {
public static void main(String[] args) throws IOException {
//创建服务器对象,参数是服务端端口号
ServerSocket server = new ServerSocket(5678);
while(true){
createThread(server.accept());
}
}
public static void createThread(Socket socket){
NetThread t = new NetThread(socket);
t.start();
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
/**客户端*/
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
//创建一个客户端
//参数1:服务器IP,参数2:服务器的软件的端口号
//本机IP:127.0.0.1
Socket socket = new Socket(InetAddress.getLocalHost(), 5678);
//聊天:用流
//获得了底层的socket流:输入流
OutputStream os = socket.getOutputStream();
//获得了底层的socket流:输入流
InputStream is = socket.getInputStream();
//包装
Scanner in = new Scanner(is);//读
PrintWriter out = new PrintWriter(os,true);//自动刷新
String sr,sw;
//读
while(true){
sr = in.nextLine();
System.out.println("服务器说:" + sr);
if (sr.equals("end")) {
break;
}
}
//写
Scanner input = new Scanner(System.in);
while(true){
System.out.print("客户端说:");
//客户端获得键盘输入
sw = input.next();
//写入到服务器
out.println(sw);
if (sw.equals("end")) {
break;
}
}
//关闭客户端
socket.close();
}
}
版本5.0 可以发送多条消息,不需要等待对方回复
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.Scanner;
/**
* 负责读取任务
* @author aura-bd
*
*/
public class ReadThread implements Runnable {
private Socket socket;
public ReadThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
String threadName = Thread.currentThread().getName();
InputStream is = socket.getInputStream();
Scanner in = new Scanner(is);
String sr;
while(in.hasNextLine()){
sr = in.nextLine();
if (sr.equals("end")) {
break;
}
System.out.println(sr);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
/**
* 负责写出任务
* @author aura-bd
*
*/
public class WriteThread implements Runnable {
private Socket socket;
public WriteThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
String threadName = Thread.currentThread().getName();
OutputStream os = socket.getOutputStream();
PrintWriter out = new PrintWriter(os,true);
if(threadName.equals("服务端:")){
out.println(threadName + "您好,您已经连接成功连接服务器!");
}
Scanner input = new Scanner(System.in);
String sw;
while(input.hasNext()){
sw = threadName + input.nextLine();
out.println(sw);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 客户端
* @author aura-bd
*
*/
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket(InetAddress.getLocalHost(),5678);
ReadThread rt = new ReadThread(socket);
WriteThread wt = new WriteThread(socket);
Thread readThread = new Thread(rt,"客户端:");
Thread writeThread = new Thread(wt,"客户端:");
System.out.println("*******************客户端*******************");
readThread.start();
writeThread.start();
}
}
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务端
* @author aura-bd
*
*/
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(5678);
while(true){
Socket socket = server.accept();
ReadThread rt = new ReadThread(socket);
WriteThread wt = new WriteThread(socket);
Thread readThread = new Thread(rt, "服务端:");
Thread writeThread = new Thread(wt, "服务端:");
System.out.println("*******************服务端*******************");
readThread.start();
writeThread.start();
}
}
}
相关文章
- 暂无相关文章
用户点评