1. Socket 通信简介及模型
Java Socket 可实现客户端--服务器间的双向实时通信。
java.net包
中定义的两个类
socket和ServerSocket
,分别用来实现双向连接的client和server端。
2. Socket 通信实现方法
服务器端(多线程)
package com.socket.test1;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
public class Server {
public static void start(){
try {
ServerSocket server = new ServerSocket(9099);
while(true){
Socket socket = server.accept();
executeSocketServer(socket);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void executeSocketServer(final Socket socket){
new Thread(new Runnable(){
public void run() {
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
//从客户端程序接收数据
InputStream is = socket.getInputStream();
int buf_size = 1024;
byte[] buffer = new byte[buf_size];
int len = 0;
while (-1 != (len = is.read(buffer, 0, buf_size))) {
bos.write(buffer, 0, len);
}
byte[] dataBytes = bos.toByteArray();
System.out.println("从客户端程序接收数据:"+Arrays.toString(dataBytes));
String msg="服务器端返回的数据内容!BBB";
//得到socket读写流,向服务端程序发送数据
socket.getOutputStream().write(msg.getBytes());
socket.shutdownOutput();
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
}
public static void main(String[] args) {
start();
}
}
客户端:
package com.socket.test1;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String args[]) {
byte[] byteArray = {1,2,3,4,5,6,7,8,9,10,11,12,13,14};
executeSocket(byteArray);
}
public static void executeSocket(byte[] data) {
Socket socket = null;
try {
socket = new Socket("127.0.0.1", 9099);
//得到socket读写流,向服务端程序发送数据
socket.getOutputStream().write(data);
socket.shutdownOutput();//发送完后调用Socket的shutdownOutput()方法关闭输出流,这样对端的输入流上的read操作就会返回-1
//从服务端程序接收数据
byte[] datas = new byte[1024];
socket.getInputStream().read(datas);
System.out.println("从服务端程序接收数据:"+new String(datas));
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socket != null) socket.close(); // 关闭Socket
} catch (IOException e) {
e.printStackTrace();
}
}
}
}