网络通信是怎么炼成的?Socket编程
两台计算机通过网络进行通信的必备条件是什么:IP地址,端口号,协议
Tcp/ip协议是最广泛的网络协议
Transfer control protocol 传输控制协议 Internet protocol互联网协议
网络分为五层:最底层的是物理层,用户最直观接触的,网线,网卡
数据链路层,网络层,传输层指的就是tcp/ip协议,最上方的就是应用层指的也是用户能够接触到的比如是http超文本传输协议,ftp文件传输协议,smtp,talet
每个机器都必须有一个身份的标识,那就是IP地址
端口号就是标识不同的应用程序,0~65535,其中0~1023被保留
IP地址和端口号组成了所谓的Socket,类似于电话的分机号和电话号码,这样才能组成一个通信链路的终结点,是TCP和UDP的基础
http:80 ftp:21 telnet:23
Java提供的网络功能的四大类:InetAddress用于标识网络上的硬件资源,URL统一资源定位符,通过URL可以直接读取或者写入网络上的数据,Socket使用tcp协议实现通信socket相关的类,Datagram使用UDP协议,将数据保存在数据包中,通过网络进行通信。
URL(unit resourcelocator)是由协议名称和资源名称组成,中间是用冒号隔开,在Java.net中,提供了URL类来表示URL
如何使用URL读取网页内容?
通过URL对象的openStream()方法可以指定资源的输入流,通过输入流可以读取,访问网络上的资源
Socket通信模型:“建立连接”服务器建立服务端去倾听socket,客户端创建连接socket并向服务器端发送请求,等待并且接收连接请求,接收请求后创建连接socket。“开始通信” inputstream和outputstream,“结束通信”关闭socket及其相关资源
Socket通信步骤:step1:创建服务器serversocket和客户端socket 。step2:打开连接到socket的输入流和输出流。step3:按照协议对socket进行读写操作 。 step4:关闭输入输出流,并且关闭socket 备注:先要启动服务器,然后才可以启动客户端
//创建一个serversocket的对象,绑定端口号
try {
ServerSocket serversocket=new ServerSocket(8888);
//通过accept方法等待客户端的连接,一旦连接上就会接收到一个socket
System.out.println("等待服务器连接");
Socketsocket=serversocket.accept();
//利用输入输出流通信,利用输入流来读取客户端的信息
InputStreamis=socket.getInputStream();
//为了提高性能,一般是将字节流转化为字符流
InputStreamReader isr=new InputStreamReader(is);
//为字符流添加缓存
BufferedReader br=new BufferedReader(isr);
String string=br.readLine();//读取数据
while(string!=null){
System.out.println("客户端的发送过来的数据信息:"+string);
string=br.readLine();//读取数据
}
//关闭资源
socket.shutdownInput();
br.close();
isr.close();
is.close();
//创建客户端Socket,指定服务器和端口
try {
Socket socket=new Socket("localhost",8888);
//开始向服务器发送登录信息,获取一个输出流
OutputStreamos=socket.getOutputStream();//获取一个字节输出流
PrintWriter pw=new PrintWriter(os);//将字节输出流封装成打印输出流
pw.write("用户名:admin;密码:123");
pw.flush();//刷新缓存
socket.shutdownOutput();
pw.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
服务器如何去响应客户端的请求?获取输出流,响应客户端的请求
//获取输出流,响应客户端的请求,其实是类似于之前客户端的发出请求,先要创建一个输出流
OutputStreamos=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);
pw.write("欢迎您的来访!");
pw.flush();
socket.shutdownOutput();
pw.close();
os.close();
客户端如何去获取到服务器的响应的内容?
//创建输入流来获取到服务器的请求
InputStreamis=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is);//转化为字符流
//为字符流添加缓存
BufferedReader br=new BufferedReader(isr);
String string=null;
while((string=br.readLine())!=null){
System.out.println("客户端获取到服务器响应的数据信息:"+string);
}
//关闭资源
socket.shutdownInput();
br.close();
isr.close();
is.close();
在实际应用中,服务器可以和多个客户端通信,那该使用哪种技术实现?
多线程实现多客户通话的机制:step1:服务器端创建SeverSocket,循环调用accept()等待客户端连接。Step2:客户端创建一个socket并请求与服务器端连接 step3:服务器端接收客户端的请求,创建socket与该客户建立专线连接 step4:建立连接的两个socket在一个单独的线程上对话 step5:服务器端继续等待新的连接
try { //创建一个服务器端socket,即serversocket绑定端口监听
ServerSocket serversocket=new ServerSocket(8888);
//利用accept()循环等待端口连接
Socket socket=null;
int count=0;
System.out.println("服务器等待客户端的连接");
while(true){
socket=serversocket.accept();
//循环连接,一旦连接上创建一个新的线程
MultiThread multithread=new MultiThread(socket);
//启动线程
multithread.run();
count++;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
创建一个专门的线程类的代码,copy上面的单一的一对一的server的代码
publicclass MultiThread extends Thread {
//创建专门的线程类来处理客户端的请求
//创建一个与本线程相关的socket,每一个不同的客户端对应着不同的socket
Socket socket=null;//属性
//带参数的构造器,初始化socket属性值
public MultiThread(Socket socket){
this.socket=socket;
}
//线程执行的操作,也就是定义一个方法响应客户端的请求
public void run(){
//利用输入输出流通信,利用输入流来读取客户端的信息