您的位置:首页 > 理论基础 > 计算机网络

第一章 Java网络编程入门(参考《Java网络精解》)

2017-03-19 18:18 387 查看

第一章 Java网络编程入门(参考《Java网络精解》)

1.1进程之间的通信

进程是指运行中的程序,进程的任务就是执行程序中的代码。
例如EchoPlayer.java,该类是一个独立的java程序。


import java.io.*;
public class EchoPlayer {

//组装返回的字符串
public String echo(String msg) {
return "echo:"+msg;
}

public void talk()throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String msg=null;
while((msg=br.readLine())!=null){
System.out.println(echo(msg));
if(msg.equals("bye")){
break;
}
}
}

public static void main(String arg[])throws IOException{
new EchoPlayer().talk();
}
}


运行该程序,就启动了EchoPlayer进程,它从本地控制台获取标准输入输出流,用户通过控制台输入,与程序进行交互。



如果想将EchoPlayer类的响应结果移动到另外一台主机上,那么单凭EchoPlayer无法满足这一需求。这时我们需要创建两个程序:客户端程序,EchoClient和服务端程序EchoServer.

EchoClient : 与用户交互,从本地控制台获得标准输入流和标准输出流。

EchoServer : 与远程EchoServer通信,向EchoServer发送用户输入的字符串,
接收Echo返回的响应结果,再把响应结果写到标准输出流。


1.2计算机网络

计算机网络指把分布在不同地区的计算机用通信线路连起来的一个具有强大功能的网络系统。


1.3 OSI参考模型

开放系统互连(Open System Interconnection 简称OSI)
只要遵循模型就可以连接Internet




a.物理层(Physical Layer)

传输信息离不开物理介质,如同双绞线和同轴电缆等


b.数据链路层(Data Link Layer)

负责在两个相邻节点间的线路上,无差错的传送以帧为单位的数据。


c.网络层(NetWork Layer)

选择合适的网间路由和交换节点,确保数据及时传送到目标主机。


d.传输层(Transport Layer)

根据通信子网的特性最佳的利用网络资源,为服务器主机和客户端主机的会话层提供建立、维护和取消传输连接的功能。


e.会话层(Session Layer)

管理进程之间的会话过程,即负责建立,管理,终止进程之间的会话。会话层还通过在数据中插入校验点来实现数据的同步。


f.表示层(Presentation Layer)

表示层对上层数据进行转换,以表征一个主机的应用层数据可以被另一个主机的应用层理解。表示层的数据转换包括对数据的加密,解密,压缩,解压和格式转换等。


g.应用层(Application Layer)

应用层确定进程之间通信的实际用途,以满足用户实际需求,浏览Web站点,收发邮件,上传或下载等。


h.第三方提供的各层协议:

物理层协议:EIA/TIA RS-232, EIA/TIA RS-449,V.35,RJ-45等
数据链路层协议:SDLC,HDLC,PPP,STP,帧中继等
网络层协议:IP,IPX,RIP,OSPF等
传输层协议:TCP,UDP,SPX等
会话层协议:NetBIOS,ZIP(AppleTalk区域信息协议)等
表示层协议:ASCII,ASN.1,JPEG,MPEG等
应用层协议:TElNET,FTP,HTTP,SNMP等


1.5用Java编写客户端、服务端程序

EchoClient

package unitone;

import java.io.*;
import java.net.Socket;

/**
* Created by setsuna on 2017/3/19.
*/
public class EchoClient {

private Socket socket;
private String host;

//初始化客户端
private EchoClient(String host,int port) throws IOException {
this.host = host;
this.socket = new Socket(host,port);
}

//获得Socket的输出流,向服务端传送信息
private PrintWriter gainWriter(Socket socket) throws IOException {
OutputStream out = socket.getOutputStream();
return new PrintWriter(out,true);
}

//获得Socket的输入流,向客户端返回消息
private BufferedReader gainReader(Socket socket) throws IOException {
InputStream in = socket.getInputStream();
return new BufferedReader(new InputStreamReader(in));
}

public void talk(){
try {
//取得读写
BufferedReader bufferedReader = gainReader(socket);
PrintWriter printWriter = gainWriter(socket);

BufferedReader clientIn = new BufferedReader(new InputStreamReader(System.in));

String msg = null;

while((msg = clientIn.readLine()) != null){

printWriter.println(msg);

System.out.println(bufferedReader.readLine());

if(("bye").equals(msg)){
break;
}
}
}catch (Exception e){
try {
socket.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}

public static void main(String[] args) throws IOException {
new EchoClient("localhost",9000).talk();
}
}


EchoServer

package unitone;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
* Created by setsuna on 2017/3/19.
*/
public class EchoServer {

private ServerSocket serverSocket;

//初始化服务端
public EchoServer(int port) throws IOException {
serverSocket = new ServerSocket(port);
System.out.println("star
a685
t at port : " + port);
}

private String echo(String msg){
return "echo : " + msg;
}

//获得Socket的输出流,向客户端传送信息
private PrintWriter gainWriter(Socket socket) throws IOException {
OutputStream out = socket.getOutputStream();
return new PrintWriter(out,true);
}

//获得Socket的输入流,向服务端传送信息
private BufferedReader gainReader(Socket socket) throws IOException {
InputStream in = socket.getInputStream();
return new BufferedReader(new InputStreamReader(in));
}

private void service(){

while(true){
Socket socket = null;
try {
socket = serverSocket.accept();
//取得读写
BufferedReader bufferedReader = gainReader(socket);
PrintWriter printWriter = gainWriter(socket);

String msg = null;
while ((msg = bufferedReader.readLine()) != null){
//打印收到的信息
System.out.println("receive message : " + msg);
printWriter.println(echo(msg));
if(("bye").equals(msg)){
break;
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
if(socket != null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

public static void main(String[] args) throws IOException {
new EchoServer(9000).service();
}

}


运行EchoServer,启动服务



运行EchoClient启动客户端,并且向控制台输入信息



当我们向客户端输入信息,服务端就会返回一个带”echo : “的字符串,这就简单完成了客户端和服务端的信息交互。

1.6总结

Java网路程序致力于实现应用层,传输层向应用层提供了套接字Socket接口,Socket封装了下层的数据传输细节,应用层的程序通过Socket来建立与远程主机的连接,以及进行数据传输。
在Java中有三类套接字类:
Socket : 建立在TCP基础上
ServerSocket : 建立在TCP基础上
DatagramSocket :建立在UDP基础上
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 网络编程