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

博客介绍了Java中使用Socket实现多线程通信的实例,包括服务器端和客户端的代码展示,作者提到后续会分享Java与C通过Socket通信的案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       这几天电脑的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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值