java搭建聊天服务器_使用 ServerSocket 建立聊天服务器-2
1.
從serverListener中可以看出,每一個客戶端創建新的請求之后,都會把它分配給一個獨立的chatsocket ,但是每一個ChatSocket都是相互獨立的,他們之間并不能溝通,所以要新建一個類,將這些新建的線程管理起來,然后實現他們之間的相互通信.(類似于微信加群聊天的功能)
由于一個聊天服務器只有一個管理者,所以創建chatManager.java管理類,需要對類做單例化的處理
===================================================================
1.項目截圖
2.ChatManager.java
package com.nantian.socket;
import java.util.Vector;
public class ChatManager {
/**
* 由于一個聊天服務器只有一個管理者,所以創建chatManager.java管理類,需要對類做單例化的處理
*/
//單例化第一步,需要構造private的構造方法
private ChatManager() {}
//為當前類創建實例
private static final ChatManager cm=new ChatManager();
public static ChatManager getChatManager() {
return cm;
}
//===========以上代碼完成了單例化的操作
Vector vector=new Vector();
//為當前類添加一個新的chatSocket
public void add(ChatSocket cs) {
vector.add(cs);
}
//還需實現一個方法,實現其中一個線程調用下面的方法向其他客戶端發送信息
//ChatSocket cs(當前線程),String out(發送的信息)
public void publish(ChatSocket cs,String out) {
//發送給所有線程,需要對集合中的線程進行遍歷
for (int i = 0; i < vector.size(); i++) {
//獲取循環中的第i個對象
ChatSocket csChatSocket=vector.get(i);
//當前發送的線程沒必要接收這條信息
//如果等于當前發送對象的話,就不執行發送消息
if (!cs.equals(csChatSocket)) {
//調用out()方法將字符串out傳輸出去
csChatSocket.Out(out);
}
}
}
}
===================================================================
2.ChatSocket.java
package com.nantian.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 socket;
/**
* 創建構造方法
*/
public ChatSocket(Socket s) {
this.socket=s;
}
/**
* 運行MyServerSocket類后,沒有值輸出后所寫的方法
* @param out
*/
public void Out(String out) {
try {
socket.getOutputStream().write(out.getBytes("UTF-8"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 復寫run方法,執行后臺的功能
*/
@Override
public void run() {
//將socket的輸入流進行包裝
try {
BufferedReader br=
new BufferedReader(
new InputStreamReader(
socket.getInputStream(),"UTF-8"));
//創建本地對象
String line=null;
while ((line=br.readLine())!=null) {
//聊天室中的所有信息發送給所有人,需要調用publish()方法
//將自己傳入使用this
ChatManager.getChatManager().publish(this, line);
}
//while循環結束,需要將當前的流關閉
br.close();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
===================================================================
3.MyServerSocket.java
package com.nantian.socket;
//ctrl+shift+o刪除多余的jar包
public class MyServerSocket {
public static void main(String[] args) {
new ServerListener().start();
}
}
===================================================================
4.ServerListener.java
package com.nantian.socket;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JOptionPane;
public class ServerListener extends Thread{
@Override
public void run() {
try {
//port取值范圍:1-65535(通常取值較大,這樣可以和系統的分開)
ServerSocket serverSocket=new ServerSocket(12345);
//循環監聽來自客戶端的連接
while(true) {
//監聽客戶端的連接
//accept()為一個阻塞的方法,會阻塞當前的線程
//ServerSocket的accept()方法是偵聽并接受到此套接字的連接,
//就是一直等待連接,此方法在連接傳入之前一直阻塞。直到接受到有socket的連接。
//故創建ServerLIstener extends Thread
Socket socket=serverSocket.accept();
//建立連接
JOptionPane.showMessageDialog(null, "有客戶端連接到了本機的12345端口");
//因為每一個Socket要與客戶端獨立的通信,所以socket需要另起一個線程
//將socket傳遞給新的線程,用于socket通信,故創建ChatSocket extends Thread
ChatSocket cs=new ChatSocket(socket);
cs.start();
//將cs添加到聊天管理器中
ChatManager.getChatManager().add(cs);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
===================================================================
5.run as -->java application
cmd,輸入telnet localhost 12345,截圖如下
總結
以上是生活随笔為你收集整理的java搭建聊天服务器_使用 ServerSocket 建立聊天服务器-2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab小波三维图,matlab小波
- 下一篇: 用php实现登录日志,利用Laravel