1. 程式人生 > >一個 Java 的 Socket 伺服器和客戶端通訊的例子

一個 Java 的 Socket 伺服器和客戶端通訊的例子

        一個 HelloWord 級別的 Java Socket 通訊的例子。通訊過程:
        先啟動 Server 端,進入一個死迴圈以便一直監聽某埠是否有連線請求。然後執行 Client 端,客戶端發出連線請求,服務端監聽到這次請求後向客戶端發回接受訊息,連線建立,啟動一個執行緒去處理這次請求,然後繼續死迴圈監聽其他請求。客戶端輸入字串後按回車鍵,向伺服器傳送資料。伺服器讀取資料後回覆客戶端資料。這次請求處理完畢,啟動的執行緒消亡。如果客戶端接收到 "OK" 之外的返回資料,會再次傳送連線請求併發送資料,伺服器會為這次連線再次啟動一個執行緒來進行響應。。。直到當客戶端接收到的返回資料為 "OK" 時,客戶端退出。

        服務端原始碼:

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

        注意: Socket 輸出流寫資料方法是 writeUTF 時,輸入流讀取相關資料要用 readUTF。否則會拋 EOFException 異常。具體原因請參考文後連結。
        參考資料
http://stackoverflow.com/questions/5489915/java-datainputstream-read-operations-throwing-exceptions

相關推薦

一個 JavaSocket 伺服器客戶通訊例子

        一個 HelloWord 級別的 Java Socket 通訊的例子。通訊過程:         先啟動 Server 端,進入一個死迴圈以便一直監聽某埠是否有連線請求。然後執行 Client 端,客戶端發出連線請求,服務端監聽到這次請求後向客戶端發回接受訊

linux下用多執行緒實現socket伺服器客戶的非同步通訊

前面介紹了用select函式來實現socket的非同步收發資料,但是select函式也有一些缺陷,要使socket能持續地通訊,select必須不停地檢測,這樣程序就會一直阻塞在這裡,限制了功能的擴充套件,這裡我們用多執行緒的方式,另建立兩個執行緒用來發送/接收

Java實現伺服器客戶簡單通訊

Java中網路程式設計這一塊有封裝的類庫,使用簡單,瞭解原理可以教容易實現伺服器和客戶端的簡單通訊。 在程式設計之前,首先要需要對TCP/IP協議有一定的瞭解,需要知道Socket套接字的作用以及用法,這個可以在API文件中去檢視。兩通訊實體之間通訊需要掌握資

Java thrift伺服器客戶建立例項

首先環境介紹一下: 1.IntelliJ IDEA 2017.1 2.thrift-0.9.3 相信大家在看我這篇文章的時候已經對thrift通訊框架已有所調研,這裡就不再贅述了,直接進入正題: <1>建立HelloWorld.thrift namespace jav

java實現伺服器客戶之間的檔案傳輸

實現思路 一、客戶端發文件:首先建立和伺服器的連線,然後我們通過IO流來實現資料的傳輸,步驟: 1、通過伺服器的IP地址和埠號實現和伺服器的連線(這裡不要忘記先開伺服器哦) 2、獲取本地的檔案的地址,建立java和檔案的連線。 3、獲取檔案輸入流和資料輸出流(注意:這裡的輸入和輸出都是指

簡單的TCP 流式socket 伺服器客戶程式碼示例

電子書在這裡,見6.8.1 和6.8.2 章節,書中的程式碼有很多錯誤,包括#include、socket 描述符賦值等,正確的程式碼在這裡 Server 程式碼: #include <stdio.h> #include <stdlib.h> #in

Python實現udp協議的簡單伺服器客戶通訊

簡單socket程式在兩臺電腦之間傳輸訊息,分為客戶端和服務端,分別在兩臺電腦上執行後即可進行簡單的訊息傳輸,也可以在一臺電腦上測試,設定兩個不同的埠即可 以下是程式碼在一臺電腦上執行,開兩個終端即可

epoll ET模式伺服器客戶原始碼例子

關於epoll替代select作為高效能伺服器的事件通知機制的資料相當多,我就不在這裡班門弄斧了,有興趣的同學可以參考末尾的文獻連結。 這裡說明如下: 1.epoll是linux下高併發伺服器的完美方案,因為是基於事件觸發的,所以比select快的不只是一個數量級。 2.單

java-基本的Socket程式設計-實現伺服器客戶通訊

基本的Socket程式設計: 本例項介紹Socket程式設計的基本步驟。啟動Socket服務後,再開啟Socket刻畫段,在輸入框中輸入訊息,然後傳送給伺服器端,伺服器端將收到的訊息返回到客戶端。 關鍵技術: Socket程式設計的關鍵技術如下; —–S

Socket通訊實現伺服器客戶對話

廣域網和區域網 介紹socket通訊前我們先介紹一下廣域網與區域網的概念。區域網簡稱LAN,是指在某一區域幾臺計算機組成的計算機組,區域網是封閉的,區域網經常採用共享通道,即共用同一條電纜。廣域網簡稱WAN,是一種跨越大的,地域性的地區性網路集合廣域網包含大大小

最簡單的socket通訊伺服器客戶

底部附上了效果圖 伺服器程式碼: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java

Java Socket多個客戶伺服器通訊

client程式碼: package com.cqut.test4; import java.io.*; import java.net.Socket; import java.net.SocketException; import java.net.U

Java實現簡單的Socket伺服器客戶字串通訊(適合初學者閱讀)

       近段時間,頻繁看到很多學生做畢業設計用到了Socket通訊技術,問題非常多,特寫一個小例子,希望對馬上畢業的同學有所幫助。如果希望學習的更加深入,需要掌握的知識有:面向物件、多執行緒、Socket通訊、IO流、異常處理 伺服器端程式碼: import java

ServerSocketSocket建立通訊(伺服器客戶迴圈接收發送)

需求:伺服器不斷的接收返回資訊到客戶端中,客戶端可以不斷地額給伺服器傳送訊息,並可以接收到伺服器返回的訊息。這跟我們聊天一樣。 思路:1、伺服器端:1)建立ServerSocket和開啟監聽客戶端連線                                     

socket程式設計回射伺服器客戶

//回射伺服器 #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet

實現socket的服務客戶通訊

對學習過程中自己敲的一些關於socket有關的程式碼做了個簡單總結,在這分享一下,給有需要的同學借鑑一下。 什麼是socket? 網路上的兩個程式通過一個雙向的通訊連線實現資料的交換,這個連線的一端稱為一個socket。 建立網路通訊連線至少要一對埠號(socket)。socke

一個Netty程式——構建執行Echo伺服器客戶

在構建之前,需要安裝開發環境:JDK和Apache Maven以及IDE。 pom檔案: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-ins

C#實現伺服器客戶之間通訊

TCP  套接字程式設計 伺服器端實現步驟: 1、使用Socket類建立套接字。 2、利用Bind方法將建立的套接字繫結到指定的地址結構。 3、利用Listen方法設定套接字為監聽模式,使得伺服器進入被動開啟狀態。 4、接受客戶端的連線請求。 5、接收、應答客戶端的資料請求

Java網路 伺服器客戶的簡單通訊

不登高山,不知天之高也。不臨深淵,不知地之厚也。  Java中的封裝類(Socket),在實現這個功能的時候,需要對Java中的Socket套接字的一些用法熟悉,伺服器與客戶端之間主要通過的Java中的IO流通訊。需要理解IO流的流出,流入問題。  接下來,

python實現tcp伺服器客戶(socket)

python實現tcp伺服器和客戶端(socket) 1.socket模組 socket是什麼 socket最初是為了同一主機上的應用程式建立的,使得一個程式與另外一個程式之間可以通訊,也就是所謂的程序間通訊,有兩種型別的socket:基於檔案和麵向網路的。