Java 网络通信(TCP/UDP)
1.InetAdress类 与 Socket类
>InetAdress
>Socket
2.TCP/IP协议簇
客户端:
- 创建 Socket:根据指定服务端的 IP 地址或端口号构造 Socket 类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。
- 打开连接到 Socket 的输入/出流: 使用 getInputStream()方法获得输入流,使用 getOutputStream()方法获得输出流,进行数据传输
- 按照一定的协议对 Socket 进行读/写操作:通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线程。
- 关闭 Socket:断开客户端到服务器的连接,释放线路
服务器端:
public class TestTCP3 { @Test public void client()throws Exception{ //1.创建Socket的对象 Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9898); //2.从本地获取一个文件发送给服务端 OutputStream os = socket.getOutputStream(); FileInputStream fis = new FileInputStream(new File("1.jpg")); byte[] b = new byte[1024]; int len; while((len = fis.read(b)) != -1){ os.write(b,0,len); } socket.shutdownOutput();//告知服务器端传送完毕 //3.接收来自于服务端的信息 InputStream is = socket.getInputStream(); byte[] b1 = new byte[1024]; int len1; while((len1 = is.read(b1)) != -1){ String str = new String(b1,0,len1); System.out.print(str); } //4.关闭相应的流和Socket对象 is.close(); os.close(); fis.close(); socket.close(); } @Test public void server() throws Exception{ //1.创建一个ServerSocket的对象 ServerSocket ss = new ServerSocket(9898); //2.调用其accept()方法,返回一个Socket的对象 Socket s = ss.accept(); //3.将从客户端发送来的信息保存到本地 InputStream is = s.getInputStream(); FileOutputStream fos = new FileOutputStream(new File("3.jpg")); byte[] b = new byte[1024]; int len; while((len = is.read(b)) != -1){ fos.write(b, 0, len); } System.out.println("收到来自于" + s.getInetAddress().getHostAddress() + "的文件"); //4.发送"接收成功"的信息反馈给客户端 OutputStream os = s.getOutputStream(); os.write("你发送的图片我已接收成功!".getBytes()); //5.关闭相应的流和Socket及ServerSocket的对象 os.close(); fos.close(); is.close(); s.close(); ss.close(); } }
3.UDP网络通信
- 调用 ServerSocket(int port) :创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求。
- 调用 accept():监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象。
- 调用 该Socket类对象的 getOutputStream() 和 getInputStream ():获取输出流和输入流,开始网络数据的发送和接收。
- 关闭ServerSocket和Socket对象:客户端访问结束,关闭通信套接字。
//UDP编程的实现 public class TestUDP { // 发送端 @Test public void send() { DatagramSocket ds = null; try { ds = new DatagramSocket(); byte[] b = "你好,我是要发送的数据".getBytes(); //创建一个数据报:每一个数据报不能大于64k,都记录着数据信息,发送端的IP、端口号,以及要发送到 //的接收端的IP、端口号。 DatagramPacket pack = new DatagramPacket(b, 0, b.length, InetAddress.getByName("127.0.0.1"), 9090); ds.send(pack); }catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(ds != null){ ds.close(); } } } // 接收端 @Test public void rceive() { DatagramSocket ds = null; try { ds = new DatagramSocket(9090); byte[] b = new byte[1024]; DatagramPacket pack = new DatagramPacket(b, 0, b.length); ds.receive(pack); String str = new String(pack.getData(), 0, pack.getLength()); System.out.println(str); }catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(ds != null){ ds.close(); } } } }
附上http请求:
l URL的方法 openStream():能从网络上读取数据
l 若希望输出数据,例如向服务器端的 CGI (公共网关接口-Common Gateway Interface-的简称,是用户浏览器和服务器端的应用程序进行连接的接口)程序发送一些数据,则必须先与URL建立连接,然后才能对其进行读写,此时需要使用 URLConnection 。
l URLConnection:表示到URL所引用的远程对象的连接。当与一个URL建立连接时,首先要在一个 URL 对象上通过方法 openConnection() 生成对应的 URLConnection 对象。如果连接过程失败,将产生IOException.
- URL netchinaren = new URL ("http://www.atguigu.com/index.shtml");
- URLConnectonn u = netchinaren.openConnection( );