网络编程:利用操作系统在不同通信协议上提供的接口(系统调用、函数库)实现网络进程的安全通信

网络进程就是网点机(连入网络的计算机)上运行的程序。网络进程在通信协议中用端口(port)标识,而它驻留的网点机则用其IP地址或域名来标识

网络编程中有两个主要的问题:

Ø如何准确的定位网络上一台或多台主机
Ø找到主机后如何可靠高效的进行数据传输

网络编程模型:是客户机/服务器(C/S)结构

IP地址:标识计算机等网络设备的网络地址,由四个8位的二进制数组成,中间以小数点分隔。
如:
166.111.136.3,166.111.52.80

主机名(hostname):网络地址的助记名,按照域名进行分级管理

如:www.geminno.com

服务类型(service):网络的各种服务。

   如:web服务, ftp服务, smtp服务, Telnet服务等

端口(Port)TCP/IP协议中的端口,是逻辑意义上的概念。主机上每一个提供服务的程序都运行在该主机的一个对外开放的端口上。程序员可以在创建自己的服务程序时使用自定义的端口,通过这个端口号来连接服务进程以接收服务。

如果IP地址比作一间房子 ,端口就是出入这间房子的门

Ø端口常以16位无符号整数编号(0-65535
Ø保留端口(0-1023)和动态端口(1024-65535)
Ø一个端口与使用该端口的服务进程是对应

网络用通信线路和通信设备将分布在不同地点的多台自治计算机系统互相连接起来

OSI模型OSIOpen System Interconnection的缩写,意为开放系统互联。国际标准化组织制定了OSI模型,把网络通信的工作分为七层

网络编程——TCP协议

TCP/IP四层协议OSI七层协议体系结构的概念清楚,理论也较完整,但它既复杂又不实用。

实际运用中,TCP/IP是一个四层体系结构,得到了非常广泛的运用


网络编程——TCP协议

TCP/IP协议

Ø四层机构:物理层、网络层、传输层、应用层

    协议IPTCPUDPHTTPFTPSMTP

ØTCP:面向连接的服务。可靠,传输大小无限制,但是需要连接建立时间,差错控制开销大。

    比如打电话

ØUDP,无连接的服务。不可靠,差错控制开销较小,传输大小限制在64K以下,不需要建立连接。

     比如写信

网络编程——TCP协议

Socket 是网络上的两个进程经过双向的通信而建立起来的一个实现数据传输的通道,这个双向链路的每一端都是一个Socket

SocketIP地址和端口号组成

IP地址:定位到网络中的一台PC

端口号:定位到PC中的一个进程

 疑问:

开发者基于TCP协议的网络编程,

是否四层中所有细节都需涉及到呢?

答:

需要

Java语言是目前最受欢迎的网络编程语言之一,

使用它能够轻松实现网络编程只需涉及传输层



Java网络编程涉及到的package: java.net


ØInetAddress
ØURL
ØURLConnection
Ø套接字类
Ø
ØSocket类、ServerSocket
ØDatagramSocket
ØDatagramPacket

Java网络编程涉及到的package: java.io


ØInputStream/OutputStream
ØBufferedInputStream/BufferedOutputStream
ØDataInputStream/DataOutputStream
ØBufferedReader/PrintWriter
ØObjectInputStream/ObjectOutputStream

Java网络编程涉及到的package: java.lang

ØThread
ØRunnable

InetAddress:描述Internet地址的类

Østatic InetAddress getLocalHost();返回本地主机
Østatic InetAddress getByName(Stringhost)   给定主机名,确定主机IP地址
ØString getHostAddress(); 返回主机IP地址
ØString getHostName();   获得主机名
java.net.URL:
ØURL类代表一个统一资源定位器,一个万维网中的“资源”
Ø一个URL的格式
l通信协议://主机:端口/文件
lURL(Stringspec)
Ø方法
lopenStream()   
lopenConnection()

java.net.URLConnection

Ø它代表应用程序和URL 之间的通信链接
Ø此类的实例可用于读取此 URL 引用的资源
Ø构造函数
lURLConnection(URL)
Ø方法
lconnect()
lgetInputStream()

java.net.URLConnection

ØURLURLConnection类封装的从远程站点检索信息的复杂性
Ø支持HTTP资源
lURLurl = new URL(“http://www.gem-inno.com”)
Ø打开一个URL连接
lURLConnectionurlconn = url.openConnection()
Ø只需打开一个输入流
lInputStreamin = url.openStream()

网络编程——TCP协议
网络编程——TCP协议
网络编程——TCP协议
网络编程——TCP协议
---------------------------------------

服务端代码

publicstaticvoidmain(String[] args) {

ServerSocketserver = null;//声明服务端变量

DataInputStreamin = null;//声明输入流

Socketclient = null;//声明客户端变量

try {

server= newServerSocket(8888);//实例化服务端

client= server.accept();//接受客户端

System.out.println("与客户端建立连接");

//获得输入流(客户端==>服务端)

in = newDataInputStream(client.getInputStream());

Stringstr;

//循环输出来自客户端的信息

while((str= in.readUTF())!=null){

  System.out.println("接受来自客户端的信息:"+str);

}

} catch(EOFException e) {

  System.out.println("输入流已到末尾,程序退出");

} catch(IOException e) { e.printStackTrace();

}finally{

//释放输入流

try{in.close();}

catch(IOException e) {e.printStackTrace();}

//释放客户端

try{client.close();}

catch(IOException e) {e.printStackTrace();}

//释放服务端

try{server.close();}

catch(IOException e) {e.printStackTrace();}

}

}


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

客户端

publicstaticvoidmain(String[] args){

//客户端

Socketsocket = null;

//输出流(客户端==>服务端)

DataOutputStreamout = null;

try{

socket= newSocket("localhost", 8888);

out= newDataOutputStream(socket.getOutputStream());

//循环输出信息

for(inti = 0; i < 10; i++) {

  out.writeUTF("Hello"+i);

try{

//每隔一秒钟输出一次

Thread.sleep(1000);

}catch(InterruptedException e) {

  e.printStackTrace();

  }

  }

}catch(IOException e) {

e.printStackTrace();

}finally{

//释放输出流

try{out.close();}

catch(IOException e) {e.printStackTrace();}

//释放客户端

try{socket.close();}

catch(IOException e) {e.printStackTrace();}

}

}



---------------------、

网络编程——TCP协议

网络编程——TCP协议

网络编程——TCP协议

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

线程实现类:

publicclassMyServerThread implementsRunnable{

privateSocket socket;

publicMyServerThread(Socket socket) {

     this.socket= socket;

}

@Override

publicvoidrun() {

Stringname = Thread.currentThread().getName();

System.out.println(name+"进入子线程执行...");

DataInputStreamin = null;

DataOutputStreamout = null;

try{

in= newDataInputStream(socket.getInputStream());

out= newDataOutputStream(socket.getOutputStream());

out.writeUTF("连接已建立!");

//循环处理Client端信息

while(true){

Stringstr = in.readUTF();

System.out.println(name+"接收到:"+str);

out.writeUTF("已接受字符,长度"+str.length());

}

}catch(IOException e) {

System.out.println("线程"+name+"异常关闭");

e.printStackTrace();

}finally{

try{in.close();} catch(IOException e) {e.printStackTrace();}

try{out.close();} catch(IOException e) {e.printStackTrace();}

}

}

}


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

客户端代码

publicstaticvoidmain(String[] args) throwsException{

System.out.println("启动Client...");

Socketsocket = null;

DataOutputStreamout = null;

DataInputStreamin = null;

Scannerscanner = newScanner(System.in);

try{

socket= newSocket("127.0.0.1", 8080);

out= newDataOutputStream(socket.getOutputStream());

in= newDataInputStream(socket.getInputStream());

System.out.println(in.readUTF());

while(true){

System.out.println("请输入向服务器发送的内容:");

Stringrequest = scanner.nextLine();

out.writeUTF(request);

Stringresponse = in.readUTF();

System.out.println(response);

}

}catch(Exception e) {

  e.printStackTrace();

}finally{

in.close();

out.close();

scanner.close();

socket.close();

}

}




相关文章: