Eclipse开发工具
ServerSocket类主要用在服务器端程序的开发,用于接收客户端的连接请求。ServerSocket类的常用方法有:构造方法ServerSocket(int port)用于构建ServerSocket实例,并指定监听端口,accept()方法用于等待客户端的连接,在此方法连接之前一直处于阻塞状态,close()方法用于关闭ServerSocket的连接。下图为Service服务端的代码,用于接收客户端的请求,并向客户端发送数据。
客户端Socket类的常用方法有:Socket(String host, int port)用于构造Socket对象,同时指定要连接服务器的主机名称及连接端口号,getInputStream()获取套接字的输入流,getOutoutStream()获取套接字的输出流,close()关闭Socket。下图为Client客户端,用于接收服务器端发送的数据并打印输出。
我们在客户端使用客户端的输出流向服务器端写数据,在传输完成后关闭Socket连接。在网络编程中主要使用输入和输出流传输数据,注意此处用的是字节流。
我们在服务器端使用输入流InputStream读取客户端发送的数据,获取的是字节数组,因此需要转换为String字符串,再打印输出。
以上我们使用的是字节流进行操作,在服务端我们使用字节流到字符流的转换流InputStreamReader,将字节流包装成字符流,再用BufferedReader缓存流包装,br.readLine()方法用于读取一整行数据。同时使用PrintStream的println()方法将字符写出并换行,用于写数据到服务端。
客户端的写法同服务端,在数据传输完成后,需要关闭客户端的Socket。注意此时流不用单独关闭,因为在socket.close()方法关闭socket时就已经被关闭了。
上述步骤已经完成了客户端和服务端通信的操作,但是现有的程序有一个严重的问题,那就是服务器端只能连接一个客户端,属于单线程的处理机制。如果有一个客户端连接后,其他客户端便不能连接,只能等待服务端空白时才连接。因此,我们在服务端加入多线程的机制,每个客户端连接后便启动一个新的线程,我们使用while(true)来不停的接收,使用匿名内部类的方式来创建Thread线程对象,并覆写实现run()方法,如下图所示。
如果想要多个客户端连接同一个服务器需要在服务端使用多线程机制