您的位置:首页 > 编程语言 > Java开发

Java的Socket通信

2015-11-14 19:28 387 查看
需求:服务器和客户端可以及时不间断通信

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: