Java提供了非常易用的网络API,调用这些API我们可以很方便的通过建立TCP/IP或UDP套接字,在网络之间进行相互通信,其中TCP要比UDP更加常用

Java TCP网络基础

通常情况下,客户端打开一个连接到服务器端的TCP/IP连接,然后客户端开始与服务器之间通信,当通信结束后客户端关闭连接,过程如下图所示:

java电网项目一般是什么 java 网络_TCP

 

 

 

 

 

 

 

 

 

 

 

 

JavaSocket类和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();
	}