于2017/4/5復(fù)習(xí)學(xué)習(xí)的java - Socket網(wǎng)絡(luò)編程.
本次完成的是網(wǎng)絡(luò)聊天編程功能(沒有GUI).我想要實現(xiàn)多人在線聊天的功能呢,所以在ServerListener和ChatSocket類當(dāng)中運用了多線程的技術(shù)extends Thread;
思路是首先得要一個ServerListener類(服務(wù)監(jiān)聽lei類)來進(jìn)行以下的功能:
1.服務(wù)器端口的創(chuàng)建。(相當(dāng)于對此端口進(jìn)行監(jiān)聽)
2.接收客戶端發(fā)送的請求诵叁。Socket socket = serverSocket.accept();
3.建立鏈接啸如。
package com.wyt.main;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerListener extends Thread
{
public void run()
{
try
{
//在12345端口建立網(wǎng)絡(luò)服務(wù)套接字
ServerSocket serverSocket = new ServerSocket(12345);
//服務(wù)器一直打開一直接收客戶端發(fā)送過來的請求
while(true)
{
Socket socket = serverSocket.accept();
System.out.println("端口鏈接成功");
//添加一個聊天客戶端--->聊天客戶端管理類里面
ChatSocket cs = new ChatSocket(socket);
cs.start();
ChatManager.getChatManager().add(cs);
}
}
catch(Exception e)
{
}
}
}
然后我的思路是建立一個聊天的客戶端類來封裝聊天客戶向服務(wù)器發(fā)送請求.所以里面有一個成員Socket socket來對應(yīng)相應(yīng)的客戶椿胯。此ChatSocket類我想要實現(xiàn)以下的功能
1.讀取客戶所寫的文字烤黍。
2.向所有其它的客戶發(fā)送自己的消息。
package com.wyt.main;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;
public class ChatSocket extends Thread
{
Socket socket;
public ChatSocket(Socket s)
{
this.socket = s;
}
//此方法運用IO流進(jìn)行傳輸量瓜,從而實現(xiàn)聊天交流的功能
public void out(String out)
{
try
{
socket.getOutputStream().write(out.getBytes("UTF-8"));
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void run()
{
try
{
BufferedReader br = new BufferedReader(
new InputStreamReader(
socket.getInputStream(), "UTF-8"));
String line = null;
while((line = br.readLine())!= null)
{
ChatManager.getChatManager().publish(this,line);
}
br.close();
}
catch(Exception e)
{
}
}
}
由于想要實現(xiàn)的是多人在線聊天,所以預(yù)設(shè)有很多ChatSocket客戶向ServerListener服務(wù)端口發(fā)送請求侥猩,為了便于其管理所以設(shè)計了ChatManager類.
此類設(shè)計特點:
由于管理的特殊性榔至,所以只能有一個管理,即運用單例設(shè)計模式欺劳。構(gòu)造函數(shù)私有化唧取,在其類中用static final 提前創(chuàng)建一個ChatManager對象,想要取得該管理器使用getChatManager()來進(jìn)行划提。 運用Vector<> ... = new Vector<>();來進(jìn)行裝載所有的ChatSokcet客戶枫弟。
實現(xiàn)了以下功能:
1.接收發(fā)消息的客戶端,并向其它客戶發(fā)送此消息(ChatSocket cs , String out);
package com.wyt.main;
import java.util.Vector;
public class ChatManager
{
private ChatManager(){}
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 publish(ChatSocket cs,String out)
{
for(int i = 0; i<vector.size();i++)
{
ChatSocket cSocket = vector.get(i);
if(!cSocket.equals(cs))
{
cSocket.out(out);
}
}
}
}