Java Socket編程實例

Java Socket編程筆記

(注:需要 Java IO相關的知識)

1.使用 TCP 連接的demo


需要用到 java.net.Socket  和 java.net.ServerSocket ,具體可以查詢 API 文檔
創建 Sever 類和 Client 類作爲 demo

Server類的實現:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 基於TCp的Socket通信,實現用戶登錄
 * 服務器端
 */
public class Server {
    public static void main(String[] args) {

        try  {
            //創建一個服務器socket,即serversocket,指定綁定的端口,並監聽此端口
            ServerSocket serverSocket = new ServerSocket(8888);
            //調用accept()方法開始監聽,等待客戶端的連接
            System.out.println("***服務器即將啓動,等待客戶端的連接***");
            Socket socket = serverSocket.accept();
            //獲取輸入流,並讀入客戶端的信息
            InputStream in = socket.getInputStream(); //字節輸入流
            InputStreamReader inreader = new InputStreamReader(in); //把字節輸入流轉換爲字符流
            BufferedReader br = new BufferedReader(inreader); //爲輸入流添加緩衝
            String info = null;
            while((info = br.readLine())!=null){
                System.out.println("我是服務器,客戶端說:"+info);
    
            }
            socket.shutdownInput();//關閉輸入流

            //獲取輸出流,相應客戶端的信息
            OutputStream outputStream = socket.getOutputStream();
            PrintWriter printWriter = new PrintWriter(outputStream);//包裝爲打印流
            printWriter.write("歡迎您!");
            printWriter.flush(); //刷新緩衝
            socket.shutdownOutput();

            //關閉資源
            printWriter.close();
            outputStream.close();

            br.close();
            inreader.close();
            in.close();
            socket.close();
            serverSocket.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Client類的實現:
import java.io.*;
import java.net.Socket;

/**
 * 客戶端
 */
public class Client {
    public static void main(String[] args) {
        //創建客戶端socket建立連接,指定服務器地址和端口
        try {
            Socket socket = new Socket("127.0.0.1",8888);
            //獲取輸出流,向服務器端發送信息
            OutputStream outputStream = socket.getOutputStream();//字節輸出流
            PrintWriter pw = new PrintWriter(outputStream); //將輸出流包裝爲打印流
            pw.write("用戶名:admin;密碼:123");
            pw.flush();
            socket.shutdownOutput();

            //獲取輸入流,讀取服務器端的響應
            InputStream inputStream = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
            String info = null;
            while((info = br.readLine())!=null){
                System.out.println("我是客戶端,服務器說:"+info);

            }
            socket.shutdownInput();

            //關閉資源
            br.close();
            inputStream.close();
            pw.close();
            outputStream.close();
            socket.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

運行結果:(!!!!要先運行Server端)




2.使用 UDP 連接的demo

要用到 DatagramPacket 和 DatagramSocket 
創建 UDPServer 和 UDPClient 類:

UDPSerer:
/**
 * 服務器端的實現
 */

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class UDPServer {
    public static void main(String[] args) {

        try  {
            //服務器端接收來自客戶端的數據
            //創建服務器端的DatagramSocket,指定端口
            DatagramSocket socket = new DatagramSocket(8800);
            //創建數據報,用於接收客戶端發送的信息
            byte[] data = new byte[1024];//創建字節數組,指定接收的數據包的大小
            DatagramPacket packet = new DatagramPacket(data,data.length);
            //接收客戶端發送的數據
            socket.receive(packet); //接收到數據包之前會一直阻塞,會把數據存入packet的data
            //讀取數據
            String info = new String(data,0,packet.getLength());  //讀取數據
            System.out.println("I am Server,Client say:"+info);


            //接收到數據後,服務器端響應給客戶端,基本與client的發送相同
            //定義客戶端的ip地址,端口號,數據
            InetAddress address = packet.getAddress();
            int port = packet.getPort(); //port難道不應該肯定是8800???
            byte[] data2 = "Welcome".getBytes();
            DatagramPacket packet1 = new DatagramPacket(data2,data2.length,address,port);
            socket.send(packet1);

            socket.close();//關閉資源

        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

UDPClient:
import java.io.IOException;
import java.net.*;

/**
 * 客戶端實現
 */
public class UDPClient {
    public static void main(String[] args) {

        try {

            //定義服務器的ip,端口號,數據
            InetAddress inetAddress = InetAddress.getByName("localhost");
            int port = 8800;
            byte[] data = "用戶名:admin;密碼:123".getBytes();
            //創建數據包,包含要發送的信息
            DatagramPacket packet = new DatagramPacket(data,data.length,inetAddress,port);
            //創建datagramsocket
            DatagramSocket socket = new DatagramSocket();
            //使用socket向服務器端發送數據包
            socket.send(packet);
            //socket.close();


            //接收服務器端的響應,基本與Server的接收相同
            byte[] dataR = new byte[1024]; //創建數據包用於接收服務器端的響應
            DatagramPacket packet1 = new DatagramPacket(dataR,dataR.length);
            socket.receive(packet1); //接收響應的數據
            String info = new String(dataR,0,packet1.getLength());  //讀取數據
            System.out.println("I am Client,Sever reply:"+info);

            socket.close();//關閉資源





        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


運行結果:(先Server!)






發佈了124 篇原創文章 · 獲贊 52 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章