Socket通信实例(三)——多线程实例

来源:互联网 发布:战无不胜灵骑进阶数据 编辑:程序博客网 时间:2024/04/29 15:49

       这几天电脑的Oracle数据库出了问题,把电脑重新安装了一下。多线程的实例拖了这么多天,先直接上代码了。

       服务器端代码:

    

import java.io.*; import java.net.*; /** * 服务器端程序 *  * @author JunwenYu  * @time 2013-08-16  */public class TestServer {    public static void main(String args[]) {        try {            // 创建一个socket对象            ServerSocket s = new ServerSocket(8888);            // socket对象调用accept方法,等待连接请求            Socket s1 = s.accept();            // =========服务器端,在这里应该先打开输出流,在打开输入流,            // =========因为服务器端执行的操作是先听,再说,听,说,听,说.....            // 打开输出流            OutputStream os = s1.getOutputStream();            // 封装输出流            DataOutputStream dos = new DataOutputStream(os);            // 打开输入流            InputStream is = s1.getInputStream();            // 封装输入流            DataInputStream dis = new DataInputStream(is);            // 创建并启用两个线程            new MyServerReader(dis).start();            new MyServerWriter(dos).start();        } catch (IOException e) {            e.printStackTrace();        }    }}// 接受并打印客户端传过来的信息class MyServerReader extends Thread {    private DataInputStream dis;    public MyServerReader(DataInputStream dis) {        this.dis = dis;    }    public void run() {        String info;        try {            while (true) {                // 如果对方,即客户端没有说话,那么就会阻塞到这里,                // 这里的阻塞并不会影响到其他线程                info = dis.readUTF();                // 如果状态有阻塞变为非阻塞,那么就打印接受到的信息                System.out.println("对方说: " + info);                if (info.equals("bye")) {                    System.out.println("对方下线,程序退出!");                    System.exit(0);                }            }        } catch (IOException e) {            e.printStackTrace();        }    }}// 从键盘获得输入流并写入信息到客户端class MyServerWriter extends Thread {    private DataOutputStream dos;    public MyServerWriter(DataOutputStream dos) {        this.dos = dos;    }    public void run() {        // 读取键盘输入流        InputStreamReader isr = new InputStreamReader(System.in);        // 封装键盘输入流        BufferedReader br = new BufferedReader(isr);        String info;        try {            while (true) {                info = br.readLine();                dos.writeUTF(info);                if (info.equals("bye")) {                    System.out.println("自己下线,程序退出!");                    System.exit(0);                }            }        } catch (IOException e) {            e.printStackTrace();        }    }}


   


 

  客户端代码:

 

import java.io.*;import java.net.*;/** * 客户端程序 *  * @author JunwenYu *  * @time 2013-08-16  */public class TestClient {    public static void main(String args[]) {        try {            // 创建socket对象,指定服务器的ip地址,和服务器监听的端口号            // 客户端在new的时候,就发出了连接请求,服务器端就会进行处理,如果服务器端没有开启服务,那么            // 这时候就会找不到服务器,并同时抛出异常==》java.net.ConnectException: Connection            // refused: connect            Socket s1 = new Socket("127.0.0.1", 8888);            // =========客户端,在这里应该先打开输入流,在打开输出流,            // =========因为客户端执行的操作是先说,再听,说,听,说,听.....            // 打开输入流            InputStream is = s1.getInputStream();            // 封装输入流            DataInputStream dis = new DataInputStream(is);            // 打开输出流            OutputStream os = s1.getOutputStream();            // 封装输出流            DataOutputStream dos = new DataOutputStream(os);            // 创建并启用两个线程            new MyClientReader(dis).start();            new MyClientWriter(dos).start();        } catch (IOException e) {            e.printStackTrace();        }    }}// 接受并打印服务器端传过来的信息class MyClientReader extends Thread {    private DataInputStream dis;    public MyClientReader(DataInputStream dis) {        this.dis = dis;    }    public void run() {        String info;        try {            while (true) {                info = dis.readUTF();                System.out.println("对方说: " + info);                if (info.equals("bye")) {                    System.out.println("对方下线,程序退出!");                    System.exit(0);                }            }        } catch (IOException e) {            e.printStackTrace();        }    }}// 从键盘获得输入流并写入信息到服务器端class MyClientWriter extends Thread {    private DataOutputStream dos;    public MyClientWriter(DataOutputStream dos) {        this.dos = dos;    }    public void run() {        InputStreamReader isr = new InputStreamReader(System.in);        BufferedReader br = new BufferedReader(isr);        String info;        try {            while (true) {                info = br.readLine();                dos.writeUTF(info);                if (info.equals("bye")) {                    System.out.println("自己下线,程序退出!");                    System.exit(0);                }            }        } catch (IOException e) {            e.printStackTrace();        }    }}


 

      

      今天写贴代码,注释也已经很清楚了,日后再具体来说,或者直接联系我的QQ:445574292

    下一期写一个Java与C用Socket进行通信的例子,也是我们暑期实习时做过的一个例子。客户端用Java做,服务器端用C。

原创粉丝点击