java socket编程

来源:互联网 发布:淘宝上怎么购买呼死你 编辑:程序博客网 时间:2024/03/29 14:05

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基础中比较重要的部分。客户端的代码之后会解析上传。

原创粉丝点击