Socket通信基础篇(一)

来源:互联网 发布:数据库系统工程视频 编辑:程序博客网 时间:2024/05/22 09:40

现在的APP几乎都涵盖了通信这个概念,提到通信,就得用到Socket和UDP。Socket是一种基于TCP/IP协议,建立稳定连接的点对点通信,它的特点是安全性高,数据不会丢失,但是很占系统资源。
Socket又叫做套接字,它的通信原理还是比较简单的。大致分为以下几个步骤。 

服务器端的步骤如下。
(1)建立服务器端的Socket,开始侦听整个网络中的连接请求

  
 ServerSocket ss = newServerSocket(port);//port 指监听端口号

  备注:

  0~1023的端口号为系统所保留,例如http服务的端口号为80,telnet服务的端口号为21,ftp服务的端口号为  23, 所以我们在选择端口号时,最好选择一个大于1023的数以防止发生冲突。  Socket socket = ss.accept();
(2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接。
(3)当完成通信后,服务器关闭与客户端的Socket连接。
客户端的步骤如下。
(1)建立客户端的Socket,确定要连接的服务器的主机名和端口。

 
   Socket socket =new Socket(主机名,端口号);   eg.//向本机的3000端口发出客户请求   Socket socket = newSocket(InetAddress.getLocalHost(),3000);

(2)发送连接请求到服务器,并等待服务器的回馈信息。
(3)连接成功后,与服务器进行数据的交互。
(4)数据处理完毕后,关闭自身的Socket连接。
 
简单的Client/Server示例:
客户端:
public class Client {       public static void main(String[] args) {       // TODOAuto-generated method stub       Socketsocket = null;      BufferedReader bufferedReader = null,sBufferedReader = null;       PrintWriterprintWriter = null;       try {         //向本机的3000端口发出客户请求          socket = newSocket(InetAddress.getLocalHost(),3000);         //由socket对象得到输入流,并构造相应的BufferReader 对象         bufferedReader = new BufferedReader(newInputStreamReader(socket.getInputStream()));         //由socket对象得到输出流,并构造PrintWriter对象          printWriter= new PrintWriter(socket.getOutputStream());          //由系统标准输入设备构造BufferedReader对象         sBufferedReader = new BufferedReader(newInputStreamReader(System.in));         while(true){            //从系统标准输入读入一字符串             Stringstring = sBufferedReader.readLine();            printWriter.println(string);            //刷新输出流,是服务器立马获得该字符            printWriter.flush();                         Stringsstring = bufferedReader.readLine();            System.out.println("Server said"+sstring);                        if(string.equals("end")){                break;             }          }       } catch(UnknownHostException e) {          // TODOAuto-generated catch block         e.printStackTrace();       } catch(IOException e) {          // TODOAuto-generated catch block         e.printStackTrace();      }finally{         if(bufferedReader != null){             try {               bufferedReader.close();             } catch(IOException e) {                // TODOAuto-generated catch block               e.printStackTrace();             }             if(printWriter != null ) {               printWriter.close();             }             if (socket!= null ) {                try {                  socket.close();                } catch(IOException e) {                   // TODOAuto-generated catch block                  e.printStackTrace();                }             }          }       }    }}

服务器:
public class myServer {       public static void main(String[] args) {       // TODOAuto-generated method stub       ServerSocketserverSocket = null;       Socketclient = null;       BufferedReader bufferedReader = null,sBufferedReader = null;       PrintWriterprintWriter  = null;       try {         //创建一个ServerSocket在端口3000监听客户请求           serverSocket= new ServerSocket(3000);         //使用accept()阻塞等待客户请求          client =serverSocket.accept();         bufferedReader= new BufferedReader(newInputStreamReader(client.getInputStream()));          printWriter= new PrintWriter(client.getOutputStream());         sBufferedReader = new BufferedReader(newInputStreamReader(System.in));                   while (true){             Stringstring = bufferedReader.readLine();            System.out.println("Client said:"+string);                        printWriter.println(sBufferedReader.readLine());            printWriter.flush();                         if(string.equals("end")) {                break;             }          }       } catch(IOException e) {          // TODOAuto-generated catch block         e.printStackTrace();      }finally{         if(bufferedReader != null){             try {               bufferedReader.close();             } catch(IOException e) {                // TODOAuto-generated catch block               e.printStackTrace();             }             if(printWriter != null ) {               printWriter.close();             }             if(serverSocket != null ) {                try {                  serverSocket.close();                } catch(IOException e) {                   // TODOAuto-generated catch block                  e.printStackTrace();                }             }             if (client!= null) {                try {                  client.close();                } catch(IOException e) {                   // TODOAuto-generated catch block                  e.printStackTrace();                }             }          }       }    }}

效果图:
上边的代码只是实现一个客户端访问服务器,如果要多个客户同时访问一个服务器,那么服务端的代码就要修改了:
public class MyServerMutile extends Thread{      Socketclient;      publicMyServerMutile(Socket c) {       // TODOAuto-generated constructor stub         this.client= c;       }         public voidrun() {        ServerSocketserverSocket = null;        Socketclient = null;        BufferedReader bufferedReader = null,sBufferedReader = null;        PrintWriterprintWriter  = null;        try {         //创建一个ServerSocket在端口3000监听客户请求           serverSocket= new ServerSocket(3000);         //使用accept()阻塞等待客户请求          client =serverSocket.accept();          bufferedReader= new BufferedReader(newInputStreamReader(client.getInputStream()));          printWriter= new PrintWriter(client.getOutputStream());          sBufferedReader = new BufferedReader(newInputStreamReader(System.in));                    while (true){             Stringstring = bufferedReader.readLine();             System.out.println("Client said:"+string);                         printWriter.println(sBufferedReader.readLine());             printWriter.flush();                         if(string.equals("end")) {                break;             }          }       } catch(IOException e) {          // TODOAuto-generated catch block         e.printStackTrace();      }finally{         if(bufferedReader != null){             try {               bufferedReader.close();             } catch(IOException e) {                // TODOAuto-generated catch block               e.printStackTrace();             }             if(printWriter != null ) {               printWriter.close();             }             if(serverSocket != null ) {                try {                  serverSocket.close();                } catch(IOException e) {                   // TODOAuto-generated catch block                  e.printStackTrace();                }             }             if (client!= null) {                try {                  client.close();                } catch(IOException e) {                   // TODOAuto-generated catch block                  e.printStackTrace();                }             }          }       }    }


   
    publicstatic void main(String[] args) {       // TODOAuto-generated method stub       try {          ServerSocketserverSocket = new ServerSocket(3000);         while(true){            MyServerMutile myServerMutile = newMyServerMutile(serverSocket.accept());            myServerMutile.start();          }       } catch(IOException e) {          // TODOAuto-generated catch block         e.printStackTrace();       }                }}


0 0
原创粉丝点击