C/S(socket、執行緒 實現多個客戶端、伺服器端簡易通訊)
(要不要考慮點個贊!)
(第一篇部落格,滿懷激動寫下來的,可能調理不清楚,望理解)
首先是大概的結構框架:
一、客戶端詳解
客戶端的socket需要ip號:127.0.0.1,埠號:選大點1234。
實現通訊需要兩個方法:一個是寫入操作、一個是讀出操作。在例項化socket後,利用socket的inputStream和outputStream方法實現兩種操作。注意inputStream的方法需要封裝inputStreamReader到BufferedReader(其他也行)裡面。
下面附上原始碼:(因其中有一些加了雙斜線的程式碼可以忽略,是我在測試的時候用來看情況的,註釋沒有問題)
ChatClient.java:
package client; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; public class ChatClient { public BufferedWriter outTo; public String IP; public ChatClient(String ip) { this.IP = ip; // TODO Auto-generated constructor stub } Socket client; public void connect() { // String IP = "192.168.1.124"; new Thread() { @Override public void run() { try { client = new Socket(IP,1234); System.out.println("遠端主機地址:"+client.getRemoteSocketAddress()); //輸出伺服器端的內容 BufferedReader br = new BufferedReader( new InputStreamReader(client.getInputStream(),"UTF-8")); String line = null; while((line = br.readLine())!=null) { System.out.println(line); } String outString = "{'age':22,'sex':'男','userName':'xiapi'}"; send(outString); br.close(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }.start(); } public void send(String outString) throws IOException { client.getOutputStream() .write((outString+"\n").getBytes("UTF-8")); } }
_______________________________________________________________________
Chat_Test.java
package client;
import java.io.IOException;
import java.util.Scanner;
public class Chat_Test {
public Chat_Test() {
// TODO Auto-generated constructor stub
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String IP = "127.0.0.1";
ChatClient chatdemo = new ChatClient(IP);
chatdemo.connect();
String str = null;
Scanner in = new Scanner(System.in);
while (true) {
try {
str = in.nextLine();
chatdemo.send(str);
} catch (IOException e) {
e.printStackTrace();
}
}
// String s = "{'age':22,'sex':'男','userName':'xiapi'}";
// chatdemo.send(s);
}
}
二、伺服器端詳解:
伺服器端需要一個測試類、一個執行緒管理類、一個執行緒監聽類、一個執行緒類
伺服器端需要例項化serversocket,需要相同的埠。需要相同的inputStream、outpStream。不過相對於客戶端的out、伺服器是相應的input。
程式碼中使用了執行緒。ChatManager.Java是管理所有的連線執行緒的。並將所有的資訊傳送到其他連線了的客戶端。(eclipse中多開幾個控制檯可以測試)。chatSocket中,迴圈監聽所有的請求,請求成功就新增到執行緒管理類中。並時刻進行執行緒的資訊傳輸。
附上原始碼:
ChatManager.java
package socket;
import java.util.Vector;
/*
* 要實現每個客戶端之間的通訊,則需要定義一個ChatManager來進行管理
* */
public class ChatManager {
private ChatManager() {
// TODO Auto-generated constructor stub
}
private static final ChatManager cm = new ChatManager();
public static ChatManager getChatManager() {
return cm;
}
Vector<ChatSocket> vector = new Vector<ChatSocket>();
public void add(ChatSocket cs) {
vector.add(cs);//將每一個執行緒加入集合中
}
public void remove(ChatSocket cs) {
vector.remove(cs);
}
public void giveToAll(ChatSocket cs , String chatinfo){
//要給集合中所有的執行緒傳送資訊就必須遍歷這個集合
for(int i=0; i<vector.size();i++) {
ChatSocket csChatSocket = vector.get(i);
if(!csChatSocket.equals(cs)) {
csChatSocket.out(chatinfo);
}
}
}
}
—————————————————————————————————————
ChatSocket.java
package socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
public class ChatSocket extends Thread {
Socket socket;
public ChatSocket(Socket s) {
this.socket = s;
// TODO Auto-generated constructor stub
}
//返回給客戶端的一條已經連線到伺服器的資訊 to client
public void out(String out) {
try {
socket.getOutputStream().write((out+"\n").getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("已經斷開了一個客服端連線");
e.printStackTrace();
}
}
@Override
public void run() {
out("已經連線");// to client
try {
//from client
BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream(),"UTF-8"));
String line = null;
while((line = br.readLine())!=null) {
// 然後伺服器再將所有的資訊轉發給每一個客戶端,呼叫publish方法
ChatManager.
getChatManager().giveToAll(this, line);
System.out.println(line);
}
br.close();
// System.out.println("斷開了一個客戶端連結");
// ChatManager.getChatManager().remove(this);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
System.out.println("斷開了一個客戶端連結");
ChatManager.getChatManager().remove(this);
e.printStackTrace();
}
}
}
————————————————————————————————————————
ServerListener.java
package socket;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerListener extends Thread{
public ServerListener() {
// TODO Auto-generated constructor stub
}
@Override
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(1234);
while(true) {
Socket socket = serverSocket.accept();
ChatSocket cs = new ChatSocket(socket);
cs.start();
ChatManager.getChatManager().add(cs);
}
}catch(IOException e) {
e.printStackTrace();
}
}
}
————————————————————————————————————
ChatServer_Test.java
package test;
import socket.ServerListener;
public class ChatServer_Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
new ServerListener().start();
}
}
(轉載請註明出處,謝謝!!!)相關文章
- socket實現服務端多執行緒,客戶端重複輸入服務端執行緒客戶端
- java socket 通訊socketServer 服務端多執行緒JavaServer服務端執行緒
- Java多執行緒技術:實現多使用者服務端Socket通訊Java執行緒服務端
- TCP/UDP簡易通訊框架原始碼,支援輕鬆管理多個TCP服務端(客戶端)、UDP客戶端TCPUDP框架原始碼服務端客戶端
- 【Java】Java多執行緒實現的聊天客戶端和伺服器Java執行緒客戶端伺服器
- java多執行緒實現TCP網路Socket程式設計(C/S通訊)Java執行緒TCP程式設計
- C# 實現socket通訊程式(伺服器端)C#伺服器
- Socket最簡單的客戶端與服務端通訊-Java客戶端服務端Java
- TCP通訊客戶端和服務端簡單程式碼實現TCP客戶端服務端
- Go 實現簡易的 Redis 客戶端GoRedis客戶端
- 客戶端與服務端Socket通訊原理詳解客戶端服務端
- python實現兩臺不同主機之間進行通訊(客戶端和服務端)——SocketPython客戶端服務端
- Qt實現基於多執行緒的檔案傳輸(服務端,客戶端)QT執行緒服務端客戶端
- 實現客戶端與服務端的HTTP通訊客戶端服務端HTTP
- C語言透過socket實現TCP客戶端C語言TCP客戶端
- C++客戶端程式(socket)C++客戶端
- js 客戶端與伺服器端的通訊JS客戶端伺服器
- 如何用Java Socket實現一個簡單的Redis客戶端JavaRedis客戶端
- Golang 實現客戶端與伺服器端UDP協議連線通訊Golang客戶端伺服器UDP協議
- python實現douban.fm簡易客戶端Python客戶端
- C++程式碼實現一個簡易http服務端,返回給客戶端一張圖片C++HTTP服務端客戶端
- linux網路程式設計之用socket實現簡單客戶端和服務端的通訊(基於TCP)Linux程式設計客戶端服務端TCP
- 客戶端到伺服器端的通訊過程客戶端伺服器
- 求助:c#客戶端如何跟java伺服器通訊C#客戶端Java伺服器
- Linux下簡單的ACE socket客戶端和伺服器端Linux客戶端伺服器
- 2020-09-30Socket 一個伺服器監聽多個客戶端 功能實現伺服器客戶端
- JAVA - 基於Socket的多執行緒通訊Java執行緒
- Java review--NIO例項:實現服務端和客戶端的簡單通訊JavaView服務端客戶端
- zeroc ice 客戶端與服務端通訊例子(c++)客戶端服務端C++
- AgileEAS.NET SOA 中介軟體平臺.Net Socket通訊框架-簡單例子-實現簡單的服務端客戶端訊息應答框架單例服務端客戶端
- 【windows socket+TCP伺服器客戶端】WindowsTCP伺服器客戶端
- 【windows socket+UDP伺服器客戶端】WindowsUDP伺服器客戶端
- 【windows socket+HTTP伺服器客戶端】WindowsHTTP伺服器客戶端
- 客戶端到伺服器端的通訊過程及原理客戶端伺服器
- websocket(多個客戶端)Web客戶端
- C++實現客戶端與伺服器的通訊(二):Base64編解碼C++客戶端伺服器
- Linux網路程式設計之socket簡單通訊--客戶端程式碼Linux程式設計客戶端
- C#Socket伺服器與客戶端的開發(3)C#伺服器客戶端