客戶端:
public class SocketSendUtils {
protected static Logger logger = LoggerFactory.getLogger(HttpHelper.class);
public static JSONObject acceptData(JSONObject json,String str,String addStr) {
JSONObject obj = null;
try {
// 要連接的服務端IP地址和端口
String host = "127.0.0.1";
int port = 12345; //與服務端端口一致
Socket socket;
socket = new Socket(host, port); // 與服務端建立連接
OutputStream outputStream = socket.getOutputStream(); // 建立連接後獲得輸出流
String message = "你好 我是客戶端";
socket.getOutputStream().write(str.getBytes("UTF-8"));
socket.getOutputStream().write(json.toString().getBytes("UTF-8"));
socket.shutdownOutput(); //通過shutdownOutput高速服務器已經發送完數據,後續只能接受數據
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
while ((len = inputStream.read(bytes)) != -1) {
sb.append(new String(bytes, 0, len,"UTF-8")); //注意指定編碼格式,發送方和接收方一定要統一,建議使用UTF-8
}
} catch (Exception e1) {
e1.printStackTrace();
}
return obj;
}
}
注:一般客戶端、服務端傳輸數據都是傳一次關閉一次,以下案例是直到傳輸完畢,才關閉連接
服務端:
public class SocketServer {
public static final int PORT = 12345;//監聽的端口號
public static void main(String[] args) {
System.out.println("服務器啓動...\n");
SocketServer server = new SocketServer();
server.init();
}
public void init() {
try {
ServerSocket serverSocket = new ServerSocket(PORT);
while (true) {
Socket client = serverSocket.accept(); // 一旦有堵塞, 則表示服務器與客戶端獲得了連接
new HandlerThread(client); // 處理這次連接
}
} catch (Exception e) {
System.out.println("服務器異常: " + e.getMessage());
}
}
private class HandlerThread implements Runnable {
private Socket socket;
public HandlerThread(Socket client) {
socket = client;
new Thread(this).start();
}
public void run() {
try {
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
while ((len = inputStream.read(bytes)) != -1) { //只有當客戶端關閉它的輸出流的時候,服務端才能取得結尾的-1
sb.append(new String(bytes, 0, len, "UTF-8")); // 注意指定編碼格式,發送方和接收方一定要統一,建議使用UTF-8
}
System.out.println("客戶端發過來的內容:" + sb.toString()); // 處理客戶端數據
OutputStream outputStream = socket.getOutputStream();
outputStream.close();
inputStream.close();
} 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());
}
}
}
}
}
}