1. 程式人生 > >JAVA SOCKET網路程式設計,服務端接收多個客戶端連線的實現

JAVA SOCKET網路程式設計,服務端接收多個客戶端連線的實現

這是基於前面一篇文章的一個簡單擴充套件,當然這不是最好的實現

服務端如果要想接收多個客戶端連線,必須死迴圈去接收新的客戶端的連線請求,一個完整的客戶端服務端socket連線通過一個執行緒來維護

package com.tree.demo.socket;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

class ThreadServerSocket implements Runnable {

	private Socket server;
	
	public ThreadServerSocket(Socket i) {
		// TODO Auto-generated constructor stub
		server = i;
	}
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			InputStream in = server.getInputStream();
			OutputStream out = server.getOutputStream();
			Scanner sc = new Scanner(in);
			PrintWriter pw = new PrintWriter(out,true/*autoFlush*/);
			pw.println("Hello ! Enter BYE to Exit.");
			while(sc.hasNextLine()) {
				String line = sc.nextLine();
				pw.println("Echo:"+line);
				if(line.trim().equals("BYE")) {
					break;
				}
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				server.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
	
}

public class MulServerSocketDemo {

	private static final int PORT = 1234;
	
	//private static final int BUFFER_SIZE = 1024;
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		int counter = 1;
		ServerSocket ss = new ServerSocket(PORT);
		while(true) {
			Socket s = ss.accept();
			System.out.println("第 "+(counter++)+" 個連線");
			Thread t = new Thread(new ThreadServerSocket(s));
			t.start();
		}
	}

}
啟動以上程式之後,通過命令列,telnet命令來試驗下




同時開了6個連線,當然也可以通過JAVA來是實現:

服務端:

package com.tree.demo.socket;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

class ThreadServerSocket implements Runnable {

	private Socket server;
	
	private int BUFFER_SIZE = 1024;
	
	public ThreadServerSocket(Socket i) {
		// TODO Auto-generated constructor stub
		server = i;
	}
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			InputStream in = server.getInputStream();
			OutputStream out = server.getOutputStream();
			byte[] recData = null;
			while(true) {
				recData = new byte[BUFFER_SIZE];
				int r = in.read(recData);
				//int r = in.read(recData);
				if(r>-1) {
					String data = new String(recData);
					if(data.trim().equals("over")) {
						server.close();
						break;
					}
					System.out.println("讀取到客戶端傳送的來資料:"+data);
					out.write("這是服務端發給客戶端的資料:".getBytes());
					out.write(recData);
				}else {
					System.out.println("資料讀取完畢!");
					server.close();
					break;
					//ss.close();
				}
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				server.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
	
}

public class MulServerSocketDemo {

	private static final int PORT = 1234;
	
	//private static final int BUFFER_SIZE = 1024;
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		int counter = 1;
		ServerSocket ss = new ServerSocket(PORT);
		while(true) {
			Socket s = ss.accept();
			System.out.println("第 "+(counter++)+" 個連線");
			Thread t = new Thread(new ThreadServerSocket(s));
			t.start();
		}
	}

}
客戶端:
package socket;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;

class ThreadClientSocket implements Runnable {

	private static final String HOST = "192.168.8.17";

	private static final int PORT = 1234;
	
	private Socket client;

	public ThreadClientSocket() {
		client = new Socket();
		try {
			client.connect(new InetSocketAddress(HOST, PORT), 500);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			OutputStream out = client.getOutputStream();
			int counter = 0;
			while (true) {
				System.out.println("Thread-->"+Thread.currentThread().getName());
				out.write("Heart Beat !".getBytes());
				System.out.println(client + "================" + (counter++));
				try {
					Thread.sleep(2000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

public class MulClientSocketDemo {


	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		int counter = 4;
		while((counter--)>0) {
			new Thread(new ThreadClientSocket()).start();;
		}
		// client.setTcpNoDelay(true);
	}

}




該實現仍然有很多不足,更好的實現可通過通道來實現,未完待續..........


相關推薦

JAVA SOCKET網路程式設計服務接收客戶連線實現

這是基於前面一篇文章的一個簡單擴充套件,當然這不是最好的實現 服務端如果要想接收多個客戶端連線,必須死迴圈去接收新的客戶端的連線請求,一個完整的客戶端服務端socket連線通過一個執行緒來維護 package com.tree.demo.socket; import

java網路程式設計:9、基於TCP的socket程式設計(二)伺服器迴圈監聽接收客戶_執行緒伺服器程式

宣告:本教程不收取任何費用,歡迎轉載,尊重作者勞動成果,不得用於商業用途,侵權必究!!! 文章目錄 一、核心程式碼編寫 1、伺服器端程式的編寫 2、客戶端程式的編寫 3、測試列印輸出 二、系列文章(java網路程式設計) 上篇講了基於tcp的程式設計的一些基礎知識

簡單的java socket TCP程式設計 每隔幾秒伺服器向客戶傳時間

客戶端 package javaSocket; import java.io.*; import java.net.*; import org.junit.Test; import jinghai.base.time.LocalDateTime; import jinghai.base.uti

網路程式設計服務處理客戶----執行緒實現、建立執行緒特有資料.

重點集中在用多執行緒實現,建立執行緒特有資料,不會發生資料寫入衝突。實現的功能很簡單,客戶端連線成功後,輸入一個整數,服務端返回它的二進位制形式。客戶端輸入0,則主動退出。三個檔案: duoxianc.c ,主檔案binarykey.c,執行緒執行函式及特有資料建立clien

java服務客戶的群聊功能程式碼實現

以下程式碼可以實現服務端傳送一條訊息,多個客戶端可以同時收到這條訊息,同時客戶端可以單獨的和服務端通訊 需要注意的是,此時服務端只需要一個傳送訊息的程序 服務端程式碼: /** * 實現多個客戶端對應一個服務端進行通訊 * * @author wa

QT中 實現一個服務接收客戶的解決方法

最近自己在折騰QT中實現TCP服務端的過程中,發現以往的例子都是點對點的,也就是說大都是一個客戶端,一個服務端,然後兩個進行通訊,而對於單個服務端與多個客戶端的通訊,非常稀少,找到一個但對於我們新手來說,有點複雜,不好理解,下面我介紹一個新手也能明白的一種解決方案。下面是ma

C++ Socket網路通訊實現一個伺服器客戶的通訊

一 描述1 採用C++語言 2 編譯環境是code::blocks 3 使用的是非阻塞套接字 二 功能描述1 一個伺服器對多個客戶端 2 伺服器端主要負責處理資料的輸入併發送,具體是通過傳送指令向其指定的客戶端傳送資料,傳送接收指令讀取其指定的客戶端傳送的資料 3 客戶端的

Windows Socket 程式設計_單個伺服器對客戶簡單通訊

單個伺服器對多個客戶端程式: 一。簡要說明 二。檢視效果 三。編寫思路 四。程式原始碼 五。存在問題 一。簡要說明:  程式名為:TcpSocketOneServerToMulClient  程式功能:實現單個伺服器對多個客戶端通訊功能的小程式。 PS: 這是繼上次簡單的

python3.6入門到高階(全棧) day29 socketserver實現服務客戶通訊

 什麼是socketserver?      TCP協議下的socket實現了服務端一次只能和一個客戶端進行通訊, 而socketserver實現了服務端一次能和多個客戶端進行通訊, 底層呼叫的還是socket. import socketserver class MyServer(so

Unity伺服器客戶02---接收客戶和迴圈接收訊息

伺服器開啟後肯定是等待多個客戶端連線,這裡使用一個死迴圈讓伺服器一直處於等待別客戶端連線的狀態,然後每連線一個客戶端就開啟一個執行緒接收客戶端發來的訊息然後廣播給每個客戶端。 首先是服務端程式碼: using System; using System.Collection

2.SDL2_net TCP伺服器客戶

上一節初步瞭解到了伺服器和客戶端的通訊,並且由於受到程式碼的限制,只能是單個客戶端,而且伺服器無法向客戶端傳送資訊,本節使用SDL_Net的套接字列表(Socket Set)特性來實現比上一節功能更強的程式碼,即一個伺服器對應多臺客戶端。 一.專案結構CMakeLists.txt的編寫 上一

對於socket網路程式設計搗鼓了一週終於實現了電腦為服務學習板為客戶之間的通訊

最開始是網上找到相關的客戶端,和服務端 的程式,然後試著去理解,但是這個過程很難過,因為從來沒有接觸過的,但是沒辦法,只能硬著頭皮啃,問老師,問學長,網上看視訊。終於是吧他啃下來了。 服務端的程式碼: #include <unistd.h> #include

java socket網路程式設計例項程式碼(含服務客戶

本程式碼為java socket網路程式設計例項程式碼,包括客戶端和服務端,實現客戶端傳送訊息,服務端接收並反饋訊息。 server.java為服務端程式碼。 client.java為客戶端程式碼。 服務端程式碼server.java: package socket;

java網路程式設計(二)複用Socket連線以及使用執行緒完成客戶連線

在前面的示例中,客戶端中建立了一次連線,只發送一次資料就關閉了,這就相當於撥打電話時,電話打通了只對話一次就關閉了,其實更加常用的應該是撥通一次電話以後多次對話,這就是複用客戶端連線。 那 麼如何實現建立一次連線,進行多次資料交換呢?其實很簡單,建立連線以後,

Java系列-Socket網路程式設計TCP/IP和Http等網路協議理解

一、網路各個協議:TCP/IP、SOCKET、HTTP等 網路七層由下往上分別為物理層、資料鏈路層、網路層、傳輸層、會話層、表示層和應用層。 其中物理層、資料鏈路層和網路層通常被稱作媒體層,是網路工程師所研究的物件; 傳輸層、會話層、表示層和應用層則被稱作主機層,是使用者

Linux下網路socket程式設計——實現伺服器(select)與客戶通訊

Linux下網路socket程式設計——實現伺服器(select)與多個客戶端通訊 置頂 2017年06月23日 14:44:37 閱讀數:3225 標籤: socket程式設計伺服器與多個客戶端通epoll多路複用C語言網路程式設計 更多

利用Python進行socket網路程式設計實現樹莓派與Ubuntu(16.04)之間的簡單的網路聊天

標題 目標: 採用socket程式設計,完成兩個樹莓派之間、或者樹莓派與Ubuntu系統之間的網路文字通訊(或聊天) 分析: 首先我們需要了解socket程式設計的原理以及它是怎麼實現的。 Socket的英文原義是“孔”或“插座”。作為BSD UNIX的程序通訊機制,取後一種意思。

Java Socket網路程式設計

Java Socket網路程式設計 計算機網路中,客戶機與伺服器之間進行通訊時,客戶機必須知道伺服器的IP地址和埠號。IP地址是標識Internet網路中的某臺計算機,而埠號則標識著在伺服器上執行的某個程式(程序),如果在伺服器上執行的程式,沒有埠號,則客戶端的程式就不能找到它,也不能和它

socket ( java ) 簡單客戶服務通訊(執行緒)

實現: 客戶端:多個socket(多個埠),其中一個客戶端的一個埠用於接收服務端傳送過來的訊息,其一個用於向服務端傳送訊息。其它客戶端只有發訊息的功能。 服務端:兩個socket,一個用於迴圈接收客戶端傳送過來的socket請求。一個用於接收訊息手自動向客戶端

Java Socket實現客戶連線同一個服務

使用Socket實現多個客戶端和同一客戶端通訊;首先客戶端連線服務端傳送一條訊息,服務端接收到訊息後進行處理,完成後再回復客戶端一條訊息。本人通過自己的思維編寫了一份服務端和客戶端實現的程式碼,望能與大家相互學習,共同進步。   服務端程式碼 /** * Socket服務