zoukankan      html  css  js  c++  java
  • 基于TCP编程的socket

    什么是TCP/IPUDP

             TCP/IPTransmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。
             UDPUser Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。
            这里有一张图,表明了这些协议的关系。

                                                                                    

                                                                            图1

           TCP/IP协议族包括运输层、网络层、链路层。现在你知道TCP/IPUDP的关系了吧。
    Socket在哪里呢?
           在图1中,我们没有看到Socket的影子,那么它到底在哪里呢?还是用图来说话,一目了然。

     



    2

           原来Socket在这里。
    Socket是什么呢?
           Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
    你会使用它们吗?
           前人已经给我们做了好多的事了,网络间的通信也就简单了许多,但毕竟还是有挺多工作要做的。以前听到Socket编程,觉得它是比较高深的编程知识,但是只要弄清Socket编程的工作原理,神秘的面纱也就揭开了。
           一个生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。    生活中的场景就解释了这工作原理,也许TCP/IP协议族就是诞生于生活中,这也不一定。

    客户端代码:

     1 package com.socket;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.IOException;
     5 import java.io.InputStreamReader;
     6 import java.io.PrintWriter;
     7 import java.net.InetAddress;
     8 import java.net.Socket;
     9 import java.net.UnknownHostException;
    10 
    11 public class OneClient {
    12 
    13     public static void main(String[] args) throws UnknownHostException, IOException {
    14         /**设置主机地址和端口号*/
    15         InetAddress address=InetAddress.getLocalHost();
    16         Socket socket=new Socket(address,123);
    17         
    18         BufferedReader read=new BufferedReader(new InputStreamReader(socket.getInputStream()));
    19         PrintWriter write=new PrintWriter(socket.getOutputStream());
    20         
    21         BufferedReader input=new BufferedReader(new InputStreamReader(System.in));
    22         
    23         String line;
    24         while((line=input.readLine())!=null){
    25           write.println(line);//向服务器输出
    26           write.flush();//清空缓存
    27           String responseinfo=read.readLine();//从服务器获取消息
    28           System.out.println("服务器:"+responseinfo);
    29         }
    30         /**关闭流和socket*/
    31         read.close();
    32         write.close();
    33         socket.close();
    34         }
    35     }

    服务器端代码:

     1 package com.socket;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.IOException;
     5 import java.io.InputStreamReader;
     6 import java.io.PrintWriter;
     7 import java.net.ServerSocket;
     8 import java.net.Socket;
     9 
    10 
    11 public class OneServer {
    12 
    13     public static void main(String[] args)  {
    14     ServerSocket server=null;
    15     
    16     try {
    17         server = new ServerSocket(123);
    18         System.out.println("服务器启动:"+server.getInetAddress().getHostAddress()+":"+server.getLocalPort());
    19         while(true){
    20         Socket socket=server.accept();//服务器接收客户端的请求信息
    21         System.out.println("客户端连接:"+socket.getInetAddress().getHostAddress()+":"+socket.getLocalPort());
    22         
    23          BufferedReader read=new BufferedReader(new InputStreamReader(socket.getInputStream()));
    24          PrintWriter write=new PrintWriter(socket.getOutputStream());
    25          
    26          BufferedReader input=new BufferedReader(new InputStreamReader(System.in));
    27          String line;
    28          while((line=read.readLine())!=null){
    29              System.out.println("客户端:"+line);//从客户端获得消息
    30              if(line.equals("bye")){
    31                  break;
    32              }else{             
    33              write.println(input.readLine());//向客户端发送消息
    34              }
    35              write.flush();          
    36          }
    37          read.close();
    38           write.close();
    39           socket.close();
    40         }
    41          
    42     } catch (IOException e) {
    43         
    44         e.printStackTrace();
    45     }finally{
    46         try {
    47             server.close();
    48         } catch (IOException e) {
    49             e.printStackTrace();
    50         }
    51     }
    52 }
    53 
    54 }

    注意:socket编程一定要注意读写,客户端读入得信息是服务器写出的信息,客户端写出的信息是服务器要读入的信息,反之亦然。

  • 相关阅读:
    Eclipse调试Java的10个技巧
    什么是POJO?
    能够提高开发效率的Eclipse实用操作
    Oracle数据库查看执行计划
    Oracle执行计划详解
    Android接收wifi路由器发送过来的一组字节数据
    Android与路由器连接服务
    Android真机连接手机Target显示unknown cmd命令下adb devices 显示offline
    绿豆沙色值多少
    如何在Eclipse中添加Servlet-api.jar的方法
  • 原文地址:https://www.cnblogs.com/dj168/p/socket.html
Copyright © 2011-2022 走看看