欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Java之网络编程,

来源: javaer 分享于  点击 4754 次 点评:20

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();
		}
	}
}

 

相关文章

    暂无相关文章
相关栏目:

用户点评