java网络编程精解学习笔记(第一章 网络基础)

网络编程的基础任务是:开发客户端,服务器程序,使两者有条不紊的交换数据。
111488.png

1.1进程就是执行中的程序,进程的任务就是执行程序中的代码。如下程序示例:

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("bye".equals(msg)) {

break;

}

}

br.close();

}

public static void main(String[] argsthrows IOException {

EchoPlayer ep = new EchoPlayer();

ep.talk();

}

}

用户通过控制台与 EchoPlayer进程交互的过程如下:660288.png

确切来说执行该程序是启动了一个JVM进程,该进程执行EchoPlayer进程的main方法。echo方法负责生成响应结果,如果把该方法放到另一台计算机上。那么就需要产生两个进程EchoClient, EchoServer。 EchoClient负责与用户交互,从本地控制台获取标准输入和标准输出,并且把用户输入信息发送到EchoServer端,以及把EchoServer返回的结果输出到标准输出。EchoServer负责接收EchoClient发送的输入,处理后把结果返回给EchoClient。它们之间的通信过程:

38618.png



1.2计算机网络概念

计算机网络是指把不同区域的计算机通过通信线路连接起来的具有强大功能的网络系统。网络上的计算机可以方便的通信,共享软件,硬件,数据信息等资源。网络中的计算机称为节点(node)。此外打印机,路由器,网关等也是节点。人与人之间通过语言交流,计算机之间也有语言,称为“网络协议”

298015.png

网络中的计算机都有地址,它是表示主机的一串字节序列,序列越长可以表示的主机越多。也就意味着能接入的计算机越多。如下图所示,上海人之间用上海话交流,广东人之间用广东话交流,上海人与广东人之间只能用普通话交流。那么不同网络之间通信需要靠“tcp/ip”协议进行交流:

577746.png


1.3 OSI参考模型:

为了使计算机网络之间互相兼容,OSI建立了一套网络体系(OSI开放系统互联模型)。这就意味着只要符合该模型的网络,它们之间就能互联通信。

OSI参考模型分为7层:物理层,数据链路层,网络层,传输层,会话层,表示层和应用层。A的物理层和B的物理层称为对等层。

753022.png

a>物理层:传输信息离不开物理介质。如双绞线,同轴电缆等。物理层的任务就是为上一层提供物理连接。以及规定通信节点之间的机械和电器特性。如电缆和接头的类型,传输信号的电压等。在这一次是以比特流的形式传输的。典型设备是集线器(Hub)

b>数据链路层:数据链路层负责在相邻的两个节点上,无差错的传输以帧为单位的数据。每一帧包括一定量的数据和控制信息。数据链路层负责建立,维护,释放数据链接的连接,在传输过程中如果接收放检测到有错误,那么就会通知发送方重新发一遍,该层的典型设备是交换机(switch)。

c>网络层: 网络中通信的计算机可能会经过很多条链路或者子网。网络层的任务就是选择合适的网络间路由和交换节点。确保数据及时传到目的主机。网络层讲帧封装成网络层的数据包,包中封装有网络包头,包头里包含逻辑地址--源主机和目的主机网络地址。典型的设备是路由器。

40642.png

d>传输层:该层的任务是根据通信子网的特性最佳的利用网络资源,为两个端系统的会话层提供建立,维护和取消传输连接的功能。以可靠方式和不可靠方式传输数据。可靠方式指发送端确保数据会准确的发送到接收端。否则为不可靠方式。该层的信息传输单位是报文。

e>会话层:会话层管理进程之间的会话过程,即建立,管理,结束进程之间的会话。

f>表示层:对上层数据进行转换。以保证一个主机的应用层的数据被另一主机应用层所理解。表示层的数据转换包括对数据加密,解密,压缩,解压等。

g>应用层:确定进程之间通信的实际用途,如浏览web站点,收发邮件,上传下载文件等等。

源主机向目的主机发送数据时,由最上层发出。每一层会给上一层添加一个信息头。最终由物理层发出。发到目的主机后由最下层向最上层传递。每一层会把信息头去掉然后发给上一层。最后把数据还原。各个层加入的信息头内容不同。网络层加入了源主机和目的主机的地址。传输层加入了传输类型,原端口,目的端口,序列号和应答号等。

613553.png

对等层之间相互通信时需要遵循一定的规则,如通信的内容和方式,这些规则称为通信协议。


1.4TCP/IP参考模型

tcp/ip模型包括:应用层,传输层,网络互联层,主机-网络层。与OSI模型对应的关系如下图,OSI模型的表示层,会话层合并到了TCP/IP协议的应用层。物理层,数据链路层合并到主机-网络层。

410816.png

应用层的FTP,HTTP, TELNET,基于传输层的TCP协议。SNMP,DNS基于UDP协议。

881479.png

a>主机-网络层:TCP/IP模型没有实现主机-网络层,也没有提供任何协议。它只要求第三方自己实现并且为上一层提供一个接口。使网络互联层能传输IP数据包即可。采用IEEE802.3协议集的网络称为以太网。采用IEEE802.4协议集的网络称为令牌环网。两者都提供了网络互联层访问的接口。

b>网络互联层:网络互联层是整个模型的核心。该层的功能是把IP数据包送达目的地址。为了快速把数据包送达。IP协议把数据包分为多个子包,然后沿不同路径送达目标地址。然后由传输层重新排序,还原成原来的数据。

232061.png

网络互联层具备链接异构网络的功能。例如以太网和令牌环网的网络拓扑结构不同,但是网络互联层访问主机-网络层的接口是相同的。所以网络互联层屏蔽了下层的网络差异,使异构网络能够正常传输IP数据包。IP协议规定了数据包的格式,并且规定了为数据包寻找路由的流程。

135792.png

c>传输层:传输层的功能是使源主机和目的主机的进程进行会话。在传输层定义了两种不同服务质量的协议,一种是TCP一种是UDP。TCP协议是一种面向连接的,可靠的协议。TCP协议负责把源主机发送的字节流不差错的发送到目的主机。发送方负责把上层传下来的数据分成报文段传递给下层。接收方负责把下层的报文包重组后交给上层。TCP协议还负责端到端的流量控制,以避免接收方没有足够的缓存存储发送方发过来的大量数据包。应用层的许多协议,如HTTP,TELNET,FTP都是基于TCP协议。UDP协议不是一种可靠的,基于连接的协议。主要适用于不进行排序和流量控制的场合。

d>应用层:基于TCP协议的协议主要包括:HTTP,HTTPS,FTP,TELNET,POP3,IMAP4,SMTP。基于UDP的协议:SNMP,DNS。


1.5 IP协议

IP网络中每台计算机有自己的IP地址。IP地址是由32位二进制序列组成。上层为方便表示,将其分为4个单元,每个单元8位。例如:192.168.1.1 ,每个单元的取值为(0~255)。

IP网络地址包括两部分,IP网址和IP主机地址。IP网址指网络地址,IP主机地址指网址中的主机地址。子网掩码是用来获取IP网址的。子网掩码的形式与IP网址相同。前面的部分都用1表示,后边的部分都用0表示。例如子网掩码设置为255.255.255.0,那么IP网址为192.168.1.0。两个不同的网络之间用路由器连接。

1.5.1 子网的划分

例如网址是:192.168.0.0,那么这个网址可以管理的主机有2的16次方减2(因为网址和广播地址192.160.255.255不能使用)。我没可以把该网址划分为3个子网:192.168.1.0, 192.168.2.0, 192.168.3.0。子网掩码为255.255.255.0

1.5.2 数据包发送过程

IP协议是面向包的协议,把数据包拆分为若干个小包进行发送。IP网络上的主机只允许向本网络的主机发送数据包。主机有两个地址。一个物理地址一个IP地址。物理地址是由网卡决定的,它才是主机的真实地址。主机A向主机B发送数据包时,主机A会通过ARP地址解析协议获取主机B的物理地址,然后把数据包发送给主机B。ARP的运行机制是,主机A在网上发送一条ARP消息:“主机B的物理地址是多少”,主机B进行响应,然后把A把数据包发送给B。

当主机A和B不在同一个网络上时,A会把数据包传送给该网络上的路由器,路由器的寻找流程如下:

1.当数据包生命周期结束,则丢弃数据包

2 搜索路由表,优先搜索路由表中的主机,如果匹配传送给主机。

3 如果匹配失败,搜索路由表,搜索同子网的路由器,如果找到匹配的路由器,把数据包传给路由器。

4 如果匹配失败,搜索路由表,搜索同网络的路由器,如果匹配把数据包传给路由器。

5 如果都失败,把数据包传给默认路由,如果没有则把数据包丢弃。

从以上过程可以看出,IP协议可能因为数据包生命周期结束或者没有找到路由的原因,使得数据包被丢弃,不能发送到目的主机。

1.5.3域名:

域名是由右至左表示其意义的,最右端是顶层域,最左端表示主机的机器名称。域名一般表示为:机器名.单位名.网络名.顶层域名。DNS协议采用DNS服务器把域名转换为IP地址。

1.5.4 URL统一资源定位器

它是为标识网上资源位置设的一种编址方式。URL一遍由三部分组成: 应用层协议://IP地址或域名/资源所在目录/文件名。常见的应用层协议还有file,ftp。file表示本地资源。

1.5.5 TCP协议及端口

TCP协议保证两个进程顺利通信,不用担心数据包乱序或者丢包的问题。TCP跟踪数据包的顺序,如果包顺序乱了会重新排序,如果丢包会重新请求源主机重新发送数据包。

两台主机上会有很多进程。主机A向主机B发送数据时,首先会通过IP协议将数据包从主机A发送到主机B,然后通过TCP协议确定发送到哪个进程。TCP采用端口来区分进程。例如:进程B1的地址为:B:80。

32003.png

端口的范围是0~65535。其中 0~1023分配给一些特定的服务端口。例如21对应FTP, 80对应HTTP,25对应SMTP等。1024~65535是用户自定义的一些端口。当与服务端进行连接时客户端回随机分配一个未被占用的端口,当连接断开时,端口被释放。

1.5.6 客户端/服务器通信模式:

服务器进程可以向多个客户端进程提供服务:

469627.png


1.6用java编写客户端/服务器程序

以下所有的编程都基于 TCP/IP协议,致力于实现应用层。传输层向应用层提供了Socket接口,Socket封装了下层数据传输的细节,应用层通过socket建立与远程主机的连接,以进行数据传输。

套接字可以看作是通信链路两端的收发器,进程通过套接字收发数据:

735472.png

java中有三种套接字,socket, serverSocker,datagramSocket。其中socket, serverSocket建立在TCP协议基础上。datagramSocket建立在UDP协议基础上。

1.6.1 EchoServer.java 服务端程序:

public class EchoServer {


private int port=8000;

private ServerSocket serverSocket=null;

public EchoServer() throws IOException {

serverSocket = new ServerSocket(port);

System.out.println("服务器启动成功");

}

private BufferedReader getReader(InputStream is){

return new BufferedReader(new InputStreamReader(is));

}

private PrintWriter getWriter(OutputStream os) {

return new PrintWriter(new OutputStreamWriter(os), true); //true表示有数据就刷新

}

private String echo(String msg) {

return "echo:" + msg;

}

private void server() throws IOException {

while(true) {

Socket socket = null;

try {

socket = serverSocket.accept();

System.out.println(socket.getInetAddress() + ":" + socket.getPort()); //客户端的地址和端口

BufferedReader br = getReader(socket.getInputStream());

PrintWriter pw = getWriter(socket.getOutputStream());

String msg = null;

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

System.out.println(msg);

pw.println(echo(msg));

if("bye".equals(msg)) {

break;

}

}

}finally {

socket.close();

}

}

}

public static void main(String[] argsthrows IOException {

new EchoServer().server();

}

}

1.6.2 客户端程序:

public class EchoClient {

private String address = "localhost";

private int port = 8000;

private Socket socket;

public EchoClient() throws UnknownHostException, IOException {

socket = new Socket(addressport);

}

private BufferedReader getReader(InputStream is){

return new BufferedReader(new InputStreamReader(is));

}

private PrintWriter getWriter(OutputStream os) {

return new PrintWriter(new OutputStreamWriter(os), true);

}

private void talk() throws IOException {

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

BufferedReader br = getReader(socket.getInputStream());

PrintWriter pw = getWriter(socket.getOutputStream());

String msg = null;

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

pw.println(msg);

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

if("bye".equals(msg)) {

break;

}

}

localReader.close();

br.close();

pw.close();

}

public static void main(String[] argsthrows UnknownHostException, IOException {

new EchoClient().talk();

}

}

144440.png

在服务器端socket对象有远程和本地进程的地址和端口信息。客户端socket对象有远程和本地的地址和端口信息。客户端进程可以建立多个连接,每个连接对应唯一的一个端口。建立连接时需要指定服务器端的端口,而不用指定客户端的端口。不同协议可以使用相同的端口号,如TCP,UDP都可以使用1000端口。

111488.png

1.1进程就是执行中的程序,进程的任务就是执行程序中的代码。如下程序示例:

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("bye".equals(msg)) {

break;

}

}

br.close();

}

public static void main(String[] argsthrows IOException {

EchoPlayer ep = new EchoPlayer();

ep.talk();

}

}

用户通过控制台与 EchoPlayer进程交互的过程如下:660288.png

确切来说执行该程序是启动了一个JVM进程,该进程执行EchoPlayer进程的main方法。echo方法负责生成响应结果,如果把该方法放到另一台计算机上。那么就需要产生两个进程EchoClient, EchoServer。 EchoClient负责与用户交互,从本地控制台获取标准输入和标准输出,并且把用户输入信息发送到EchoServer端,以及把EchoServer返回的结果输出到标准输出。EchoServer负责接收EchoClient发送的输入,处理后把结果返回给EchoClient。它们之间的通信过程:

38618.png



1.2计算机网络概念

计算机网络是指把不同区域的计算机通过通信线路连接起来的具有强大功能的网络系统。网络上的计算机可以方便的通信,共享软件,硬件,数据信息等资源。网络中的计算机称为节点(node)。此外打印机,路由器,网关等也是节点。人与人之间通过语言交流,计算机之间也有语言,称为“网络协议”

298015.png

网络中的计算机都有地址,它是表示主机的一串字节序列,序列越长可以表示的主机越多。也就意味着能接入的计算机越多。如下图所示,上海人之间用上海话交流,广东人之间用广东话交流,上海人与广东人之间只能用普通话交流。那么不同网络之间通信需要靠“tcp/ip”协议进行交流:

577746.png


1.3 OSI参考模型:

为了使计算机网络之间互相兼容,OSI建立了一套网络体系(OSI开放系统互联模型)。这就意味着只要符合该模型的网络,它们之间就能互联通信。

OSI参考模型分为7层:物理层,数据链路层,网络层,传输层,会话层,表示层和应用层。A的物理层和B的物理层称为对等层。

753022.png

a>物理层:传输信息离不开物理介质。如双绞线,同轴电缆等。物理层的任务就是为上一层提供物理连接。以及规定通信节点之间的机械和电器特性。如电缆和接头的类型,传输信号的电压等。在这一次是以比特流的形式传输的。典型设备是集线器(Hub)

b>数据链路层:数据链路层负责在相邻的两个节点上,无差错的传输以帧为单位的数据。每一帧包括一定量的数据和控制信息。数据链路层负责建立,维护,释放数据链接的连接,在传输过程中如果接收放检测到有错误,那么就会通知发送方重新发一遍,该层的典型设备是交换机(switch)。

c>网络层: 网络中通信的计算机可能会经过很多条链路或者子网。网络层的任务就是选择合适的网络间路由和交换节点。确保数据及时传到目的主机。网络层讲帧封装成网络层的数据包,包中封装有网络包头,包头里包含逻辑地址--源主机和目的主机网络地址。典型的设备是路由器。

40642.png

d>传输层:该层的任务是根据通信子网的特性最佳的利用网络资源,为两个端系统的会话层提供建立,维护和取消传输连接的功能。以可靠方式和不可靠方式传输数据。可靠方式指发送端确保数据会准确的发送到接收端。否则为不可靠方式。该层的信息传输单位是报文。

e>会话层:会话层管理进程之间的会话过程,即建立,管理,结束进程之间的会话。

f>表示层:对上层数据进行转换。以保证一个主机的应用层的数据被另一主机应用层所理解。表示层的数据转换包括对数据加密,解密,压缩,解压等。

g>应用层:确定进程之间通信的实际用途,如浏览web站点,收发邮件,上传下载文件等等。

源主机向目的主机发送数据时,由最上层发出。每一层会给上一层添加一个信息头。最终由物理层发出。发到目的主机后由最下层向最上层传递。每一层会把信息头去掉然后发给上一层。最后把数据还原。各个层加入的信息头内容不同。网络层加入了源主机和目的主机的地址。传输层加入了传输类型,原端口,目的端口,序列号和应答号等。

613553.png

对等层之间相互通信时需要遵循一定的规则,如通信的内容和方式,这些规则称为通信协议。


1.4TCP/IP参考模型

tcp/ip模型包括:应用层,传输层,网络互联层,主机-网络层。与OSI模型对应的关系如下图,OSI模型的表示层,会话层合并到了TCP/IP协议的应用层。物理层,数据链路层合并到主机-网络层。

410816.png

应用层的FTP,HTTP, TELNET,基于传输层的TCP协议。SNMP,DNS基于UDP协议。

881479.png

a>主机-网络层:TCP/IP模型没有实现主机-网络层,也没有提供任何协议。它只要求第三方自己实现并且为上一层提供一个接口。使网络互联层能传输IP数据包即可。采用IEEE802.3协议集的网络称为以太网。采用IEEE802.4协议集的网络称为令牌环网。两者都提供了网络互联层访问的接口。

b>网络互联层:网络互联层是整个模型的核心。该层的功能是把IP数据包送达目的地址。为了快速把数据包送达。IP协议把数据包分为多个子包,然后沿不同路径送达目标地址。然后由传输层重新排序,还原成原来的数据。

232061.png

网络互联层具备链接异构网络的功能。例如以太网和令牌环网的网络拓扑结构不同,但是网络互联层访问主机-网络层的接口是相同的。所以网络互联层屏蔽了下层的网络差异,使异构网络能够正常传输IP数据包。IP协议规定了数据包的格式,并且规定了为数据包寻找路由的流程。

135792.png

c>传输层:传输层的功能是使源主机和目的主机的进程进行会话。在传输层定义了两种不同服务质量的协议,一种是TCP一种是UDP。TCP协议是一种面向连接的,可靠的协议。TCP协议负责把源主机发送的字节流不差错的发送到目的主机。发送方负责把上层传下来的数据分成报文段传递给下层。接收方负责把下层的报文包重组后交给上层。TCP协议还负责端到端的流量控制,以避免接收方没有足够的缓存存储发送方发过来的大量数据包。应用层的许多协议,如HTTP,TELNET,FTP都是基于TCP协议。UDP协议不是一种可靠的,基于连接的协议。主要适用于不进行排序和流量控制的场合。

d>应用层:基于TCP协议的协议主要包括:HTTP,HTTPS,FTP,TELNET,POP3,IMAP4,SMTP。基于UDP的协议:SNMP,DNS。


1.5 IP协议

IP网络中每台计算机有自己的IP地址。IP地址是由32位二进制序列组成。上层为方便表示,将其分为4个单元,每个单元8位。例如:192.168.1.1 ,每个单元的取值为(0~255)。

IP网络地址包括两部分,IP网址和IP主机地址。IP网址指网络地址,IP主机地址指网址中的主机地址。子网掩码是用来获取IP网址的。子网掩码的形式与IP网址相同。前面的部分都用1表示,后边的部分都用0表示。例如子网掩码设置为255.255.255.0,那么IP网址为192.168.1.0。两个不同的网络之间用路由器连接。

1.5.1 子网的划分

例如网址是:192.168.0.0,那么这个网址可以管理的主机有2的16次方减2(因为网址和广播地址192.160.255.255不能使用)。我没可以把该网址划分为3个子网:192.168.1.0, 192.168.2.0, 192.168.3.0。子网掩码为255.255.255.0

1.5.2 数据包发送过程

IP协议是面向包的协议,把数据包拆分为若干个小包进行发送。IP网络上的主机只允许向本网络的主机发送数据包。主机有两个地址。一个物理地址一个IP地址。物理地址是由网卡决定的,它才是主机的真实地址。主机A向主机B发送数据包时,主机A会通过ARP地址解析协议获取主机B的物理地址,然后把数据包发送给主机B。ARP的运行机制是,主机A在网上发送一条ARP消息:“主机B的物理地址是多少”,主机B进行响应,然后把A把数据包发送给B。

当主机A和B不在同一个网络上时,A会把数据包传送给该网络上的路由器,路由器的寻找流程如下:

1.当数据包生命周期结束,则丢弃数据包

2 搜索路由表,优先搜索路由表中的主机,如果匹配传送给主机。

3 如果匹配失败,搜索路由表,搜索同子网的路由器,如果找到匹配的路由器,把数据包传给路由器。

4 如果匹配失败,搜索路由表,搜索同网络的路由器,如果匹配把数据包传给路由器。

5 如果都失败,把数据包传给默认路由,如果没有则把数据包丢弃。

从以上过程可以看出,IP协议可能因为数据包生命周期结束或者没有找到路由的原因,使得数据包被丢弃,不能发送到目的主机。

1.5.3域名:

域名是由右至左表示其意义的,最右端是顶层域,最左端表示主机的机器名称。域名一般表示为:机器名.单位名.网络名.顶层域名。DNS协议采用DNS服务器把域名转换为IP地址。

1.5.4 URL统一资源定位器

它是为标识网上资源位置设的一种编址方式。URL一遍由三部分组成: 应用层协议://IP地址或域名/资源所在目录/文件名。常见的应用层协议还有file,ftp。file表示本地资源。

1.5.5 TCP协议及端口

TCP协议保证两个进程顺利通信,不用担心数据包乱序或者丢包的问题。TCP跟踪数据包的顺序,如果包顺序乱了会重新排序,如果丢包会重新请求源主机重新发送数据包。

两台主机上会有很多进程。主机A向主机B发送数据时,首先会通过IP协议将数据包从主机A发送到主机B,然后通过TCP协议确定发送到哪个进程。TCP采用端口来区分进程。例如:进程B1的地址为:B:80。

32003.png

端口的范围是0~65535。其中 0~1023分配给一些特定的服务端口。例如21对应FTP, 80对应HTTP,25对应SMTP等。1024~65535是用户自定义的一些端口。当与服务端进行连接时客户端回随机分配一个未被占用的端口,当连接断开时,端口被释放。

1.5.6 客户端/服务器通信模式:

服务器进程可以向多个客户端进程提供服务:

469627.png


1.6用java编写客户端/服务器程序

以下所有的编程都基于 TCP/IP协议,致力于实现应用层。传输层向应用层提供了Socket接口,Socket封装了下层数据传输的细节,应用层通过socket建立与远程主机的连接,以进行数据传输。

套接字可以看作是通信链路两端的收发器,进程通过套接字收发数据:

735472.png

java中有三种套接字,socket, serverSocker,datagramSocket。其中socket, serverSocket建立在TCP协议基础上。datagramSocket建立在UDP协议基础上。

1.6.1 EchoServer.java 服务端程序:

public class EchoServer {


private int port=8000;

private ServerSocket serverSocket=null;

public EchoServer() throws IOException {

serverSocket = new ServerSocket(port);

System.out.println("服务器启动成功");

}

private BufferedReader getReader(InputStream is){

return new BufferedReader(new InputStreamReader(is));

}

private PrintWriter getWriter(OutputStream os) {

return new PrintWriter(new OutputStreamWriter(os), true); //true表示有数据就刷新

}

private String echo(String msg) {

return "echo:" + msg;

}

private void server() throws IOException {

while(true) {

Socket socket = null;

try {

socket = serverSocket.accept();

System.out.println(socket.getInetAddress() + ":" + socket.getPort()); //客户端的地址和端口

BufferedReader br = getReader(socket.getInputStream());

PrintWriter pw = getWriter(socket.getOutputStream());

String msg = null;

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

System.out.println(msg);

pw.println(echo(msg));

if("bye".equals(msg)) {

break;

}

}

}finally {

socket.close();

}

}

}

public static void main(String[] argsthrows IOException {

new EchoServer().server();

}

}

1.6.2 客户端程序:

public class EchoClient {

private String address = "localhost";

private int port = 8000;

private Socket socket;

public EchoClient() throws UnknownHostException, IOException {

socket = new Socket(addressport);

}

private BufferedReader getReader(InputStream is){

return new BufferedReader(new InputStreamReader(is));

}

private PrintWriter getWriter(OutputStream os) {

return new PrintWriter(new OutputStreamWriter(os), true);

}

private void talk() throws IOException {

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

BufferedReader br = getReader(socket.getInputStream());

PrintWriter pw = getWriter(socket.getOutputStream());

String msg = null;

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

pw.println(msg);

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

if("bye".equals(msg)) {

break;

}

}

localReader.close();

br.close();

pw.close();

}

public static void main(String[] argsthrows UnknownHostException, IOException {

new EchoClient().talk();

}

}

144440.png

在服务器端socket对象有远程和本地进程的地址和端口信息。客户端socket对象有远程和本地的地址和端口信息。客户端进程可以建立多个连接,每个连接对应唯一的一个端口。建立连接时需要指定服务器端的端口,而不用指定客户端的端口。不同协议可以使用相同的端口号,如TCP,UDP都可以使用1000端口。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值