java基础---网络编程

Posted 流着眼泪奔跑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java基础---网络编程相关的知识,希望对你有一定的参考价值。

第十八章 网络编程

1.网络基础知识

  所谓计算机网络,就是把分布在不同地理区域计算机与专门的外部设备用通信线路互联成一个规模达、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息,共享硬件、软件、数据信息等资源.

  计算机网络的主要功能:

  资源共享

  信息传输和集中处理

  均衡负载与分布处理

  综合信息服务

 

2.万维网、互联网、因特网 

因特网于1969年诞生于美国。最初名为“阿帕网”(ARPAnet)是一个军用研究系统,后来又成为连接大学及高等院校计算机的学术系统,现已发展成为一个覆盖五大洲150多个国家的开放型全球计算机网络系统。但因特网并不是全球唯一的互联网络。例如在欧洲,跨国的互联网络就有“欧盟网”(Euronet),“欧洲学术与研究网”(EARN),“欧洲信息网”(EIN),在美国还有“国际学术网”(BITNET),世界范围的还有“飞多网”(全球性的BBS系统)等。

 

因特网和其他类似的由计算机相互连接而成的大型网络系统,都可算是“互联网”,因特网只是互联网中最大的一个。

 

万维网(环球信息网的缩写,亦作Web”、“WWW”、“‘W3‘”,英文全称为“World Wide Web”)并不等同互联网,万维网只是互联网所能提供的服务其中之一,是靠着互联网运行的一项服务。

3.计算机网路的分类

 计算机网络通常是按照规模大小和延伸范围来分类的,常见的划分为:局域网(LAN)、城域网(MAN)、广域网(WAN)。Internet可以视为世界上最大的广域网。

  局域网(LAN):指在一个较小地理范围内的各种计算机网络设备互连在一起的通信网络,可以包含一个或多个子网,通常局限在几千米的范围之内。

  城域网(MAN):主要是由城域范围内的各局域网之网之间互连而构成的,现在很少提起这个概念。

  广域网(WAN):是由相距较远的局域网或城域网互连而成,通常是除了计算机设备以外,还要涉及一些电信通讯方式。

4.OSI模型

   国际标准化组织ISO1978年提出“开放系统互连参考模型”,即著名的OSIOpen System Interconnection.

  开放系统互连参考模型力求将网络简化,并以模块化的方式来设计网络。

   OSI分层模型与TCP/IP分层模型的对应关系

5.OSI七层模型简述

(1)物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由10转化为电流强弱来进行传输,到达目的地后再转化为10,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。

(2)数据链路层:定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输。

(3)网络层:在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。

(4)传输层:定义了一些传输数据的协议和端口号(WWW端口80),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据)UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。

(5)会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)

(6)表示层:可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。

(7)应用层:是最靠近用户的OSI层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。

6.IP地址

  IP地址用于标识网络中的一个通信实体,这个通信实体可以是一台主机,也可以是一台打印机,戒者是路由器的某一个端口。而在基于IP协议网络中传输的数据包,都必须使用IP地址来迚行标识。

  IP地址是数字型的,IP地址是一个32位(32bit)整数,但通常为了更加便于记忆,通常也把它分成48位的二迚制数组成,每8位之间用圆点隔开,每个8位整数可以转换成一个0255的十迚制整数,因此我们看到的IP地址常常是如下形式:202.9.128.88

7.端口

用于实现程序间的通信

8.常用的端口

  协议               端口

  Telnet协议         23

  简单邮件传输协议   25

  文件传输协议       21  

  超文本传输协议     80

9.TCP协议

   TCP协议被称作一种端对端协议。这是因为它为两台计算机之间的连接起了重要作用:当一台计算机需要不另一台进程计算机连接时,TCP协议会让它们建立一个连接:用于发送和接收数据的虚拟链路。

  TCP协议负责收集这些信息包,并将其按适当的次序放好传送,在接收端收到后再将其正确地还原。TCP协议保证了数据包在传送中准确无误。TCP协议使用重发机制:当一个通信实体发送一个消息给另一个通信实体后,需要收到另一个通信实体确认信息,如果没有收到另一个通信实体的确认信息,则会再次重发刚才发送的信息。

  通过这种重发机制,TCP协议向应用程序提供可靠的通信连接,使它能够自劢适应网上的各种变化。即使在 Internet 暂时出现堵塞的情况下,TCP也能够保证通信的可靠。 

10.通讯协议TCPUDP?

UDP:数据报文协议?

将数据及源和目的封装成数据包?

每个数据报的大小在限制在64?

因无连接,是不可靠协议,有差错?

速度快?

TCP:传输控制协议?

建立连接,形成传输数据的通道,可传输大量数据?

通过三次握手完成连接,可靠?

必须建立连接,所以效率低

11.ServerSocket

   (1)ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一直处于等待状态。ServerSocket包含一个监听来自客户端连接请求的方法:

   (2)Socket accept():如果接收到一个客户端Socket的连接请求,该方法将返回一个不连客户端Socket对应的Socket(如图17.4所示每个TCP连接有两个Socket);否则该方法将一直处于等待状态,线程也被阻塞。

   (3)为了创建ServerSocket对象,ServerSocket类提供了如下几

个构造器: ServerSocket(int port):用指定的端口port来创建一个ServerSocket。该端口应该是有一个有效的端口整数值:065535

  ServerSocket(int port,int backlog):增加一个用来改变连接队列长度的参数backlog

  ServerSocket(int port,int backlog,InetAddress localAddr):在机器存在多个 IP地址的情况下,允许通过localAddr这个参数来指定将ServerSocket绑定到指定的IP地址

 

举例: 接收

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.PrintWriter;

import java.net.Socket;

import java.net.UnknownHostException;

 

/**

 * 网络编程 客户端 发送字符串到服务端

 * @author dell

 *

 */

public class Client1 {

 

public static void main(String[] args) throws UnknownHostException, IOException {

// 1.创建Socket连接

Socket  socket=new Socket("192.168.1.41", 8803);

//获取输入输出流

OutputStream out=socket.getOutputStream();

//字符串输出流,用于向服务端传输字符串

PrintWriter pw=new PrintWriter(out);

pw.write("这是客户端发送到服务端的内容...");

pw.flush();

socket.shutdownOutput();

                System.out.print"**客户端发送信息成功**";

pw.close();

socket.close();

}

}

 

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

 

/**

 * 网络编程 服务端 接收来自客户端的字符串

 * @author dell

 *

 */

public class Server1 {

 

public static void main(String[] args) throws IOException {

//创建服务端连接

ServerSocket server=new ServerSocket(8803);

System.out.println("********服务端启动*********");

//接受客户请求的连接

Socket socket=server.accept();

//获取输入流,读取客户端发送的内容

InputStream in=socket.getInputStream();

//桥接流,用于把字节流信息转为字符流信息(实例化)

BufferedReader br=new BufferedReader(new InputStreamReader(in));

String content=br.readLine();

if (content!=null) {

System.out.println("服务端接受到客户端内容如下:"+content);

}

br.close();

socket.close();

server.close();

}

}

 

------------------------------------------------------------------------------------

 

举例:互动

 

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

/**

 * 网络编程 服务端 接受字符串到服务端,并且发送服务器返回的数据

 * @author dell

 *

 */

public class Server1 {

public static void main(String[] args) throws IOException {

//创建服务端连接

ServerSocket server=new ServerSocket(8803);

System.out.println("********服务端启动*********");

//接受客户请求的连接

Socket socket=server.accept();

//获取输入流,读取客户端发送的内容

InputStream in=socket.getInputStream();

//桥接流,用于把字节流信息转为字符流信息

BufferedReader br=new BufferedReader(new InputStreamReader(in));

String content=br.readLine();

if (content!=null) {

System.out.println("服务端接受到客户端内容如下:"+content);

}

 

//服务端发送信息到客户端

OutputStream out=socket.getOutputStream();

PrintWriter pw=new PrintWriter(out);

pw.write("服务端信息:谢谢使用!");

pw.flush();

pw.close();

br.close();

socket.close();

server.close();

}

}

 

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.PrintWriter;

import java.net.Socket;

import java.net.UnknownHostException;

/**

 * 网络编程 客户端 发送字符串到服务端,并且接受服务器返回的数据

 * @author dell

 *

 */

public class Client1 {

public static void main(String[] args) throws UnknownHostException, IOException {

// 1.创建Socket连接

Socket  socket=new Socket("192.168.1.41", 8803);

//获取输入输出流

OutputStream out=socket.getOutputStream();

//字符串输出流,用于向服务端传输字符串

PrintWriter pw=new PrintWriter(out);

pw.write("这是客户端发送到服务端的内容...");

pw.flush();

socket.shutdownOutput();

System.out.println("**********客户端发送信息成功*********");

//接收服务端信息

InputStream in=socket.getInputStream();

BufferedReader br=new BufferedReader(new InputStreamReader(in));

String content=br.readLine();

if (content!=null) {

System.out.println("客户端接收信息:- -"+content);

}

br.close();

in.close();

pw.close();

socket.close();

}

}

 

 

举例2

 

package demo;

import java.io.Serializable;

/**

 * 客户实体类  注意 一定要实现序列化接口

 * @author dell

 *

 */

 

//对象必须把要操作的类,序列化

public class Custom implements Serializable{

 

private String cno;  //客户编号

private String cname;//客户姓名

private String tel;  //联系方式

 

 

public Custom() {

super();

// TODO Auto-generated constructor stub

}

public Custom(String cno, String cname, String tel) {

super();

this.cno = cno;

this.cname = cname;

this.tel = tel;

}

public String getCno() {

return cno;

}

public void setCno(String cno) {

this.cno = cno;

}

public String getCname() {

return cname;

}

public void setCname(String cname) {

this.cname = cname;

}

public String getTel() {

return tel;

}

public void setTel(String tel) {

this.tel = tel;

}

}

 

 

package demo;

import java.io.IOException;

import java.io.ObjectOutputStream;

import java.io.OutputStream;

import java.net.Socket;

import java.net.UnknownHostException;

/**

 * 网络编程 客户端发送Custom实体信息到服务端,服务端返回字符串信息

 * @author dell

 *

 */

public class Client2 {

public static void main(String[] args) throws UnknownHostException, IOException {

Socket socket=new Socket("127.0.0.1",8803);

OutputStream out=socket.getOutputStream();

//对象输出流

ObjectOutputStream oos=new ObjectOutputStream(out);

//创建要传输的对象

Custom c=new Custom("c001", "小红", "123456789");

//向服务器输出对象

oos.writeObject(c);

socket.shutdownOutput();  //保证数据传输成功

System.out.println("******客户发送成功*****");

oos.flush();

oos.close();

socket.close();

}

}

 

package demo;

import java.io.IOException;

import java.io.InputStream;

import java.io.ObjectInputStream;

import java.net.ServerSocket;

import java.net.Socket;

 

public class Server2 {

 

public static void main(String[] args) throws IOException, ClassNotFoundException {

ServerSocket ss=new ServerSocket(8803);

//接收客户端请求

Socket socket=ss.accept();

//创建读取流,接收客户端发送的对象

InputStream in=socket.getInputStream();

ObjectInputStream ois=new ObjectInputStream(in);

Custom custome =(Custom) ois.readObject();

if (custome!=null) {

System.out.println("**********客户信息如下:************");

System.out.println(" 客户编号:"+custome.getCno());

System.out.println(" 客户姓名:"+custome.getCname());

System.out.println(" 客户联系方式:"+custome.getTel());

}

ois.close();

in.close();

socket.close();

ss.close();

}

}

 

以上是关于java基础---网络编程的主要内容,如果未能解决你的问题,请参考以下文章

Java基础--Java编程规范

Java网络编程基础

Java入门——Java编程基础

零基础如何学好Java开发

一道java基础理论题

Java基础——网络编程