通讯协议大概分五层。
分层优势
:
不须要管具体实现,只须要作本身的事情。
分层标准:
OSI
参考模型
TCP/IP
参考模型
TCP/IP
详解(了解网络底层的书)
IPV6
的相关问题
TCP
为可靠的因特网链接
UDP
为不可靠的因特网链接
Socket
的基本概念:
两个
java
应用程序能够经过一个双向的网络通讯链接实现数据交换,这个双向链路的一端称为一个
Socket
。
Socket
一般用来实现
client
—
server
链接。(
CS
模式,客户端服务器模式)
java.net
包中定义两个类
Socket
和
ServerSocket
,分别用来实现双向连接的
client
和
server
端。
创建链接时所需的寻址信息为远程计算机的
IP
地址和端口号(
Port number
)
网络编程:
Socket
编程
ServerSocket
为TCP
上的服务器端口。
IP
地址和端口号(Port number
)
端口号表示应用程序的识别码
相似于IP
端口号为两个字节最多有65536
个端口
一个应用程序能够应用多个端口号
注意一点:本身编程占用端口号时:尽可能用
1024
以上的端口号,由于
1024
如下的端口系统有可能征用。
关于数据的传输使用流的概念。
流的东西在
java.io.*
包中。
在
Socket
端口上有个
getInputStream()
方法
注意:
DataInputStream
类中的
readUTF
();方法也是阻塞式的方法。
ServerSocket
的方法accept()也为阻塞式的。
因为readUTF方法为阻塞式的
则会产生以下问题:
当一个客户端调用服务器的时候进行通讯调用readUTF()方法时,就会产生阻塞,其余的客户端就没法访问服务器。
在服务器中使用
Socket
的
getInetAddress
获取客户端的端口号
CS
之间的数据传输:使用流概念就是:
OutPutStream
和
InPutStream
能够在各类流上添加相应的处理流。用来方便处理。
如今咱们能够作一个简单的聊天程序。
做业。。。。。。。。。
小例子:
客户端:
import java.net.*;
public class TCPClient
{
public void main(String[] args) throws Exception
{
Socket cl = new Socket("127.0.0.1",6666);//有异常产生,127.0.0.1为本地IP地址。6666为端口号
}
}
服务器端:
import java.net.*;public class TCPServer{ public void main(String[] args) throws Exception { ServerSocket a=new ServerSocket(6666);//监听6666端口号 有异常产生,能够抛出。 while(true)//服务器端为死循环,一直循环等待客户端链接。 { Socket s=a.accept();//在服务器上建立一个和客户端相链接的Socket端口,抛出IO异常。这时候只能接受一个客户端的链接,由于一个Acception只能接受一个客户端链接。 //Accept方法为阻塞式的方法。 System.out.println("链接结束"); } }}