服務端源代碼:
- package com.defonds.socket.begin;
- import java.io.BufferedReader;
- import java.io.DataInputStream;
- import java.io.DataOutputStream;
- import java.io.InputStreamReader;
- import java.net.ServerSocket;
- import java.net.Socket;
- public class Server {
- public static final int PORT = 12345;//監聽的端口號
- public static void main(String[] args) {
- System.out.println("服務器啓動...\n");
- Server server = new Server();
- 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 {
- // 讀取客戶端數據
- DataInputStream input = new DataInputStream(socket.getInputStream());
- String clientInputStr = input.readUTF();//這裏要注意和客戶端輸出流的寫方法對應,否則會拋 EOFException
- // 處理客戶端數據
- System.out.println("客戶端發過來的內容:" + clientInputStr);
- // 向客戶端回覆信息
- DataOutputStream out = new DataOutputStream(socket.getOutputStream());
- System.out.print("請輸入:\t");
- // 發送鍵盤輸入的一行
- String s = new BufferedReader(new InputStreamReader(System.in)).readLine();
- out.writeUTF(s);
- out.close();
- input.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());
- }
- }
- }
- }
- }
- }
- package com.defonds.socket.begin;
- import java.io.BufferedReader;
- import java.io.DataInputStream;
- import java.io.DataOutputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.net.Socket;
- public class Client {
- public static final String IP_ADDR = "localhost";//服務器地址
- public static final int PORT = 12345;//服務器端口號
- public static void main(String[] args) {
- System.out.println("客戶端啓動...");
- System.out.println("當接收到服務器端字符爲 \"OK\" 的時候, 客戶端將終止\n");
- while (true) {
- Socket socket = null;
- try {
- //創建一個流套接字並將其連接到指定主機上的指定端口號
- socket = new Socket(IP_ADDR, PORT);
- //讀取服務器端數據
- DataInputStream input = new DataInputStream(socket.getInputStream());
- //向服務器端發送數據
- DataOutputStream out = new DataOutputStream(socket.getOutputStream());
- System.out.print("請輸入: \t");
- String str = new BufferedReader(new InputStreamReader(System.in)).readLine();
- out.writeUTF(str);
- String ret = input.readUTF();
- System.out.println("服務器端返回過來的是: " + ret);
- // 如接收到 "OK" 則斷開連接
- if ("OK".equals(ret)) {
- System.out.println("客戶端將關閉連接");
- Thread.sleep(500);
- break;
- }
- out.close();
- input.close();
- } catch (Exception e) {
- System.out.println("客戶端異常:" + e.getMessage());
- } finally {
- if (socket != null) {
- try {
- socket.close();
- } catch (IOException e) {
- socket = null;
- System.out.println("客戶端 finally 異常:" + e.getMessage());
- }
- }
- }
- }
- }
- }