一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Java--Socket通信(客户端服务端双向)

时间:2017-02-09 编辑:简简单单 来源:一聚教程网

新建两个工程,一个客户端,一个服务端,先启动服务端再启动客户端

两个工程的读写操作线程类基本上完全相同

服务端:

 

 代码如下 复制代码

importjava.io.BufferedReader;

importjava.io.DataInputStream;

importjava.io.DataOutputStream;

importjava.io.IOException;

importjava.io.InputStreamReader;

importjava.net.ServerSocket;

importjava.net.Socket;

  

publicclassServer {

  

  publicstaticfinalintPORT =8000;//监听的端口号  

  

  publicstaticvoidmain(String[] args) { 

    Server server =newServer(); 

    server.init(); 

  } 

  

  publicvoidinit() { 

    ServerSocket serverSocket =null;

    try{ 

      serverSocket =newServerSocket(PORT); 

      while(true) { 

        Socket client = serverSocket.accept(); 

        //一个客户端连接就开户两个线程处理读写 

        newThread(newReadHandlerThread(client)).start(); 

        newThread(newWriteHandlerThread(client)).start(); 

      } 

    }catch(Exception e) { 

      e.printStackTrace(); 

    }finally{

      try{

        if(serverSocket !=null){

          serverSocket.close();

        }

      }catch(IOException e) {

        e.printStackTrace();

      }

    }

  } 

  

/*

 *处理读操作的线程 

 */

class ReadHandlerThread implements Runnable{

  private Socket client;

  

  public ReadHandlerThread(Socket client) {

    this.client = client;

  }

  

  @Override

  public void run() {

    DataInputStream dis = null;

    try{

      while(true){

        //读取客户端数据 

        dis = new DataInputStream(client.getInputStream());

        String reciver = dis.readUTF();

        System.out.println("客户端发过来的内容:" + reciver); 

      }

    }catch(Exception e){

      e.printStackTrace();

    }finally{

      try {

        if(dis != null){

          dis.close();

        }

        if(client != null){

          client = null;

        }

      } catch (IOException e) {

        e.printStackTrace();

      }

    }

  }

}

  

/*

 * 处理写操作的线程

 */

classWriteHandlerThreadimplementsRunnable{

  privateSocket client;

  

  publicWriteHandlerThread(Socket client) {

    this.client = client;

  }

  

  @Override

  publicvoidrun() {

    DataOutputStream dos =null;

    BufferedReader br =null;

    try{

      while(true){

        //向客户端回复信息 

        dos =newDataOutputStream(client.getOutputStream()); 

        System.out.print("请输入:\t"); 

        // 键盘录入 

        br =newBufferedReader(newInputStreamReader(System.in));

        String send = br.readLine(); 

        //发送数据

        dos.writeUTF(send); 

      }

    }catch(Exception e){

      e.printStackTrace();

    }finally{

      try{

        if(dos !=null){

          dos.close();

        }

        if(br !=null){

          br.close();

        }

        if(client !=null){

          client =null;

        }

      }catch(IOException e) {

        e.printStackTrace();

      }

    }

  }

}

 

客户端:

 

 代码如下 复制代码

importjava.io.BufferedReader;

importjava.io.DataInputStream;

importjava.io.DataOutputStream;

importjava.io.IOException;

importjava.io.InputStreamReader;

importjava.net.Socket;

  

publicclassClient {

  

  publicstaticfinalString IP ="localhost";//服务器地址 

  publicstaticfinalintPORT =8000;//服务器端口号 

  

  publicstaticvoidmain(String[] args) { 

    handler(); 

  }

  

  privatestaticvoidhandler(){

    try{

      //实例化一个Socket,并指定服务器地址和端口

      Socket client =newSocket(IP, PORT);

      //开启两个线程,一个负责读,一个负责写

      newThread(newReadHandlerThread(client)).start();

      newThread(newWriteHandlerThread(client)).start();

    }catch(Exception e) {

      e.printStackTrace();

    }

  }

  

/*

 *处理读操作的线程 

 */

class ReadHandlerThread implements Runnable{

  private Socket client;

  

  public ReadHandlerThread(Socket client) {

    this.client = client;

  }

  

  @Override

  public void run() {

    DataInputStream dis = null;

    try {

      while(true){

        //读取服务器端数据 

        dis = new DataInputStream(client.getInputStream());

        String receive = dis.readUTF();  

        System.out.println("服务器端返回过来的是: " + receive); 

      }

    } catch (IOException e) {

      e.printStackTrace();

    } finally{

      try {

        if(dis != null){

          dis.close();

        }

        if(client != null){

          client = null;

        }

      } catch (IOException e) {

        e.printStackTrace();

      }

    }

  }

}

  

/*

 * 处理写操作的线程

 */

classWriteHandlerThreadimplementsRunnable{

  privateSocket client;

  

  publicWriteHandlerThread(Socket client) {

    this.client = client;

  }

  

  @Override

  publicvoidrun() {

    DataOutputStream dos =null;

    BufferedReader br =null;

    try{

      while(true){

        //取得输出流

        dos =newDataOutputStream(client.getOutputStream());

        System.out.print("请输入: \t"); 

        //键盘录入

        br =newBufferedReader(newInputStreamReader(System.in));

        String send = br.readLine(); 

        //发送数据

        dos.writeUTF(send); 

      }

    }catch(IOException e) {

      e.printStackTrace();

    }finally{

      try{

        if(dos !=null){

          dos.close();

        }

        if(br !=null){

          br.close();

        }

        if(client !=null){

          client =null;

        }

      }catch(Exception e){

        e.printStackTrace();

      }

    }

  }

}

 

热门栏目