Java的Socket通信

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

思路: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 语句

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的Socket通信是一种基于网络的通信方式,可以实现进程间的数据交换和通信。下面是一个简单的Java Socket通信的示例代码: ```java // 服务器端 import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) throws IOException { // 创建服务器Socket并绑定端口 ServerSocket serverSocket = new ServerSocket(8888); System.out.println("服务器启动,等待客户端连接..."); // 等待客户端连接 Socket socket = serverSocket.accept(); System.out.println("客户端已连接"); // 获取输入流 InputStream inputStream = socket.getInputStream(); byte[] buffer = new byte[1024]; int length; // 读取客户端发送的数据 while ((length = inputStream.read(buffer)) != -1) { String message = new String(buffer, 0, length); System.out.println("收到客户端消息:" + message); } // 关闭连接 inputStream.close(); socket.close(); serverSocket.close(); } } ``` ```java // 客户端 import java.io.IOException; import java.io.OutputStream; import java.net.Socket; public class Client { public static void main(String[] args) throws IOException { // 创建客户端Socket并指定服务器地址和端口 Socket socket = new Socket("localhost", 8888); // 获取输出流 OutputStream outputStream = socket.getOutputStream(); // 发送消息到服务器 String message = "Hello, Server!"; outputStream.write(message.getBytes()); // 关闭连接 outputStream.close(); socket.close(); } } ``` 以上代码实现了一个简单的Socket通信,服务器端监听指定端口,等待客户端连接,客户端通过指定服务器地址和端口与服务器建立连接,并发送消息给服务器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值