一個 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
相關推薦
一個 Java 的 Socket 伺服器和客戶端通訊的例子
一個 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
ServerSocket和Socket建立通訊(伺服器和客戶端迴圈接收發送)
需求:伺服器不斷的接收返回資訊到客戶端中,客戶端可以不斷地額給伺服器傳送訊息,並可以接收到伺服器返回的訊息。這跟我們聊天一樣。 思路: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:基於檔案和麵向網路的。