`
xidajiancun
  • 浏览: 452356 次
文章分类
社区版块
存档分类
最新评论

【JavaSE学习笔记】- 网络编程

 
阅读更多

Java 学习--网络编程(一)

关键字:InetAddress UDP TCP Socket

1、网络参考模型

OSI参考模型

TCP/IP参考模型

应用层

应用层

表示层

会话层

传输层

传输层

网络层

网际层

数据链路层

主机

及网络层

物理层











2、IP地址:InetAddress类

此类表示互联网协议 (IP) 地址。如果需要在主机名和因特网地址之间进行转换时就需要用到该类。常用方法如下:

静态的getByName方法可以返回代表某个主机的InetAddress对象:

InetAddress address = InetAddress.getByName("time-A.thimefreq.bldrdoc.gov");

可以使用getAddress方法来访问InetAddress对象里面封装好的序列:

byte[] addressBytes = address.getAddress();

还可以通过调用getAllByName方法来获得所有主机:

InetAddress[] addresses = InetAddress.getAllByName(host);

有时候还需要知道本地主机的地址,此时可以使用静态的getLocalHost方法来得到本地主机的地址:

InetAddress address = InetAddress.getLocalHost();

示例如下:

import java.net.*;
class InetAddressTest
{
	public static void main(String[] args)
	{
		try{
			if(args > 0)
			{
				String host = args[0];
				InetAddress[] address = InetAddress.getAllByName(host);
				for(InetAddress a:address)
				{
					System.out.println(a);
				}
			}else
			{
				InetAddress localHostAddress = InetAddress.getLocalHost();
				System.out.println(localHostAddress);
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}

3、 传输协议:UDP和TCP

TCP 是Tranfer Control Protocol的简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。
UDP 是User Datagram Protocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。

TCP和UDP的区别:

TCP:面向连接 | 传输可靠性可靠 | 传输大量数据 | 速度慢

UDP:面向非连接| 传输可靠性不可靠 | 传输少量数据 | 速度快

4、 Socket

此类实现客户端套接字,套接字是两台机器间通信的端点。Socket是为网络服务提供的 一种机制,网络通信其实就是Socket之间的通信。

try{
	Socket s = new Socket("time-A.timefreq.bldrdoc.gov",13);
	try{
		InputStream inStream = s.getInputStream();
		Scanner in = new Scanner(inStream);
		while(in.hasNextLine()){
			String line = in.nextLine();
			System.out.println(line);
		}
	}
	finally{
		s.close();
	}
}
catch(IOException e){
	e.printStackTrace();
}

这个程序关键的几行代码:

Socket s = new Socket("time-A.timefreq.bldrdoc.gov",13);

Scanner in = new Scanner(inStream);

第一行代码用于打开一个套接字,他是网络软件的一个抽象概念,负责时能该程序内部与外部之间的通信。我们将远程地址和端口号传递给套接字的构造器,如果连接失败它将跑出一个UnknowHostException异常,如果存在其他异常抛出IOException异常。

第二行代码,一旦套接字被打开,java.net.Socket类中的getInputStream方法会返回一个InputStream对象,一旦获得这个流,该程序将直接把每一行打印到输出,这个过程一直持续到流发送完毕并且服务器断开连接为止。

5、 UDP的Socket建立:

  • 首先要了解两个类:

DatagramSocket 此类表示用来发送和接收数据报包的套接字。 构造方法:DatagramSocket(int port)创建数据报套接字并将其绑定到本地主机上的指定端口

DatagramPacket 此类表示数据报包,数据报包用来实现无连接包投递服务。构造方法:DatagramPacket(byte[] buf, int length, SocketAddress address) 构造数据报包,用来将长度为 length 的包发送。

  • 发送端:

1)通过DatagramSocket创建udp的Socket服务:

DatagramSocket ds = new DatagramSocket();

2)确定数据,并封装成数据包:

DatagramPacket dp = new DatagramPacket(…….);

3)通过UDP的Socket服务将已有的数据包发送出去:

ds.send(dp);

4)关闭资源:

ds.close();

  • 接收端:

1) 通过DatagramSocket创建udp的Socket服务,通常在这里设置一个监听端口,用以指定该接收断处理哪个端口发来的数据:DatagramSocket ds = newDatagramSocket(int mark);

2) 定义一个用来存储接收到的数据的空数据包:

DatagramPacket dp = newDatagramPacket(…….);

3) 通过udp的Socket服务将将接收到的数据包存储在第2步中定义的空数据包中。

ds.receive(dp);

4) 通过数据包的方法获取器中的数据。

InetAddress getAddress()返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。

byte[] getData() 返回数据缓冲区。

int getLength() 返回将要发送或接收到的数据的长度。

int getOffset()返回将要发送或接收到的数据的偏移量。

int getPort()返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。

SocketAddress getSocketAddress()获取要将此包发送到的或发出此数据报的远程主机的 SocketAddress (IP 地址 + 端号)

5) 关闭资源:

ds.close();

6、 TCP的Socket建立:

TCP的Socket建立主要涉及两个类Socket类与ServerSocket类。Socket类实现客户端套接字(也可以就叫“套接字”可以称为端口)。套接字是两台机器间通信的端点。ServerSocket类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。

  • 客户端:

1)建立Socket服务,指定要连接的主机和端口:

Socket s = new Socket(Stringhost, intport);

2)获取Socket流中的输出流,将数据写到该流中,通过网络发送给服务端:

OutputStream out = s.getOutputStream();

3)获取Socket流中的输入流,获取服务端反馈的信息:

InputStream in = s.getInputStream();

4)关闭客户端:

s.close();

  • 服务端:

1) 建立ServerSocket服务,指定要接收的端口:

ServerSocket server = newServerSocket (intport);

2) 获取连接到服务端的客户端Socket:

Socket socket = s.accept();

3) 获取Socket流中的输出流,将数据写到该流中,通过网络发送给服务端:

OutputStream out =socket.getOutputStream();

4)获取Socket流中的输入流,获取服务端反馈的信息:

InputStream in =socket.getInputStream();0

5) 关闭客户端:

socket.close();

6) 关闭服务端:

server.close();

7、 使用SeverSocket实现服务器
API:java.net.ServerSocket 1.0
ServerSocket(int port) 创建一个监控端口的服务器套接字
Socket accept() 等待连接,该方法阻塞当前线程知道建立连接为止
void close() 关闭服务器套接字

1)建立一个负责监控端口8189的服务器
ServerSocket s = new ServerSocket(8189);
2)告诉程序不停地等待知道有客户端连接到这个端口。
Socket incoming = s.accept();
3)使用这个Socket对象得到输入流和输出流
InputStream inStream = incoming.getInputStream();
OutputStream outStream = incoming.getOutputStream();
4)将流转换成扫描器和写入器,以便通过套接字来发送文本
Scanner in = new Scanner(inStream);
PrintWriter out = new PrintWriter(outStream,true /*autoFlush*/);
5)对输入进行计算并返回处理结果
String line = in.nextLine();
out.println("Echo:"+line);
6)在代码的最后,我们关闭连接进来的套接字
incoming.close();
示例如下:
import java.io.*;
import java.net.*;
import java.util.*;
class EchoServer 
{
	public static void main(String[] args) 
	{
		try
		{
			ServerSocket s = new ServerSocket(8189);
			Socket incoming = s.accept();
			try
			{
				InputStream input = incoming.getInputStream();
				OutputStream output = incoming.getOutputStream();
				
				Scanner in = new Scanner(input);
				PrintWriter out = new PrintWriter(output,true/*autoFlush*/);
				out.println("Hello!Enter BYE to exit.");
				boolean done = false;
				while(!done && in.hasNextLine())
				{
					String line = in.nextLine();
					out.println("Echo: "+line);
					if(line.trim().equals("BYE")
						done = true;
				}
			}
			finally
			{
				incoming.close();
			}
		}
		catch (IOException e)
		{
			incoming.close();
		}
	}
}




分享到:
评论

相关推荐

    JavaSE学习笔记.docx

    Java学习笔记 初识Java编程、Java基本数据类型、运算符、流程控制、数组、方法、面相对象、Java常用类库、集合、异常处理、多线程、IO流、网络编程、Java的反射机制、泛型、枚举、注解、配置文件操作、发送邮件、...

    JavaSE基础学习笔记

    JavaSE 星辰学习笔记 简介 如何高效的学习Java 案例:创建一个博客网站typecho 基础 Java程序运行机制 数据类型 变量 变量作用域 常量final 变量的命名规范 运算符 for循环 增强for循环 break continue 练习 Java的...

    javaSE-day11-day12--主要实现了购物系统的dao层和service层

    学习笔记-主要实现了购物系统的dao层和service层,主要是对象数据文件的读取,接口编程的学习。

    Java学习笔记-个人整理的

    {9}Java网络编程}{135}{chapter.9} {10}反射}{141}{chapter.10} {10.1}Class}{141}{section.10.1} {10.1.1}Field}{145}{subsection.10.1.1} {10.1.2}Method}{145}{subsection.10.1.2} {10.1.3}Constructor}{...

    javase全套笔记

    javase基础全套笔记 学习java 的敲门砖 1.Java语言是SUN公司(StanfordUniversityNetwork,斯坦福大学网络公司)1995年推出的一门高级编程语言。 2.Java语言是一门面向Internet的编程语言。 3.随着Java技术在web方面的...

    JavaSE学习笔记

    详细介绍java的各项技术以及设计模式,包括动态代理,反射机制,网络编程,多线程等等,里面有详细的实践代码和说明,欢迎下载学习

    JavaSE编程笔记

    这是我学习javase很认真做的笔记,绝对对你有作用的。

    GUI编程学习笔记.pdf

    适合JAVASE初学者

    代码学习笔记:个人编程学习笔记

    代码学习笔记 个人编程笔记文档网站,持续更新中... Java和JavaWeb :sparkles:收集的案例 :sparkles: :sparkles: JavaSE基础 :sparkles: :sparkles: JavaWeb :sparkles: 初步框架 :sparkles: 春天 :sparkles: :...

    08-java基础汇总学习笔记

    javaSE基础汇总学习笔记整理,javaSE基础、面向对象、IO、反射、常用的类、正则、Socket基础编程等

    javase java2ee 笔记

    Java语法基础 Java开发环境搭建 Java是一门编程语言,是用来编写软件的。...JavaSE是java分类中的标准版,是刚接触java要学习的基础知识。 JavaEE是java分类中的企业版,是java中的高级,涉及到的知识广泛。

    JAVASE_Notes:来自itheima黑马的JavaSE基础笔记

    JAVASE_Notes 来自itheima黑马的JavaSE基础笔记完全不懂编程的话拿来入门还不错,建议配合视频看,b站都有。记录自己学习的过程把。

    JavaSE回顾总结(狂神说java).xmind

    javaSE回顾总结,学习笔记,查漏补缺。 Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态...

    java8源码-JavaSE-Code:JavaSE的代码练习与学习笔记总结

    [Java多线程核心编程技术] 书籍笔记 第一章:Java多线程技能 线程是进程中的子任务 interrupted与isInterrupted的区别: interrupted是Thread类的静态方法,里面调用了isTnterrupted方法[currentThread().isInterrupted...

    JavaSE之面对程序语言

    这也是小编在刚开学学习JavaSE时记录的一些笔记,里面的内容非常适合JavaSE入门者学习,都是浅显易懂的话语,没有太多的官方话,绝对是你初学JavaSE的宝典,针对人群:刚入门的JavaSE小白的同学们,我相信通过你们的...

    Spring-mybatis-SpringMVC-SpringBot学习笔记

    Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单...

    JavaSE 笔记(基础我介绍)

    1. 基础:JDK,classpath,流,线程 2. java 1.5特性:注解、泛型等 3. 反射 4. 集合框架 5. 内省 6. 类加载器 8. 代理模式和面向切面编程 部分内容有代码 以上内容均为个人学习总结,可做为工具或学习使用

    旨在打造在线最佳的 Java 学习笔记.rar

    在学习Java中,常常碰到...这套JavaSE教程基于Java17讲述,从零基础出发,讲解Java编程的基础知识和实践技巧,涵盖了Java编程的方方面面。 原文链接:https://blog.csdn.net/2301_78369729/article/details/130947974

    狂神说Java 笔记,java入门,docker ,spring 全家桶,redis , mysql , vue , javascript ,htm5, css

    12、JavaSE:网络编程.pdf 13、JavaSE:Gui编程.pdf 14、JavaSE:注解和反射.pdf 15、MySQL和JDBC.pdf 16、前端:Html5.pdf 17、前端:CSS3.pdf 18、前端:JavaScript、jQuery.pdf 19、JavaWeb.pdf 20、...

Global site tag (gtag.js) - Google Analytics