Java的Socket通信

本文介绍了服务器端和客户端如何通过Socket实现实时通信,包括服务器监听客户端连接、启动交流线程接收并处理客户端数据,以及客户端连接服务器后通过交流线程发送与接收信息的过程。

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

需求:服务器和客户端可以及时不间断通信

思路:1、服务器端:
1)建立ServerSocket和开启监听客户端连接
2)新建交流线程,在线程中不断循环读取客户端发送过来的数据。
2、客户端:
1)建立Socket和服务器连接通信
2)新建交流线程,在线程中不断循环读取客户端发送过来的数据。

这里做了简化:服务器端和客户端用的是同一种交流线程。

Server:



import com.sun.xml.internal.ws.resources.SenderMessages;

import java.awt.EventQueue;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;


/**
 * 服务器端
 */

public class Server {
    public static final int PORT = 12345;//监听的端口号
    private static ExchangeThread serverExchangeThread;

    public static void main(String[] args) {
        try {
            Init(PORT);
            // 演示:连接成功后,直接调用线程里的send方法发送两条消息
            serverExchangeThread.sendMessage("aaa");
            serverExchangeThread.sendMessage("123");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void Init(int PORT){
        try {
            ServerSocket ss = new ServerSocket(PORT);
            System.out.println("端口号"+PORT+",服务器已启动");
            Socket s = ss.accept();
            System.out.println("连接成功");
            // 启动交流线程
            serverExchangeThread=new ExchangeThread(s);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static ExchangeThread getExchangeThread(){
        return serverExchangeThread;
    }

}

Client:

import java.awt.EventQueue;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 客户端
 * Created by Fang
 */
public class Client {
    public static final int PORT = 12345;//监听的端口号
    private static ExchangeThread clientExchangeThread;

    public static void main(String[] args) {
        try {
            Init(PORT);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void Init(int PORT){
        try {
            Socket socket = new Socket("localhost",PORT);
            System.out.println("客户端IP:"+socket.getLocalAddress()+"端口"+socket.getPort());
            // 启动交流线程
            clientExchangeThread=new ExchangeThread(socket);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static ExchangeThread getExchangeThread(){
        return clientExchangeThread;
    }
}

通信用的线程,while循环里不断的读
ExchangeThread:



import java.io.*;
import java.net.Socket;



/**
 * 进程通信线程
 */

public class ExchangeThread implements Runnable {
    private Socket socket;
    BufferedReader bufferedReader;
    BufferedWriter bufferedWriter;

    public static boolean isNum(String str){
        return str.matches("^[-+]?(([0-9]+)([.]([0-9]+))?|([.]([0-9]+))?)$");
    }

    public ExchangeThread(Socket socket) {
        this.socket = socket;
        try {
            bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        }catch (Exception e){
            e.printStackTrace();
        }
        new Thread(this).start();
    }
    public void run() {
        try {
            while(true) {
                // 这里负责读
                String mess = bufferedReader.readLine();
                System.out.println(mess);
                // 接收到对方发来的消息,就可以进行相应操作了
                // 这里假设:如果接收到的消息为数组,那么就发送一个 is number回去
                if(isNum(mess)) {
                    sendMessage("is number");
                }
            }
        } catch (Exception e) {
            System.out.println("服务器 run 异常: " + e.getMessage());
        } finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (Exception e) {
                    socket = null;
                    System.out.println("服务端 finally 异常:" + e.getMessage());
                }
            }
        }
    }

    public void sendMessage(String str){
        // 这里负责写
        try {
            bufferedWriter.write(str);
            bufferedWriter.newLine();
            bufferedWriter.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

运行效果:
首先启动Server

然后启动Client,这时socket已经接通了,Client处接受到来自server处sendMessage(server的main处)消息

然后Server接受到 Client发来的 is number 语句

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值