java socket编程

java socket编程

在这里主要介绍tcp协议,tcp协议需要熟悉的两个类分别是socket和serverSocket,掌握了这两个类中常用的方法,结合线程和流的知识,我们就可以进行socket编程啦,下面是一个比较经典的例子。
需求 : 实现服务端给多个客户端发送图片并统计下载的人数(重复ip不算)

服务器端程序代码实现如下所示

public class ImageServer implements Runnable{
    private Socket socket;
    //hashset集合用于统计人数,因为hashset集合不能存储重复元素,所以刚好合适
    //如果使用继承方式实现多线程,必须声明为静态才能被共享,推荐使用实现接口的方式实现多线程
    HashSet<String> ips = new HashSet<String>();
    public ImageServer(Socket socket){
        this.socket = socket;
    }

    public static void main(String[] args) {
        try {
            //建立tcp服务端,给定端口号,必须和客户端一致,服务端需要始终保持开启的状态
            ServerSocket server = new ServerSocket(9090);
            while(true){
                //不断接受客户端连接
                Socket socket = server.accept();
                //一个用户分配一个线程
                ImageServer imageServer = new ImageServer(socket);
                new Thread(imageServer).start();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    public void run() {
        try {
            //获取客户端的输出流对象
            OutputStream outputStream = socket.getOutputStream();
            //创建一个图片文件的输入流读取文件
            FileInputStream fileInputStream = new FileInputStream("C://Users//Public//Pictures//Sample Pictures//6630231037350038151.jpg");
            //自定义字节数组,接收图片信息并写出
            byte[] buf = new byte[1024];
            int length = 0;
            while((length = fileInputStream.read(buf)) != -1){
                outputStream.write(buf,0,length);
            }
            //获取下载用户的ip
            String ip = socket.getInetAddress().getHostAddress();
            if(ips.add(ip)){
                System.out.println(ip+"成功下载,当前下载的人数是"+ips.size());
            }
            //关闭资源(先进后关)
            fileInputStream.close();
            //关闭客户端资源
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

服务端的代码就写完了,整体还是比较基础的,需要对io,thread以及socket有较好的理解,这三个大块都是java基础中比较重要的部分。客户端的代码之后会解析上传。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值