Java通信知识点汇集

网络通信是怎么炼成的?Socket编程

两台计算机通过网络进行通信的必备条件是什么:IP地址,端口号,协议

Tcp/ip协议是最广泛的网络协议

Transfer control protocol 传输控制协议    Internet protocol互联网协议

网络分为五层:最底层的是物理层,用户最直观接触的,网线,网卡

数据链路层,网络层,传输层指的就是tcp/ip协议,最上方的就是应用层指的也是用户能够接触到的比如是http超文本传输协议,ftp文件传输协议,smtptalet

每个机器都必须有一个身份的标识,那就是IP地址

端口号就是标识不同的应用程序,0~65535,其中0~1023被保留

IP地址和端口号组成了所谓的Socket,类似于电话的分机号和电话号码,这样才能组成一个通信链路的终结点,是TCPUDP的基础

http80     ftp:21   telnet:23

Java提供的网络功能的四大类:InetAddress用于标识网络上的硬件资源,URL统一资源定位符,通过URL可以直接读取或者写入网络上的数据,Socket使用tcp协议实现通信socket相关的类,Datagram使用UDP协议,将数据保存在数据包中,通过网络进行通信。

URLunit resourcelocator)是由协议名称和资源名称组成,中间是用冒号隔开,在Java.net中,提供了URL类来表示URL

 

如何使用URL读取网页内容?

通过URL对象的openStream()方法可以指定资源的输入流,通过输入流可以读取,访问网络上的资源

Socket通信模型:“建立连接”服务器建立服务端去倾听socket,客户端创建连接socket并向服务器端发送请求,等待并且接收连接请求,接收请求后创建连接socket。“开始通信”                   inputstreamoutputstream,“结束通信”关闭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(){

         //利用输入输出流通信,利用输入流来读取客户端的信息

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值