最近一直在弄socket的通信,在网上也看了很多例子,在这里,想把自己学的给记录下来
首先我们要创建服务器端的程序
创建ServerListener类继承 Thread类 这样我们可以避免堵塞主线程,专门有个线程来等待客户端的连接
public void run() {
int id = 0;
try{
ServerSocket serversocket=new ServerSocket(12345);//监听12345端口
while(true){
Socket socket=serversocket.accept();
chatSocket cs=new chatSocket(socket);
cs.start();//一旦客户端连接上了 重启一个线程来连接客户端客户端
chatManager.getchatManager().add(cs);//将客户端线程加入管理器中
}
}catch(IOException e){
e.printStackTrace();
}
}
创建chatSocket类继承Thread类,每当有新的线程连接上,就创建一个chatSocket的实例,chatSocket类中,有读写功能
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
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 (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
客户端线程管理类chatManager类,管理所有的线程
private static final chatManager cm=new chatManager();
public static chatManager getchatManager(){
return cm;
}
Vector<chatSocket> vector=new Vector<chatSocket>();//创建实现自动增长的对象数组vector
public void add(chatSocket cs){
vector.add(cs);//将线程加入到管理器中
}
public void publish(chatSocket cs,String out){
for(int i=0;i<vector.size();i++){//遍历vector数组
chatSocket cschatSocket=vector.get(i);
if(!cs.equals(cschatSocket)){//判断数组是否为本身
cschatSocket.out(out);//向每个数组输出字符串
}
}
}
以上就是聊天室服务器端的实现了,我们可以用telnet 去连接服务器,也可以写其他模式的客户端去连接