java socket編程

socket編程是在tcp/IP上的網絡編程java

socket編程要建立服務端,客戶端 ,編程

服務端建立流程服務器

1 建立serverSocket 綁定ip端口網絡

2 在建立的端口上執行阻塞方法等待客戶端鏈接socket

3 客戶端鏈接上後建立線程處理邏輯tcp

                         服務端建立流程this

客戶端建立流程.net

1 建立客戶端socket 向服務端發送請求線程

2 等待服務端請求處理 相應數據code

                          客戶端建立流程

 

服務端代碼

package com.dlh.socket;
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();    
        System.out.println(Thread.currentThread().getName());
    }    
    
    public void init() {    
        try {    
            ServerSocket serverSocket = new ServerSocket(PORT);    
            while (true) {    
                System.out.println("等待客戶端鏈接");
                Socket client = serverSocket.accept(); 
                System.out.println("客戶端有請求進來了");
                // 處理此次鏈接    
                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 {    
                // 讀取客戶端數據    
            	System.out.println(Thread.currentThread().getName());
                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.dlh.socket;

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());   
                    }  
                }  
            }  
        }    
    }    
}

先啓動服務端

服務端啓動後 代碼運行到第24行就阻塞在這不往下執行了,只有客戶端有鏈接進來才繼續往下走

 

接下來啓動客戶端

相關文章
相關標籤/搜索