于2017/4/5复习学习的java - Socket网络编程.
本次完成的是网络聊天编程功能(没有GUI).我想要实现多人在线聊天的功能呢,所以在ServerListener和ChatSocket类当中运用了多线程的技术extends Thread;
思路是首先得要一个ServerListener类(服务监听lei类)来进行以下的功能:
1.服务器端口的创建。(相当于对此端口进行监听)
2.接收客户端发送的请求。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端口建立网络服务套接字
ServerSocket serverSocket = new ServerSocket(12345);
//服务器一直打开一直接收客户端发送过来的请求
while(true)
{
Socket socket = serverSocket.accept();
System.out.println("端口链接成功");
//添加一个聊天客户端--->聊天客户端管理类里面
ChatSocket cs = new ChatSocket(socket);
cs.start();
ChatManager.getChatManager().add(cs);
}
}
catch(Exception e)
{
}
}
}
然后我的思路是建立一个聊天的客户端类来封装聊天客户向服务器发送请求.所以里面有一个成员Socket socket来对应相应的客户。此ChatSocket类我想要实现以下的功能
1.读取客户所写的文字。
2.向所有其它的客户发送自己的消息。
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流进行传输,从而实现聊天交流的功能
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)
{
}
}
}
由于想要实现的是多人在线聊天,所以预设有很多ChatSocket客户向ServerListener服务端口发送请求,为了便于其管理所以设计了ChatManager类.
此类设计特点:
由于管理的特殊性,所以只能有一个管理,即运用单例设计模式。构造函数私有化,在其类中用static final 提前创建一个ChatManager对象,想要取得该管理器使用getChatManager()来进行。 运用Vector<> ... = new Vector<>();来进行装载所有的ChatSokcet客户。
实现了以下功能:
1.接收发消息的客户端,并向其它客户发送此消息(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);
}
}
}
}