Java提供了非常易用的网络API,调用这些API我们可以很方便的通过建立TCP/IP或UDP套接字,在网络之间进行相互通信,其中TCP要比UDP更加常用
Java TCP网络基础
通常情况下,客户端打开一个连接到服务器端的TCP/IP连接,然后客户端开始与服务器之间通信,当通信结束后客户端关闭连接,过程如下图所示:
Java中Socket类和ServerSocket类
当客户端想要打开一个连接到服务器的TCP/IP连接时,就要使用到Java Socket类。socket类只需要被告知连接的IP地址和TCP端口,其余的都有Java实现。
public void scoketTest () throws UnknownHostException, IOException{ //创建Socket Socket so = new Socket("192.168.200.13",80); //Socket发送数据,要通过Socket发送数据,我们需要获取Socket的输出流(OutputStream) OutputStream out= so.getOutputStream(); out.write("nihao".getBytes()); /** * 想要通过网络将数据发送到服务器端,一定不要忘记调用flush()方法。 * 操作系统底层的TCP/IP实现会先将数据放入一个更大的数据缓存块中,而缓存块的大小是与TCP/IP的数据包大小相适应的 * 调用flush()方法只是将数据写入操作系统缓存中,并不保证数据会立即发送 */ out.flush(); out.close(); //Socket读取数据,从Socket中读取数据,我们就需要获取Socket的输入流(InputStream) InputStream in=so.getInputStream(); in.read(); /** * 从Socket的输入流中读取数据并不能读取文件那样,一直调用read()方法直到返回-1为止 * 因为对Socket而言,只有当服务端关闭连接时,Socket的输入流才会返回-1 * 而是事实上服务器并不会不停地关闭连接,假设我们想要通过一个连接发送多个请求,那么在这种情况下关闭连接就显得非常愚蠢。 */ in.close(); //关闭Socket,当使用完Socket后我们必须将Socket关闭,断开与服务器之间的连接。 so.close(); }
假如我们想要打开一个监听服务,来监听客户端连接某些指定TCP端口的连接,那就需要使用Java ServerSocket类。当客户端通过Socket连接服务器端的ServerSocket监听时,服务器端会指定这个连接的一个Socket,此时客户端与服务器端间的通信就变成Socket与Socket之间的通信。
public void serverSocket () throws IOException{ //创建ServerSocket类来监听9000端口 ServerSocket serverSocket = new ServerSocket(9000); //监听请求的连接,要获取请求的连接需要用ServerSocket.accept()方法。该方法返回一个Socket类,该类具有普通java Socket类的所有特性 Socket so = serverSocket.accept(); //关闭客户端Socket so.close(); //关闭服务端Sockets,要关闭服务的时候需要关掉 ServerSocket连接。 serverSocket.close(); }
在java.net包中包含两个有趣的类:URL类和URLConnection类。这两个类可以用来创建客户端到web服务器(HTTP服务器)的连接
public void urlTest() throws IOException { URL url = new URL("http://www.baidu.com"); URLConnection connection =url.openConnection(); InputStream in= connection.getInputStream(); int data = in.read(); while (data!=-1) { System.out.println((char)data); data = in.read(); } in.close(); /** * 默认情况下URLConnection发送一个HTTP GET请求到web服务器。 * 如果你想发送一个HTTP POST请求,要调用URLConnection.setDoOutput(true)方法 * 一旦你调用了setDoOutput(true),你就可以打开URLConnection的OutputStream */ connection.setDoOutput(true); OutputStream out= connection.getOutputStream(); //TODO }
URL类打开一个本地文件系统文件
private void urlReadFileTest() throws Exception { /** * URL也被叫做统一资源定位符。如果你的代码不关心文件是来自网络还是来自本地文件系统,URL类是另外一种打开文件的方式 * 这和通过HTTP访问一个web服务器上的文件的唯一不同处就是URL:"file:/c:/data/test.txt" */ URL url = new URL("file:/c:/data/test.txt"); URLConnection urlConnection = url.openConnection(); InputStream input = urlConnection.getInputStream(); int data = input.read(); while(data != -1){ System.out.print((char) data); data = input.read(); } input.close(); }
时间: 2024-10-28 20:47:46