1. 程式人生 > >Java實現簡單的Socket伺服器與客戶端字串通訊(適合初學者閱讀)

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

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

伺服器端程式碼:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * Socket通訊伺服器端
 * @author 米強<如轉載請保留作者和出處>
 * @blog

http://hi.baidu.com/mq612/blog
 * @blog http://blog.csdn.net/mq612
 */
public class ServerMain {
    public ServerMain() {
        try {
            // 構造伺服器ServerSocket物件,引數為伺服器端開放的埠號
            ServerSocket ss = new ServerSocket(30102);
            System.out.println("伺服器準備就緒!");
            // 死迴圈可以使伺服器持續處於接收客戶端狀態
            while(true){
                // 該方法使程式阻塞,等待客戶端的連結,當監聽到客戶端的連結,建立一個Socket物件與客戶端單獨會話
                Socket s = ss.accept();
                // 為了不影響伺服器監聽其它客戶端,這裡開啟了一個執行緒,由執行緒處理與這個客戶端的會話
                new ServerThread(s).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        new ServerMain();
    }
}

/**
 * 伺服器端與客戶端會話的執行緒
 */
class ServerThread extends Thread {
    private Socket s = null;
    private BufferedReader read = null;
    private PrintStream print = null;
    public ServerThread(Socket s) {
        this.s = s;
        try {
            // 從Socket中獲取輸入流和輸出流,由於我們只做一個簡單的字串通訊,所以採用BufferedRead和PrintStream來封裝輸入、輸出流
            read = new BufferedReader(new InputStreamReader(s.getInputStream()));
            print = new PrintStream(s.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 執行緒的執行run方法
     */
    public void run() {
        try {
            String message = null;
            // 這裡迴圈可以使伺服器持續的接收客戶端資訊。read.readLine()通過輸入流讀取一段字串,賦值給message變數,如果message字串不為“exit”則迴圈,否則結束迴圈
            while (!(message = read.readLine()).equals("exit")){
                // 將字串前面新增“返回:”,再發回客戶端
                print.println("返回:" + message);
            }
        } catch (IOException e) {
        } finally {
            // 在 finally 程式碼塊中無論如何都會執行下面程式碼:
            try {
                // 如果沒有關閉Socket
                if(!s.isClosed()){
                    // 關閉Socket連結
                    s.close();
                }
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }
}

客戶端程式碼:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
/**
 * Socket通訊客戶端
 * @author 米強<如轉載請保留作者和出處>
 * @blog http://hi.baidu.com/mq612/blog
 * @blog http://blog.csdn.net/mq612
 */
public class ClientMain {
    public ClientMain() {
        try {
            // 構造與伺服器通訊的Socket物件,引數為伺服器IP地址(String)和埠號(int),埠號需要和伺服器端開放的埠號對應
            Socket s = new Socket("192.168.1.100", 30102);
            // 啟動一個執行緒與伺服器通訊,並把連結伺服器的Socket物件傳遞過去
            new LinkThread(s).start();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
   
   
    public static void main(String[] args) {
        new ClientMain();
    }
   
}
/**
 * 與伺服器通訊的執行緒
 */
class LinkThread extends Thread {
    private Socket s = null;
    // 輸出流
    private PrintStream out = null;
    // 緩衝輸入流
    private BufferedReader in = null;
    // 錄入文字的Scanner物件
    private Scanner scanner = null;
   
    public LinkThread(Socket s) {
        // 將Socket物件例項儲存在全域性變數中,因為run方法中我們還要用它斷開連結
        this.s = s;
        try {
            // 從Socket中獲取輸入流和輸出流,由於我們只做一個簡單的字串通訊,所以採用BufferedRead和PrintStream來封裝輸入、輸出流
            out = new PrintStream(s.getOutputStream());
            in = new BufferedReader(new InputStreamReader(s.getInputStream()));
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
   
    /**
     * 執行緒的執行run方法
     */
    public void run() {
        // 構造Scanner物件
        scanner = new Scanner(System.in);
        System.out.println("提示:如果要結束本次會話,請輸入“exit”指令!");
        try {
            // 死迴圈可以使客戶端不斷的向伺服器傳送資訊,不用擔心迴圈無法結束,後面的return語句可以結束整個執行緒。
            while(true){
                // 提示使用者輸入文字
                System.out.print("請輸入:");
                // 將使用者輸入的字串儲存在message變數中
                String message = scanner.nextLine();
                // 通過輸出流傳送字串
                out.println(message);
                // 清空緩衝,強制輸出
                out.flush();
                // 獲取伺服器返回的字串
                String str = in.readLine();
                // 如果返回的字串存在
                if(str != null){
                    // 顯示在控制檯
                    System.out.println(str);
                }else{
                    // 提示會話結束,並結束執行緒
                    System.out.println("本次會話結束!");
                    return;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 在 finally 程式碼塊中無論如何都會執行下面程式碼:
            try {
                // 如果沒有關閉Socket
                if(!s.isClosed()){
                    // 關閉Socket連結
                    s.close();
                }
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }
   
}

相關推薦

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

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

AndroidJava NIO實現簡單Echo伺服器客戶

上一篇用Java IO來做了個Demo,於是乎進一步,用Java NIO來做一個。NIO的優勢在於非阻塞。使用了Selector在一個執行緒裡進行輪詢,就能夠完成接入、收\發訊息的操作,不需要每建立一個連線都新啟動一個執行緒的方式。Server端程式碼:public clas

Linux下簡單的網路程式設計筆記模擬簡單伺服器客戶通訊 1-伺服器

一.伺服器端     (一).建立連線的條件:伺服器必須處於監聽狀態,由客戶端發起連線請求     bind之前可新增以下程式碼解決關閉伺服器後端口仍被佔用的問題 // 設定套接字選項避免地址使用錯誤       int on=1;       if((setsoc

Java中利用socket實現簡單的服務客戶通訊入門級

Java程式設計中,要想要使用網路通訊,就離不開Socket程式設計,在此對socket進行簡單的介紹。首先宣告,這是一個入門級的介紹,僅僅簡單的實現了客戶端向服務端傳送資料,服務端正常的接收資料,當接收到特定的資料時,服務端和客戶端都關閉,一個服務端對應一個客戶端,不涉及

Java中利用socket實現簡單的服務客戶通訊基礎級

在上一篇文章中,簡單的介紹了java中入門級的socket程式設計,簡單的實現了客戶端像伺服器端傳送資料,伺服器端將資料接收並顯示在控制檯,沒有涉及多執行緒。上一篇文章的連結:Java中利用socket實現簡單的服務端與客戶端的通訊(入門級) 這次,我們將上一節中的程式碼進

Vue+Java servlet 通過websocket實現伺服器客戶雙向通訊

1. vue程式碼 methods: { //在方法裡呼叫 this.websocketsend()傳送資料給伺服器 onConfirm () { //需要傳輸的資料 let data = { cod

一個簡單伺服器客戶程式

最近在學習《深入理解計算機系統》,看到linux系統級的IO以及,socket通訊,所以乾脆參考書上例程,自己著手寫一個客戶端與伺服器的小程式。 並未使用csapp封裝好的open_clientfd與open_listenfd還有RIO包 主要功能就兩個: 1.伺服器讀客戶

Java伺服器客戶通訊中物件流的使用

在使用java物件流的時候,首先要保證通訊雙方各有一個公用的包,裡面的內容相同,注意異常的丟擲。 相同的包 package common; public class User implements

java實現簡單快速的webservice客戶/資料採集器支援soap1.1和soap1.2標準,支援utf-8編碼

前言: 用了cxf,axis等各種wbeservice實現庫,簡單試用了一下動態呼叫的方式,很不滿意,完全無法滿足業務的需要,所以自己實現了一個webservice採集客戶端,方便動態呼叫外部webservice介面。 一、實現的功能 1、soap1.1客戶端(soap1.

C#Socket伺服器客戶的開發(3)

之前我們藉助一個SuperSocket實現了一個簡易版的伺服器, 但是不管是Server還是Session都是使用框架的,本篇部落格我們要實現自己的Server和Session,來重寫框架原生的Server或Session的方法,或新增自己所需的屬性,來實現自己的業務邏輯,並且也不在使用事件來繫結接收,連線,

C#伺服器客戶通訊伺服器

Tcp協議+socket 1.伺服器端開始監聽 //通過winform視窗輸入的伺服器ip地址和埠號  myip = IPAddress.Parse(textBox1.Text);  myport = Int32.Parse(textBox2.Text);

挖掘機DMS伺服器客戶讀寫檔案,收發資料

Client package com.company; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IO

基於 HTML5 WebGL 的 3D 伺服器客戶通訊

這個例子的初衷是模擬伺服器與客戶端的通訊,我把整個需求簡化變成了今天的這個例子。3D 機房方面的模擬一般都是需要鷹眼來輔助的,這樣找產品以及整個空間的概括會比較明確,在這個例子中我也加了,這篇文章就算是我對這次專案的一個總結吧。對了,這個例子我是參考一個 DEMO 來完成的,和示例中的顯示有些不同,大家莫驚奇

【隨堂筆記】unity開發中Socket的用法一,實現伺服器客戶簡單的連結

實現了簡單的連結,也增加了客戶端沒有連結到伺服器的自動重連 伺服器程式碼 using System; using System.Net; using System.Net.Sockets; namespace SeverSocket { class Program

C#.網路程式設計 Socket基礎Socket TCP協議 實現伺服器客戶簡單字串通訊

簡介:        本章節主要討論了Socket的入門知識,還未針對Socket的難點問題(比如TCP的無訊息邊界問題)展開討論,往後在其他章節中進行研究。 注意點: 伺服器(比如臺式電腦)的IP為1.1.1.2,那麼客戶端(其他裝置,比如手機,Ipad)連線的一定是

socket程式設計實現伺服器客戶簡單通訊

本節主講客戶端向服務傳送資訊,伺服器轉發給客戶端,當然也可以稍微改一下程式碼可以實現互傳訊息,不再贅述。 難點在於伺服器端的程式碼思路: (1)主程式Socket socket=server.acc

【隨堂筆記】unity中socket的用法二、伺服器客戶之間簡單的資料傳遞

主要實現伺服器與客戶端之間簡單的資料傳輸(單次) 伺服器程式碼 using System; using System.Net; using System.Net.Sockets; namespace SeverSocket { class Program {

C#.網路程式設計 Socket基礎 基於WinForm系統Socket TCP協議 實現伺服器客戶.txt.word.png等不同型別檔案傳輸

一、簡介: 前面的兩篇介紹了字串傳輸、圖片傳輸: 其實,本文針對Socket基礎(二)進一步完成,以便可以進行多種檔案傳輸。 二、基於不同的流(檔案流、記憶體流、網路等)讀寫。 1、圖片傳輸 方法一:(在客戶端用檔案流傳送(即將圖片寫到檔案流去,以便傳送),

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

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

JAVA整合WebSocket,實現伺服器客戶握手

                                      WebSocket實現伺服器與客戶端握手 自學的WebSocket途中遇到很多坑,希望需要使用的朋友可以少走彎路, 使用的環境:tomcat7.0,mysql,springMvc,spring,M