黑马程序员_Java Socket 的通信

来源:互联网 发布:数据挖掘 编辑:程序博客网 时间:2024/06/05 06:44

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------                          

                    Java Socket

服务器端:

[java]
package qy.server; 
 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
 
public class MyServer { 
    private ServerSocket serverSocket; //  
    private ExecutorService servicePool; // 线程池 
 
    public MyServer(int port) { 
        try { 
            this.serverSocket = new ServerSocket(port); 
            this.servicePool = Executors.newFixedThreadPool(5); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
    } 
 
    public static void main(String[] args) { 
        new MyServer(6666).service();  
    } 
 
    public void service() { 
        int i = 0; 
        while (true) { 
            try { 
                Socket socket = this.serverSocket.accept(); // 接受到一个连接,并且返回一个客户端的Socket对象实例 
                this.servicePool.execute(new Handler(socket)); 
                System.out 
                        .println("User " + i + " is connecting to the Server"); 
                i++; 
            } catch (IOException e) { 
                e.printStackTrace(); 
                this.servicePool.shutdown(); 
            } 
        } 
    } 
 
    class Handler implements Runnable { 
        private Socket socket; 
 
        public Handler(Socket socket) { 
            this.socket = socket; 
        } 
 
        @Override 
        public void run() { 
            try { 
                // 一个输入流,用于获取客户端传来的内容 
                DataInputStream dis = new DataInputStream( 
                        this.socket.getInputStream()); 
                // 用于产生服务器准备响应的内容 
                DataOutputStream dos = new DataOutputStream(this.socket.getOutputStream()); 
                String str; 
                while (null != (str = dis.readUTF())) { 
                    System.out.println(str); 
                    if ("exit".equals(str)) { 
                        System.out.println("客户端发出中断请求"); 
                        dos.writeUTF("服务器已经关闭本次连接."); 
                        dos.flush(); 
//                      dos.writeUTF("exit"); //  
//                      dos.flush(); 
                         
                        dos.close(); 
                        dis.close(); 
                        break; 
                    } 
                } 
 
            } catch (IOException e) { 
                e.printStackTrace(); 
            } 
        } 
    } 

然后,客户端:
[java] 
package qy.client; 
 
import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.Socket; 
 
public class MyClient { 
 
    public static void main(String[] args) { 
        try { 
            Socket client = new Socket("localhost", 6666); 
            MyClient me = new MyClient(); 
            new Thread(me.new Handler(client)).start(); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
    } 
 
    class Handler implements Runnable { 
        private BufferedReader br; 
        private DataOutputStream dos; 
        private DataInputStream dis; 
        private Socket socket; 
        private boolean flag = true; // 用于控制循环结束 
 
        public Handler(Socket s) throws IOException { 
            this.br = new BufferedReader(new InputStreamReader(System.in)); // 用于从控制台接受输入的信息,再发送到服务器 
            this.socket = s; 
            this.dos = new DataOutputStream(this.socket.getOutputStream()); // 向服务器写数据的输出流 
            this.dis = new DataInputStream(this.socket.getInputStream()); // 获取服务器返回数据的输入流 
        } 
 
        @Override 
        public void run() { 
            while (flag) { 
                try { 
                    String str = br.readLine(); 
                    if ("exit".equals(str)) { // 客户端终止发送信息标记 exit 
                        this.br.close();  
                        this.dos.writeUTF(str); 
                        this.dos.flush(); 
                         
                        String res = dis.readUTF(); 
                        System.out.println(res); 
 
                        this.dis.close(); 
                        this.dos.close(); 
                        this.flag = false; 
                    } else { 
                        this.dos.writeUTF(str);// 每读一行就发送一行 
                        this.dos.flush(); 
                    } 
 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
            } 
        } 
    } 

遇到的问题:
最先考虑的是使用BufferedReader和BufferedWriter来完成双向数据的写入写出,但是发现BufferedWriter在fush()的时候并不能把从控制台得到的数据立即发送到服务端,就改用DataOutputStream数据流来完成双向数据传递。
原创粉丝点击