1. 程式人生 > >java Socket通訊,客戶端與服務端相互發訊息

java Socket通訊,客戶端與服務端相互發訊息

1.通訊過程

網路分為應用層,http、ssh、telnet就是屬於這一類,建立在傳輸層的基礎上、其實就是定義了各自的編碼解碼格式,分層如下:
這裡寫圖片描述

2.Socket連線

上述通訊都要先在傳輸層有建立連線的基礎上才能完成,TCP通過三次握手建立連線:
這裡寫圖片描述
Socket與http的區別可以看下這個:
https://www.cnblogs.com/meier1205/p/5971313.html
還有搜尋:http下午茶

3.JAVA socket 客戶端與服務端互發訊息

實現結構圖:
這裡寫圖片描述
客戶端和服務端分別通過倆個執行緒來完成傳送訊息和接受訊息,此前需要等待客戶端與伺服器端建立連線,這個java程式都幫你寫好了,接收後就可以發訊息了:

3.1 服務端程式碼


import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;


public  class  Server_Test extends Thread{
    ServerSocket server = null;
    Socket socket = null;
    public Server_Test(int
port) { try { server = new ServerSocket(port); } catch (IOException e) { e.printStackTrace(); } } @Override public void run(){ super.run(); try{ System.out.println("wait client connect..."); socket = server
.accept(); new sendMessThread().start();//連線並返回socket後,再啟用傳送訊息執行緒 System.out.println(socket.getInetAddress().getHostAddress()+"SUCCESS TO CONNECT..."); InputStream in = socket.getInputStream(); int len = 0; byte[] buf = new byte[1024]; while ((len=in.read(buf))!=-1){ System.out.println("client saying: "+new String(buf,0,len)); } }catch (IOException e){ e.printStackTrace(); } } class sendMessThread extends Thread{ @Override public void run(){ super.run(); Scanner scanner=null; OutputStream out = null; try{ if(socket != null){ scanner = new Scanner(System.in); out = socket.getOutputStream(); String in = ""; do { in = scanner.next(); out.write(("server saying: "+in).getBytes()); out.flush();//清空快取區的內容 }while (!in.equals("q")); scanner.close(); try{ out.close(); }catch (IOException e){ e.printStackTrace(); } } }catch (IOException e) { e.printStackTrace(); } } } //函式入口 public static void main(String[] args) { Server_Test server = new Server_Test(1234); server.start(); } }

3.2 客戶端程式碼


import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client extends Thread {

    //定義一個Socket物件
    Socket socket = null;

    public Client(String host, int port) {
        try {
            //需要伺服器的IP地址和埠號,才能獲得正確的Socket物件
            socket = new Socket(host, port);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void run() {
        //客戶端一連線就可以寫資料個伺服器了
        new sendMessThread().start();
        super.run();
        try {
            // 讀Sock裡面的資料
            InputStream s = socket.getInputStream();
            byte[] buf = new byte[1024];
            int len = 0;
            while ((len = s.read(buf)) != -1) {
                System.out.println(new String(buf, 0, len));
            }

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

    //往Socket裡面寫資料,需要新開一個執行緒
    class sendMessThread extends Thread{
        @Override
        public void run() {
            super.run();
            //寫操作
            Scanner scanner=null;
            OutputStream os= null;
            try {
                scanner=new Scanner(System.in);
                os= socket.getOutputStream();
                String in="";
                do {
                    in=scanner.next();
                    os.write((""+in).getBytes());
                    os.flush();
                } while (!in.equals("bye"));
            } catch (IOException e) {
                e.printStackTrace();
            }
            scanner.close();
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    //函式入口
    public static void main(String[] args) {
        //需要伺服器的正確的IP地址和埠號
        Client clientTest=new Client("127.0.0.1", 1234);
        clientTest.start();
    }
}

輸出:
伺服器端:

wait client connect...
127.0.0.1SUCCESS TO CONNECT...
client saying: hi
i am server #服務端說得話
hi,client #服務端說得話
client saying: hi,server

客戶端:

hi #客戶端說得話
server saying: i
server saying: amserver saying: server
server saying: hi,client
hi,server #客戶端說得話