socket 存在多個客戶端時,一對一連線
1、連線的客戶端實體類
package com.example.demo.socket3; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class User { private String name; private String account; private Socket socket; private BufferedReader br; private PrintWriter pw; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public Socket getSocket() { return socket; } public void setSocket(final Socket socket) { this.socket = socket; } public BufferedReader getBr() { return br; } public void setBr(BufferedReader br) { this.br = br; } public PrintWriter getPw() { return pw; } public void setPw(PrintWriter pw) { this.pw = pw; } public User(String name, final Socket socket) throws IOException { this.name = name; this.socket = socket; this.br = new BufferedReader(new InputStreamReader( socket.getInputStream())); this.pw = new PrintWriter(socket.getOutputStream()); } @Override public String toString() { return "User [name=" + name + ", account=" + account + ", socket=" + socket + "]"; } }
2、服務端
package com.example.demo.socket3; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; /** * 服務端 * Created by Administrator on 2018/4/11. */ public class Server { private static final Logger logger = LoggerFactory.getLogger(Server.class); public static void main(String[] args) throws Exception { // 例項化一個list,用於儲存所有的User List<User> list = new ArrayList<User>(); // 建立繫結到特定埠的伺服器套接字 ServerSocket serverSocket = new ServerSocket(9999); // 迴圈監聽客戶端連線 while (true) { logger.info("服務端啟動,開始監聽客戶端連線...."); Socket socket = serverSocket.accept(); // 每接受一個執行緒,就隨機生成一個一個新使用者 User user = new User("user" + Math.round(Math.random() * 100),socket); logger.info(user.getName() + "登入..."); list.add(user); // 建立一個新的執行緒,接收資訊並轉發 ServerThread thread = new ServerThread(user, list); thread.start(); } } }
3、服務端監聽客戶端的方法
package com.example.demo.socket3; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.PrintWriter; import java.util.List; /** 伺服器執行緒的作用主要是: * 1.接收來自客戶端的資訊 * 2.將接收到的資訊解析,並轉發給目標客戶端 */ public class ServerThread extends Thread { private static final Logger logger = LoggerFactory.getLogger(ServerThread.class); private User user; private List<User> list; public ServerThread(User user, List<User> list) { this.user = user; this.list = list; } public void run() { try { while (true) { // 資訊的格式:(login||logout||say),傳送人,收發人,資訊體 //不斷地讀取客戶端發過來的資訊 String msg= user.getBr().readLine(); logger.info("讀取到的資料"+msg); String[] str = msg.split(","); switch (str[0]) { case "logout": remove(user);// 移除使用者 break; case "say": sendToClient(str[1], msg); // 轉發資訊給特定的使用者 break; default: break; } } } catch (Exception e) { System.err.println("出現異常:使用者斷開,但沒有從列表中移除"); } finally { try { user.getBr().close(); user.getSocket().close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 傳送給指定使用者 * @param username * @param msg */ private void sendToClient(String username, String msg) { // 遍歷所有連線使用者,判斷是否存在,存在就把資訊傳送過去 for (User user : list) { if (user.getName().equals(username)) { try { PrintWriter pw =user.getPw(); pw.println(msg); pw.flush(); } catch (Exception e) { e.printStackTrace(); } } } } private void remove(User user2) { list.remove(user2); } }
4、客戶端
package com.example.demo.socket3;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
/** client執行緒主要是負責:
* 1.傳送資訊
* 2.一直接收資訊,並解析
*/
public class Client {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost", 9999);
//開啟一個執行緒接收資訊,並解析
ClientThread thread=new ClientThread(socket);
thread.start();
//主執行緒用來發送資訊
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
PrintWriter out=new PrintWriter(socket.getOutputStream());
while(true)
{
String s=br.readLine();
out.println(s);
// out.write(s+"\n");
out.flush();
}
}catch(Exception e){
System.out.println("伺服器異常");
}
}
}
5、客戶端監聽服務端資訊的方法
package com.example.demo.socket3;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
/**
* 作用:一直接收服務端轉發過來的資訊
*/
public class ClientThread extends Thread {
private Socket socket;
public ClientThread(Socket socket) {
this.socket = socket;
}
public void run() {
try {
InputStream inputStream = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(
inputStream);
BufferedReader br = new BufferedReader(inputStreamReader);
try {
// 資訊的格式:(login||logout||say),傳送人,收發人,資訊體
while (true) {
String msg = br.readLine();
System.out.println(msg);
String[] str = msg.split(",");
switch (str[0]) {
case "say":
System.out.println(str[2] + " 對 " + str[1] + " say: "
+ str[3]);
break;
default:
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
轉載自 https://blog.csdn.net/dreameer_dd/article/details/52626089
相關推薦
socket 存在多個客戶端時,一對一連線
1、連線的客戶端實體類package com.example.demo.socket3; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;
SOCKET讀取多個客戶端下面多個基站下面多個手環傳送的資料(驗收專案版本)
之前,本人,發了一大堆關於socket 多執行緒 客戶端 的一大堆博文,有理論的也有實現版本的,有缺陷有成功的! 但是,今天我要說的是,之前的關於socket博文的,都有誤區,而且達不上真正驗收專案的標準!! 今天是2018/10/7 17:09:00,我真正實現了這個功
Java Socket實現多個客戶端連線同一個服務端
使用Socket實現多個客戶端和同一客戶端通訊;首先客戶端連線服務端傳送一條訊息,服務端接收到訊息後進行處理,完成後再回復客戶端一條訊息。本人通過自己的思維編寫了一份服務端和客戶端實現的程式碼,望能與大家相互學習,共同進步。 服務端程式碼 /** * Socket服務
socket實現多個客戶端連線在一個伺服器上
1、使用socekt通訊一般步驟 1)伺服器端:socker()建立套接字,繫結(bind)並監聽(listen),用accept()等待客戶端連線。 2)客戶端:socker()建立套接字,連線(connect)伺服器,連線上後使用send()和recv(
linux下socket實現多個客戶端與伺服器的通訊
學習完《UNIX環境高階程式設計》套接字一章的內容之後,自己實現了單個客戶端與伺服器的通訊程式,後面想想要是多個客戶端如何與伺服器通訊呢?這就有了這篇文章。 伺服器端程式: #include<stdio.h> #include <stdlib.h&g
TCP實現多個客戶端同時向同一個伺服器端傳送圖片,也可以同一個客戶端多次向伺服器傳送圖片。當上傳圖片大於一定的限度(這裡指定為了10k)時,則停止上傳,將已經接收到但未接收完的檔案刪除。
伺服器端: //多使用者上傳圖片 import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class UploadPicServer1 { public sta
Socket通訊 一個伺服器對多個客戶端,不能延遲接受資訊的實現
實驗要求: 1.一個時間點,無論哪個基站有資料傳送,伺服器必須同時接收。不能延遲等待這個客戶端接收完畢再接收另一個客戶端; 2.客戶端不能關閉,一直連線,以防資料遺漏 知識點: 多執行緒 同時開啟多個任務,不用按照程式的執行順序來; 基本的程式碼如下: pack
JAVA SOCKET網路程式設計,服務端接收多個客戶端連線的實現
這是基於前面一篇文章的一個簡單擴充套件,當然這不是最好的實現 服務端如果要想接收多個客戶端連線,必須死迴圈去接收新的客戶端的連線請求,一個完整的客戶端服務端socket連線通過一個執行緒來維護 package com.tree.demo.socket; import
java在線聊天項目1.2版 ——開啟多個客戶端,分別實現數據庫註冊和登錄功能後,成功登陸則登錄框消失,好友列表窗出現
false als blog string def iat ets cat med 登錄框消失語句 dispose(); 好友列表窗出現 使用new FriendsFrame(phone,s); 登陸對話框代碼修改如下: package com.swift.frame;
C#一個伺服器端多個客戶端Socket通訊
原理: 啟動服務端後,服務端通過持續監聽客戶端發來的請求,一旦監聽到客戶端傳來的資訊後,兩端便可以互發資訊了。伺服器端需要繫結一個IP和埠號,用於客戶端在網路中尋找並建立連線。資訊傳送原理:將手動輸入字串資訊轉換成機器可以識別的位元組陣列,然後呼叫套接字的Send()方法將位元組陣列傳送出去
Linux下網路socket程式設計——實現伺服器(select)與多個客戶端通訊
Linux下網路socket程式設計——實現伺服器(select)與多個客戶端通訊 置頂 2017年06月23日 14:44:37 閱讀數:3225 標籤: socket程式設計伺服器與多個客戶端通epoll多路複用C語言網路程式設計 更多
socket ( java ) 簡單多個客戶端、服務端通訊(多執行緒)
實現: 客戶端:多個socket(多個埠),其中一個客戶端的一個埠用於接收服務端傳送過來的訊息,其一個用於向服務端傳送訊息。其它客戶端只有發訊息的功能。 服務端:兩個socket,一個用於迴圈接收客戶端傳送過來的socket請求。一個用於接收訊息手自動向客戶端
java網路程式設計(二)複用Socket連線以及使用多執行緒完成多個客戶端的連線
在前面的示例中,客戶端中建立了一次連線,只發送一次資料就關閉了,這就相當於撥打電話時,電話打通了只對話一次就關閉了,其實更加常用的應該是撥通一次電話以後多次對話,這就是複用客戶端連線。 那 麼如何實現建立一次連線,進行多次資料交換呢?其實很簡單,建立連線以後,
基於非阻塞socket的多執行緒伺服器的實現------一個伺服器如何與多個客戶端進行通訊?
我們首先來看服務端(涉及非阻塞socket和多執行緒): #include <stdio.h> #include <winsock2.h> #include <windows.h> #pragma comment(li
java網路程式設計:9、基於TCP的socket程式設計(二)伺服器端迴圈監聽接收多個客戶端_多執行緒伺服器程式
宣告:本教程不收取任何費用,歡迎轉載,尊重作者勞動成果,不得用於商業用途,侵權必究!!! 文章目錄 一、核心程式碼編寫 1、伺服器端程式的編寫 2、客戶端程式的編寫 3、測試列印輸出 二、系列文章(java網路程式設計) 上篇講了基於tcp的程式設計的一些基礎知識
Java Socket多個客戶端與伺服器通訊
client程式碼: package com.cqut.test4; import java.io.*; import java.net.Socket; import java.net.SocketException; import java.net.U
Unity中的Socket通訊(多個客戶端的非同步通訊)
using UnityEngine; using System; using System.Net; using System.Net.Sockets; using System.Collections; using System.Text; using System.Collections.Generic;
C++ Socket 一個伺服器 多個客戶端 (阻塞式)
服務端 ServerNet.h #pragma once #include <stdio.h> #include <winsock.h> #include<vector> #include<iterator>
C# Socket簡單例子(伺服器與多個客戶端通訊)
這個例子只是簡單實現瞭如何使用 Socket 類實現面向連線的通訊。 注意:此例子的目的只是為了說明用套接字寫程式的大概思路,而不是實際專案中的使用程式。在這個例子中,實際上還有很多問題沒有解決,如訊息邊界問題、埠號是否被佔用、訊息命令的解析問題等。。 下面是兩個
C++ Socket網路通訊實現一個伺服器端和多個客戶端的通訊
一 描述1 採用C++語言 2 編譯環境是code::blocks 3 使用的是非阻塞套接字 二 功能描述1 一個伺服器對多個客戶端 2 伺服器端主要負責處理資料的輸入併發送,具體是通過傳送指令向其指定的客戶端傳送資料,傳送接收指令讀取其指定的客戶端傳送的資料 3 客戶端的