Java的Socket通信

来源:互联网 发布:淘宝上二手手机良心店 编辑:程序博客网 时间:2024/05/18 12:00

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

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

1 0
原创粉丝点击