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
* @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
Android與Java 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