博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java网络编程
阅读量:4097 次
发布时间:2019-05-25

本文共 4485 字,大约阅读时间需要 14 分钟。

Java网络编程

Java的网络编程主要涉及到的内容是Socket编程,那么什么是Socket呢?简单地说,Socket,套接字,就是两台主机之间逻辑连接的端点。TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。Socket,本质上就是一组接口,是对TCP/IP协议的封装和应用(程序员层面上)。

整体流程

Socket编程主要涉及到客户端和服务器端两个方面,首先是在服务器端创建一个服务器套接字(ServerSocket),并把它附加到一个端口上,服务器从这个端口监听连接。端口号的范围是0到65536,但是0到1024是为特权服务保留的端口号,我们可以选择任意一个当前没有被其他进程使用的端口。

客户端请求与服务器进行连接的时候,根据服务器的域名或者IP地址,加上端口号,打开一个套接字。当服务器接受连接后,服务器和客户端之间的通信就像输入输出流一样进行操作。

 

实例一

下面是一个客户端和服务器端进行数据交互的简单例子,客户端输入正方形的边长,服务器端接收到后计算面积并返回给客户端,通过这个例子可以初步对Socket编程有个把握。

  • 服务器端
public class SocketServer {    public static void main(String[] args) throws IOException {        // 端口号        int port = 7000;        // 在端口上创建一个服务器套接字        ServerSocket serverSocket = new ServerSocket(port);        // 监听来自客户端的连接        Socket socket = serverSocket.accept();        DataInputStream dis = new DataInputStream(                new BufferedInputStream(socket.getInputStream()));        DataOutputStream dos = new DataOutputStream(                new BufferedOutputStream(socket.getOutputStream()));        do {            double length = dis.readDouble();            System.out.println("服务器端收到的边长数据为:" + length);            double result = length * length;            dos.writeDouble(result);            dos.flush();        } while (dis.readInt() != 0);        socket.close();        serverSocket.close();    }}
  • 客户端
public class SocketClient {    public static void main(String[] args) throws UnknownHostException, IOException {        int port = 7000;        String host = "localhost";        // 创建一个套接字并将其连接到指定端口号        Socket socket = new Socket(host, port);        DataInputStream dis = new DataInputStream(                new BufferedInputStream(socket.getInputStream()));        DataOutputStream dos = new DataOutputStream(                new BufferedOutputStream(socket.getOutputStream()));        Scanner sc = new Scanner(System.in);        boolean flag = false;        while (!flag) {            System.out.println("请输入正方形的边长:");            double length = sc.nextDouble();            dos.writeDouble(length);            dos.flush();            double area = dis.readDouble();            System.out.println("服务器返回的计算面积为:" + area);            while (true) {                System.out.println("继续计算?(Y/N)");                String str = sc.next();                if (str.equalsIgnoreCase("N")) {                    dos.writeInt(0);                    dos.flush();                    flag = true;                    break;                } else if (str.equalsIgnoreCase("Y")) {                    dos.writeInt(1);                    dos.flush();                    break;                }            }        }        socket.close();    }}

实例二

可以看到上面的服务器端程序和客户端程序是一对一的关系,为了能让一个服务器端程序能同时为多个客户提供服务,可以使用多线程机制,每个客户端的请求都由一个独立的线程进行处理。下面是改写后的服务器端程序。

public class SocketServerM {    public static void main(String[] args) throws IOException {        int port = 7000;        int clientNo = 1;        ServerSocket serverSocket = new ServerSocket(port);        // 创建线程池        ExecutorService exec = Executors.newCachedThreadPool();        try {            while (true) {                Socket socket = serverSocket.accept();                exec.execute(new SingleServer(socket, clientNo));                clientNo++;            }        } finally {            serverSocket.close();        }    }}class SingleServer implements Runnable {    private Socket socket;    private int clientNo;    public SingleServer(Socket socket, int clientNo) {        this.socket = socket;        this.clientNo = clientNo;    }    @Override    public void run() {        try {            DataInputStream dis = new DataInputStream(                    new BufferedInputStream(socket.getInputStream()));            DataOutputStream dos = new DataOutputStream(                    new BufferedOutputStream(socket.getOutputStream()));            do {                double length = dis.readDouble();                System.out.println("从客户端" + clientNo + "接收到的边长数据为:" + length);                double result = length * length;                dos.writeDouble(result);                dos.flush();            } while (dis.readInt() != 0);        } catch (IOException e) {            e.printStackTrace();        } finally {            System.out.println("与客户端" + clientNo + "通信结束");            try {                socket.close();            } catch (IOException e) {                e.printStackTrace();            }        }    }}

上面改进后的服务器端代码可以支持不断地并发响应网络中的客户请求。关键的地方在于多线程机制的运用,同时利用线程池可以改善服务器程序的性能。

转载地址:http://iklii.baihongyu.com/

你可能感兴趣的文章
Windows 窗口底层原理
查看>>
一种函数指针的运用
查看>>
Win32程序之进程的原理
查看>>
C++虚函数原理
查看>>
MySQL的索引
查看>>
今天,Python信息量很大!
查看>>
Flash 已死,Deno 当立?
查看>>
编程差的程序员,90%都是吃了数学的亏!骨灰级开发:方法不对,努力也白费...
查看>>
编程差的程序员,90%都是吃了数学的亏!骨灰级开发:方法不对,努力也白费...
查看>>
都无代码了,还要程序员吗?
查看>>
程序员:凭自己能力吃饭,有什么理由瞧不起?
查看>>
面试想拿 10K,HR 说我只配7k?
查看>>
副业过万的程序员都知道的网站有哪些
查看>>
那些人生“开挂”的程序员,都在干什么?
查看>>
影响科学圈的那些计算机代码
查看>>
乐视视频 App 图标改为“欠 122 亿”,网友:我在别家分红包,却在你家随份子!...
查看>>
乔布斯18岁求职信拍卖价22.24万美元,值吗?
查看>>
为何程序员总喜欢写技术博客,看完恍然大悟...
查看>>
假如计算机是中国人发明的,那代码应该这么写
查看>>
科技公司最爱的 50 款开源工具,你都用过吗?
查看>>