夜光序言:
天空忽然飘起了雨,又是如昨日一般的轻盈细雨,一点点地洗刷了他脸上的血迹,露出他清扬俊美的眉眼,一如曾经,他潇洒不羁含笑,纵马飞驰,一如曾经,他少年风流,衣袂轻扬
正文:
package com.Genius.TcpIp;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Enumeration;
import java.util.Vector;
import com.sun.xml.internal.ws.handler.ServerLogicalHandlerTube;
//夜光:这里,我们实验一下socket编程
//Socket用于对IP地址和端口进行绑定
//通常也称为"套接字"
//实现与其他主机之间进行通信
//可以使应用程序向网络发出请求或者是接受网络请求
public class Demo03 {
//使用socket类来建立连接
//首先要在服务端指定一个用来等待连接的端口
//创建一个ServerSocket示例
public Demo03(int port) throws IOException{
//夜光:构造函数,参数为端口号
ServerSocket server = new ServerSocket(port);
//不断循环接收客户端的连接
//创建ServerSocket
while(true){
Socket conn = server.accept();
//监听客户端的连接
//将服务端的输入流封装到DataInputStream类中
//该类支持与机器无关的编码方式
DataInputStream in = new DataInputStream(
conn.getInputStream());
String who = in.readUTF();
//读取用户信息
System.out.println("Client"
+"(IP:"+conn.getInetAddress()
+")"+who+"enter!"+"\n");
//每次监听到连接请求就创建一个线程
ServerHander cn = new ServerHander(who,conn);
//对该连接创建一个线程
cn.start(); //启动该线程
}
}
public static void main(String args[]) throws IOException{
new Demo03(9001);
}
}
class ServerHander extends Thread{
Socket socket;
DataInputStream in;
DataOutputStream out;
//数据输出流~~
String who;
//保存所有客户端对象
protected static Vector<ServerHander> clientlist =
new Vector<ServerHander>();
public ServerHander(String name,Socket socket)throws IOException
//构造函数~~
{
this.who = name;
this.socket = socket;
in = new DataInputStream(new
BufferedInputStream(socket.getInputStream()));
out = new DataOutputStream(new
BufferedOutputStream(socket.getOutputStream()
));
}
public void run(){
try{
clientlist.addElement(this);
sendallclient("欢迎"+who
+"进入聊天室");
//发送新客户进入消息给客户
//无线循环
while(true)
{
String msg = in.readUTF();
sendallclient(who+"说:"
+msg);
//夜光:将输入信息发送给所有人
}
}catch(IOException e)
{
System.out.println("Client exit or error.");
}
finally
{
clientlist.removeElement(this);
//夜光:清除存放客户端的向量
sendallclient(who+"退出!");
try
{
socket.close();
}
catch(IOException ex)
{
System.out.println(""
+ "connection has"
+ "been closed");
}
}
}
protected static void sendallclient(String msg) {
// 夜光:我们再写一个方法嗯
synchronized (clientlist) {
//获得vector的枚举对象
Enumeration<ServerHander> allclients
= clientlist.elements();
//遍历访问每个客户端对象
while(allclients.hasMoreElements())
{
ServerHander serh =
(ServerHander)allclients.nextElement();
try{
serh.out.writeUTF(msg);
serh.out.flush();
}catch(IOException exc)
{
serh.interrupt();
}
}
}
}
}