欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Java的Socket通信,

来源: javaer 分享于  点击 40119 次 点评:178

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 语句

相关文章

    暂无相关文章
相关栏目:

用户点评