夜光 带你走进 Java基础编程实战(二十 Socket编程)

夜光序言:

天空忽然飘起了雨,又是如昨日一般的轻盈细雨,一点点地洗刷了他脸上的血迹,露出他清扬俊美的眉眼,一如曾经,他潇洒不羁含笑,纵马飞驰,一如曾经,他少年风流,衣袂轻扬

 

正文:

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();
                }
            }
        }
        
    }


    
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值